blob: 30554d541986e513ca02283a56710e9ede1a8383 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000035
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static PyObject *eval_code2(PyCodeObject *,
37 PyObject *, PyObject *,
38 PyObject **, int,
39 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000040 PyObject **, int,
41 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000042
Tim Peters5ca576e2001-06-18 22:08:13 +000043static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton512a2372001-04-11 13:52:29 +000044static char *get_func_name(PyObject *);
45static char *get_func_desc(PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000046static PyObject *call_object(PyObject *, PyObject *, PyObject *);
47static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
48static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
49static PyObject *call_method(PyObject *, PyObject *, PyObject *);
50static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
51static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
52static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
53static PyObject *do_call(PyObject *, PyObject ***, int, int);
54static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000055static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000056static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000057static PyObject *load_args(PyObject ***, int);
58#define CALL_FLAG_VAR 1
59#define CALL_FLAG_KW 2
60
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000063#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
65static int call_trace(PyObject **, PyObject **,
Fred Draked0838392001-06-16 21:02:31 +000066 PyFrameObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000067static PyObject *loop_subscript(PyObject *, PyObject *);
68static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
69static int assign_slice(PyObject *, PyObject *,
70 PyObject *, PyObject *);
71static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000072static PyObject *import_from(PyObject *, PyObject *);
73static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static PyObject *build_class(PyObject *, PyObject *, PyObject *);
75static int exec_statement(PyFrameObject *,
76 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000077static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
78static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000079static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000080
Paul Prescode68140d2000-08-30 20:25:01 +000081#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000082 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083#define GLOBAL_NAME_ERROR_MSG \
84 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000085#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000086 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000087#define UNBOUNDFREE_ERROR_MSG \
88 "free variable '%.200s' referenced before assignment" \
89 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000090
Guido van Rossum950361c1997-01-24 13:49:28 +000091/* Dynamic execution profile */
92#ifdef DYNAMIC_EXECUTION_PROFILE
93#ifdef DXPAIRS
94static long dxpairs[257][256];
95#define dxp dxpairs[256]
96#else
97static long dxp[256];
98#endif
99#endif
100
Fred Drake904aa7b2001-06-08 04:33:09 +0000101/* Cached interned string objects used for calling the profile and
102 * trace functions.
103 */
104static PyObject *str_call = NULL;
105static PyObject *str_exception = NULL;
106static PyObject *str_line = NULL;
107static PyObject *str_return = NULL;
108
109
Tim Peters5ca576e2001-06-18 22:08:13 +0000110staticforward PyTypeObject gentype;
111
112typedef struct {
113 PyObject_HEAD
114 PyFrameObject *frame;
115 int running; /* true if generator is being executed */
116} genobject;
117
118static PyObject *
119gen_new(PyFrameObject *f)
120{
121 genobject *gen = PyObject_New(genobject, &gentype);
122 if (gen == NULL) {
123 Py_DECREF(f);
124 return NULL;
125 }
126 gen->frame = f;
127 gen->running = 0;
128 return (PyObject *)gen;
129}
130
131static void
132gen_dealloc(genobject *gen)
133{
134 Py_DECREF(gen->frame);
135 PyObject_DEL(gen);
136}
137
138static PyObject *
139gen_iternext(genobject *gen)
140{
141 PyFrameObject *f = gen->frame;
142 PyObject *result;
143
144 if (gen->running) {
145 PyErr_SetString(PyExc_ValueError,
146 "generator already executing");
147 return NULL;
148 }
149 if (f->f_stackbottom == NULL) {
150 return NULL;
151 }
152 gen->running = 1;
153 result = eval_frame(f);
154 gen->running = 0;
155 return result;
156}
157
158static PyObject *
159gen_next(genobject *gen, PyObject *args)
160{
161 PyObject *result;
162
163 if (!PyArg_ParseTuple(args, ":next"))
164 return NULL;
165
166 result = gen_iternext(gen);
167
168 if (result == NULL && !PyErr_Occurred()) {
169 PyErr_SetObject(PyExc_StopIteration, Py_None);
170 return NULL;
171 }
172
173 return result;
174}
175
176static PyObject *
177gen_getiter(PyObject *gen)
178{
179 Py_INCREF(gen);
180 return gen;
181}
182
183static struct PyMethodDef gen_methods[] = {
184 {"next", (PyCFunction)gen_next, METH_VARARGS,
185 "next() -- get the next value, or raise StopIteration"},
186 {NULL, NULL} /* Sentinel */
187};
188
189static PyObject *
190gen_getattr(genobject *gen, char *name)
191{
192 return Py_FindMethod(gen_methods, (PyObject *)gen, name);
193}
194
195statichere PyTypeObject gentype = {
196 PyObject_HEAD_INIT(&PyType_Type)
197 0, /* ob_size */
198 "generator", /* tp_name */
199 sizeof(genobject), /* tp_basicsize */
200 0, /* tp_itemsize */
201 /* methods */
202 (destructor)gen_dealloc, /* tp_dealloc */
203 0, /* tp_print */
204 (getattrfunc)gen_getattr, /* tp_getattr */
205 0, /* tp_setattr */
206 0, /* tp_compare */
207 0, /* tp_repr */
208 0, /* tp_as_number */
209 0, /* tp_as_sequence */
210 0, /* tp_as_mapping */
211 0, /* tp_hash */
212 0, /* tp_call */
213 0, /* tp_str */
214 0, /* tp_getattro */
215 0, /* tp_setattro */
216 0, /* tp_as_buffer */
217 Py_TPFLAGS_DEFAULT, /* tp_flags */
218 0, /* tp_doc */
219 0, /* tp_traverse */
220 0, /* tp_clear */
221 0, /* tp_richcompare */
222 0, /* tp_weaklistoffset */
223 (getiterfunc)gen_getiter, /* tp_iter */
224 (iternextfunc)gen_iternext, /* tp_iternext */
225};
226
227
Guido van Rossume59214e1994-08-30 08:01:59 +0000228#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000229
Guido van Rossum2571cc81999-04-07 16:07:23 +0000230#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000231#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000232#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000233#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000234
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235extern int _PyThread_Started; /* Flag for Py_Exit */
236
Guido van Rossum65d5b571998-12-21 19:32:43 +0000237static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000238static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000239
240void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000242{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000244 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000246 interpreter_lock = PyThread_allocate_lock();
247 PyThread_acquire_lock(interpreter_lock, 1);
248 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000250
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000254 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255}
256
257void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000259{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000260 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261}
262
263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000265{
266 if (tstate == NULL)
267 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000269 if (PyThreadState_Swap(tstate) != NULL)
270 Py_FatalError(
271 "PyEval_AcquireThread: non-NULL old thread state");
272}
273
274void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000276{
277 if (tstate == NULL)
278 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
279 if (PyThreadState_Swap(NULL) != tstate)
280 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000283
284/* This function is called from PyOS_AfterFork to ensure that newly
285 created child processes don't hold locks referring to threads which
286 are not running in the child process. (This could also be done using
287 pthread_atfork mechanism, at least for the pthreads implementation.) */
288
289void
290PyEval_ReInitThreads(void)
291{
292 if (!interpreter_lock)
293 return;
294 /*XXX Can't use PyThread_free_lock here because it does too
295 much error-checking. Doing this cleanly would require
296 adding a new function to each thread_*.h. Instead, just
297 create a new lock and waste a little bit of memory */
298 interpreter_lock = PyThread_allocate_lock();
299 PyThread_acquire_lock(interpreter_lock, 1);
300 main_thread = PyThread_get_thread_ident();
301}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302#endif
303
Guido van Rossumff4949e1992-08-05 19:58:53 +0000304/* Functions save_thread and restore_thread are always defined so
305 dynamically loaded modules needn't be compiled separately for use
306 with and without threads: */
307
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000308PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000309PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000311 PyThreadState *tstate = PyThreadState_Swap(NULL);
312 if (tstate == NULL)
313 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000314#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000315 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000318 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319}
320
321void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 if (tstate == NULL)
325 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 }
332#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336
Guido van Rossuma9672091994-09-14 13:31:22 +0000337/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
338 signal handlers or Mac I/O completion routines) can schedule calls
339 to a function to be called synchronously.
340 The synchronous function is called with one void* argument.
341 It should return 0 for success or -1 for failure -- failure should
342 be accompanied by an exception.
343
344 If registry succeeds, the registry function returns 0; if it fails
345 (e.g. due to too many pending calls) it returns -1 (without setting
346 an exception condition).
347
348 Note that because registry may occur from within signal handlers,
349 or other asynchronous events, calling malloc() is unsafe!
350
351#ifdef WITH_THREAD
352 Any thread can schedule pending calls, but only the main thread
353 will execute them.
354#endif
355
356 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
357 There are two possible race conditions:
358 (1) nested asynchronous registry calls;
359 (2) registry calls made while pending calls are being processed.
360 While (1) is very unlikely, (2) is a real possibility.
361 The current code is safe against (2), but not against (1).
362 The safety against (2) is derived from the fact that only one
363 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000364
Guido van Rossuma027efa1997-05-05 20:56:21 +0000365 XXX Darn! With the advent of thread state, we should have an array
366 of pending calls per thread in the thread state! Later...
367*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000368
Guido van Rossuma9672091994-09-14 13:31:22 +0000369#define NPENDINGCALLS 32
370static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000371 int (*func)(void *);
372 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373} pendingcalls[NPENDINGCALLS];
374static volatile int pendingfirst = 0;
375static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
378int
Thomas Wouters334fb892000-07-25 12:56:38 +0000379Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000380{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 int i, j;
383 /* XXX Begin critical section */
384 /* XXX If you want this to be safe against nested
385 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 if (busy)
387 return -1;
388 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389 i = pendinglast;
390 j = (i + 1) % NPENDINGCALLS;
391 if (j == pendingfirst)
392 return -1; /* Queue full */
393 pendingcalls[i].func = func;
394 pendingcalls[i].arg = arg;
395 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000396 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000397 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000398 /* XXX End critical section */
399 return 0;
400}
401
Guido van Rossum180d7b41994-09-29 09:45:57 +0000402int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000403Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000404{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000405 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000406#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000407 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000408 return 0;
409#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000410 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000411 return 0;
412 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000413 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000414 for (;;) {
415 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000416 int (*func)(void *);
417 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418 i = pendingfirst;
419 if (i == pendinglast)
420 break; /* Queue empty */
421 func = pendingcalls[i].func;
422 arg = pendingcalls[i].arg;
423 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 if (func(arg) < 0) {
425 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000428 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000429 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000430 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 return 0;
432}
433
434
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000435/* The interpreter's recursion limit */
436
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000437static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000438
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000439int
440Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000441{
442 return recursion_limit;
443}
444
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000445void
446Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000447{
448 recursion_limit = new_limit;
449}
450
Guido van Rossum374a9221991-04-04 10:40:29 +0000451/* Status code for main loop (reason for stack unwind) */
452
453enum why_code {
454 WHY_NOT, /* No error */
455 WHY_EXCEPTION, /* Exception occurred */
456 WHY_RERAISE, /* Exception re-raised by 'finally' */
457 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000458 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000459 WHY_CONTINUE, /* 'continue' statement */
460 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000461};
462
Tim Petersdbd9ba62000-07-09 03:09:57 +0000463static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
464static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000465
Guido van Rossum374a9221991-04-04 10:40:29 +0000466
Guido van Rossumb209a111997-04-29 18:18:01 +0000467PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000468PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469{
470 return eval_code2(co,
471 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000472 (PyObject **)NULL, 0,
473 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000474 (PyObject **)NULL, 0,
475 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476}
477
478
479/* Interpreter main loop */
480
Tim Peters5ca576e2001-06-18 22:08:13 +0000481PyObject *
482eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000483{
Guido van Rossum950361c1997-01-24 13:49:28 +0000484#ifdef DXPAIRS
485 int lastopcode = 0;
486#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000487 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000488 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000489 register int opcode=0; /* Current opcode */
490 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000491 register enum why_code why; /* Reason for block stack unwind */
492 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000493 register PyObject *x; /* Result object -- NULL if error */
494 register PyObject *v; /* Temporary objects popped off stack */
495 register PyObject *w;
496 register PyObject *u;
497 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000498 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000499 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000500 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000501 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000502 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000503 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000504#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000505 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000506#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000507#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000509 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000510#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000511
512/* Code access macros */
513
514#define GETCONST(i) Getconst(f, i)
515#define GETNAME(i) Getname(f, i)
516#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000517#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000518#define NEXTOP() (*next_instr++)
519#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000520#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000521#define JUMPBY(x) (next_instr += (x))
522
523/* Stack manipulation macros */
524
525#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
526#define EMPTY() (STACK_LEVEL() == 0)
527#define TOP() (stack_pointer[-1])
528#define BASIC_PUSH(v) (*stack_pointer++ = (v))
529#define BASIC_POP() (*--stack_pointer)
530
Guido van Rossum96a42c81992-01-12 02:29:51 +0000531#ifdef LLTRACE
532#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
533#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#else
535#define PUSH(v) BASIC_PUSH(v)
536#define POP() BASIC_POP()
537#endif
538
Guido van Rossum681d79a1995-07-18 14:51:37 +0000539/* Local variable macros */
540
541#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000542#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000543 GETLOCAL(i) = value; } while (0)
544
Guido van Rossuma027efa1997-05-05 20:56:21 +0000545/* Start of code */
546
Tim Peters5ca576e2001-06-18 22:08:13 +0000547 if (f == NULL)
548 return NULL;
549
Guido van Rossum8861b741996-07-30 16:49:37 +0000550#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000551 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000552 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000553 return NULL;
554 }
555#endif
556
Tim Peters5ca576e2001-06-18 22:08:13 +0000557 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000558 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000559 --tstate->recursion_depth;
560 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000561 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000562 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000563 return NULL;
564 }
565
Tim Peters5ca576e2001-06-18 22:08:13 +0000566 f->f_back = tstate->frame;
567 tstate->frame = f;
568
569 co = f->f_code;
570 fastlocals = f->f_localsplus;
571 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000572 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000573 next_instr = first_instr + f->f_lasti;
574 stack_pointer = f->f_stackbottom;
575 f->f_stackbottom = NULL;
576
577#ifdef LLTRACE
578 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
579#endif
580#if defined(Py_DEBUG) || defined(LLTRACE)
581 filename = PyString_AsString(co->co_filename);
582#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000583
Guido van Rossum374a9221991-04-04 10:40:29 +0000584 why = WHY_NOT;
585 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000586 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000587 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000588
Guido van Rossum374a9221991-04-04 10:40:29 +0000589 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000590 /* Do periodic things. Doing this every time through
591 the loop would add too much overhead, so we do it
592 only every Nth instruction. We also do it if
593 ``things_to_do'' is set, i.e. when an asynchronous
594 event needs attention (e.g. a signal handler or
595 async I/O handler); see Py_AddPendingCall() and
596 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000597
Guido van Rossuma027efa1997-05-05 20:56:21 +0000598 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000599 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000601 if (Py_MakePendingCalls() < 0) {
602 why = WHY_EXCEPTION;
603 goto on_error;
604 }
605 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000606#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000607 /* If we have true signals, the signal handler
608 will call Py_AddPendingCall() so we don't
609 have to call sigcheck(). On the Mac and
610 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000611 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000612 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000613 goto on_error;
614 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000615#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000616
Guido van Rossume59214e1994-08-30 08:01:59 +0000617#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000618 if (interpreter_lock) {
619 /* Give another thread a chance */
620
Guido van Rossum25ce5661997-08-02 03:10:38 +0000621 if (PyThreadState_Swap(NULL) != tstate)
622 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000623 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000624
625 /* Other threads may run now */
626
Guido van Rossum65d5b571998-12-21 19:32:43 +0000627 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000628 if (PyThreadState_Swap(tstate) != NULL)
629 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000630 }
631#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000635
Guido van Rossum408027e1996-12-30 16:17:54 +0000636#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000637 f->f_lasti = INSTR_OFFSET();
638#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000639
Guido van Rossum374a9221991-04-04 10:40:29 +0000640 opcode = NEXTOP();
641 if (HAS_ARG(opcode))
642 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000643 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000644#ifdef DYNAMIC_EXECUTION_PROFILE
645#ifdef DXPAIRS
646 dxpairs[lastopcode][opcode]++;
647 lastopcode = opcode;
648#endif
649 dxp[opcode]++;
650#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000651
Guido van Rossum96a42c81992-01-12 02:29:51 +0000652#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000654
Guido van Rossum96a42c81992-01-12 02:29:51 +0000655 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000656 if (HAS_ARG(opcode)) {
657 printf("%d: %d, %d\n",
658 (int) (INSTR_OFFSET() - 3),
659 opcode, oparg);
660 }
661 else {
662 printf("%d: %d\n",
663 (int) (INSTR_OFFSET() - 1), opcode);
664 }
665 }
666#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000667 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000668
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000670
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 /* BEWARE!
672 It is essential that any operation that fails sets either
673 x to NULL, err to nonzero, or why to anything but WHY_NOT,
674 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000675
Guido van Rossum374a9221991-04-04 10:40:29 +0000676 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000677
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 case POP_TOP:
679 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000680 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000681 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 case ROT_TWO:
684 v = POP();
685 w = POP();
686 PUSH(v);
687 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000688 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000689
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 case ROT_THREE:
691 v = POP();
692 w = POP();
693 x = POP();
694 PUSH(v);
695 PUSH(x);
696 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000697 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000698
Thomas Wouters434d0822000-08-24 20:11:32 +0000699 case ROT_FOUR:
700 u = POP();
701 v = POP();
702 w = POP();
703 x = POP();
704 PUSH(u);
705 PUSH(x);
706 PUSH(w);
707 PUSH(v);
708 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000709
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 case DUP_TOP:
711 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000712 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000714 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000715
Thomas Wouters434d0822000-08-24 20:11:32 +0000716 case DUP_TOPX:
717 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000718 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000719 x = TOP();
720 Py_INCREF(x);
721 PUSH(x);
722 continue;
723 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000724 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000725 Py_INCREF(x);
726 w = TOP();
727 Py_INCREF(w);
728 PUSH(x);
729 PUSH(w);
730 PUSH(x);
731 continue;
732 case 3:
733 x = POP();
734 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000735 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000736 Py_INCREF(w);
737 v = TOP();
738 Py_INCREF(v);
739 PUSH(w);
740 PUSH(x);
741 PUSH(v);
742 PUSH(w);
743 PUSH(x);
744 continue;
745 case 4:
746 x = POP();
747 Py_INCREF(x);
748 w = POP();
749 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000750 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000751 Py_INCREF(v);
752 u = TOP();
753 Py_INCREF(u);
754 PUSH(v);
755 PUSH(w);
756 PUSH(x);
757 PUSH(u);
758 PUSH(v);
759 PUSH(w);
760 PUSH(x);
761 continue;
762 case 5:
763 x = POP();
764 Py_INCREF(x);
765 w = POP();
766 Py_INCREF(w);
767 v = POP();
768 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000769 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000770 Py_INCREF(u);
771 t = TOP();
772 Py_INCREF(t);
773 PUSH(u);
774 PUSH(v);
775 PUSH(w);
776 PUSH(x);
777 PUSH(t);
778 PUSH(u);
779 PUSH(v);
780 PUSH(w);
781 PUSH(x);
782 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000783 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000784 Py_FatalError("invalid argument to DUP_TOPX"
785 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000786 }
Tim Peters35ba6892000-10-11 07:04:49 +0000787 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000788
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 case UNARY_POSITIVE:
790 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000791 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000792 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000793 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000794 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000795 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000796
Guido van Rossum374a9221991-04-04 10:40:29 +0000797 case UNARY_NEGATIVE:
798 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000799 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000800 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000801 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000802 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000804
Guido van Rossum374a9221991-04-04 10:40:29 +0000805 case UNARY_NOT:
806 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000807 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000808 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000809 if (err == 0) {
810 Py_INCREF(Py_True);
811 PUSH(Py_True);
812 continue;
813 }
814 else if (err > 0) {
815 Py_INCREF(Py_False);
816 PUSH(Py_False);
817 err = 0;
818 continue;
819 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000821
Guido van Rossum374a9221991-04-04 10:40:29 +0000822 case UNARY_CONVERT:
823 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000824 x = PyObject_Repr(v);
825 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000826 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000827 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000828 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000829
Guido van Rossum7928cd71991-10-24 14:59:31 +0000830 case UNARY_INVERT:
831 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000832 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000833 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000834 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000835 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000836 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000837
Guido van Rossum50564e81996-01-12 01:13:16 +0000838 case BINARY_POWER:
839 w = POP();
840 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000841 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000842 Py_DECREF(v);
843 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000844 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000845 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000846 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000847
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 case BINARY_MULTIPLY:
849 w = POP();
850 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000851 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000852 Py_DECREF(v);
853 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000854 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000855 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000856 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000857
Guido van Rossum374a9221991-04-04 10:40:29 +0000858 case BINARY_DIVIDE:
859 w = POP();
860 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000861 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000862 Py_DECREF(v);
863 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000864 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000865 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000866 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000867
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 case BINARY_MODULO:
869 w = POP();
870 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000871 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000872 Py_DECREF(v);
873 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000875 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000877
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 case BINARY_ADD:
879 w = POP();
880 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000881 if (PyInt_Check(v) && PyInt_Check(w)) {
882 /* INLINE: int + int */
883 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000884 a = PyInt_AS_LONG(v);
885 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000886 i = a + b;
887 if ((i^a) < 0 && (i^b) < 0) {
888 PyErr_SetString(PyExc_OverflowError,
889 "integer addition");
890 x = NULL;
891 }
892 else
893 x = PyInt_FromLong(i);
894 }
895 else
896 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(v);
898 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000900 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000902
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 case BINARY_SUBTRACT:
904 w = POP();
905 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000906 if (PyInt_Check(v) && PyInt_Check(w)) {
907 /* INLINE: int - int */
908 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000909 a = PyInt_AS_LONG(v);
910 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000911 i = a - b;
912 if ((i^a) < 0 && (i^~b) < 0) {
913 PyErr_SetString(PyExc_OverflowError,
914 "integer subtraction");
915 x = NULL;
916 }
917 else
918 x = PyInt_FromLong(i);
919 }
920 else
921 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000922 Py_DECREF(v);
923 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000925 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000927
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 case BINARY_SUBSCR:
929 w = POP();
930 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000931 if (PyList_Check(v) && PyInt_Check(w)) {
932 /* INLINE: list[int] */
933 long i = PyInt_AsLong(w);
934 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000935 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000936 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000937 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000938 PyErr_SetString(PyExc_IndexError,
939 "list index out of range");
940 x = NULL;
941 }
942 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000943 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000944 Py_INCREF(x);
945 }
946 }
947 else
948 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000949 Py_DECREF(v);
950 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000952 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000954
Guido van Rossum7928cd71991-10-24 14:59:31 +0000955 case BINARY_LSHIFT:
956 w = POP();
957 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000958 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(v);
960 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000961 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000962 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000963 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000964
Guido van Rossum7928cd71991-10-24 14:59:31 +0000965 case BINARY_RSHIFT:
966 w = POP();
967 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000968 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000969 Py_DECREF(v);
970 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000971 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000972 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000973 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000974
Guido van Rossum7928cd71991-10-24 14:59:31 +0000975 case BINARY_AND:
976 w = POP();
977 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000978 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 Py_DECREF(v);
980 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000981 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000982 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000983 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000984
Guido van Rossum7928cd71991-10-24 14:59:31 +0000985 case BINARY_XOR:
986 w = POP();
987 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000988 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000989 Py_DECREF(v);
990 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000991 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000992 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000993 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000994
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995 case BINARY_OR:
996 w = POP();
997 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000998 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000999 Py_DECREF(v);
1000 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001001 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001002 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001003 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001004
1005 case INPLACE_POWER:
1006 w = POP();
1007 v = POP();
1008 x = PyNumber_InPlacePower(v, w, Py_None);
1009 Py_DECREF(v);
1010 Py_DECREF(w);
1011 PUSH(x);
1012 if (x != NULL) continue;
1013 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001014
Thomas Wouters434d0822000-08-24 20:11:32 +00001015 case INPLACE_MULTIPLY:
1016 w = POP();
1017 v = POP();
1018 x = PyNumber_InPlaceMultiply(v, w);
1019 Py_DECREF(v);
1020 Py_DECREF(w);
1021 PUSH(x);
1022 if (x != NULL) continue;
1023 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001024
Thomas Wouters434d0822000-08-24 20:11:32 +00001025 case INPLACE_DIVIDE:
1026 w = POP();
1027 v = POP();
1028 x = PyNumber_InPlaceDivide(v, w);
1029 Py_DECREF(v);
1030 Py_DECREF(w);
1031 PUSH(x);
1032 if (x != NULL) continue;
1033 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001034
Thomas Wouters434d0822000-08-24 20:11:32 +00001035 case INPLACE_MODULO:
1036 w = POP();
1037 v = POP();
1038 x = PyNumber_InPlaceRemainder(v, w);
1039 Py_DECREF(v);
1040 Py_DECREF(w);
1041 PUSH(x);
1042 if (x != NULL) continue;
1043 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001044
Thomas Wouters434d0822000-08-24 20:11:32 +00001045 case INPLACE_ADD:
1046 w = POP();
1047 v = POP();
1048 if (PyInt_Check(v) && PyInt_Check(w)) {
1049 /* INLINE: int + int */
1050 register long a, b, i;
1051 a = PyInt_AS_LONG(v);
1052 b = PyInt_AS_LONG(w);
1053 i = a + b;
1054 if ((i^a) < 0 && (i^b) < 0) {
1055 PyErr_SetString(PyExc_OverflowError,
1056 "integer addition");
1057 x = NULL;
1058 }
1059 else
1060 x = PyInt_FromLong(i);
1061 }
1062 else
1063 x = PyNumber_InPlaceAdd(v, w);
1064 Py_DECREF(v);
1065 Py_DECREF(w);
1066 PUSH(x);
1067 if (x != NULL) continue;
1068 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001069
Thomas Wouters434d0822000-08-24 20:11:32 +00001070 case INPLACE_SUBTRACT:
1071 w = POP();
1072 v = POP();
1073 if (PyInt_Check(v) && PyInt_Check(w)) {
1074 /* INLINE: int - int */
1075 register long a, b, i;
1076 a = PyInt_AS_LONG(v);
1077 b = PyInt_AS_LONG(w);
1078 i = a - b;
1079 if ((i^a) < 0 && (i^~b) < 0) {
1080 PyErr_SetString(PyExc_OverflowError,
1081 "integer subtraction");
1082 x = NULL;
1083 }
1084 else
1085 x = PyInt_FromLong(i);
1086 }
1087 else
1088 x = PyNumber_InPlaceSubtract(v, w);
1089 Py_DECREF(v);
1090 Py_DECREF(w);
1091 PUSH(x);
1092 if (x != NULL) continue;
1093 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001094
Thomas Wouters434d0822000-08-24 20:11:32 +00001095 case INPLACE_LSHIFT:
1096 w = POP();
1097 v = POP();
1098 x = PyNumber_InPlaceLshift(v, w);
1099 Py_DECREF(v);
1100 Py_DECREF(w);
1101 PUSH(x);
1102 if (x != NULL) continue;
1103 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001104
Thomas Wouters434d0822000-08-24 20:11:32 +00001105 case INPLACE_RSHIFT:
1106 w = POP();
1107 v = POP();
1108 x = PyNumber_InPlaceRshift(v, w);
1109 Py_DECREF(v);
1110 Py_DECREF(w);
1111 PUSH(x);
1112 if (x != NULL) continue;
1113 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001114
Thomas Wouters434d0822000-08-24 20:11:32 +00001115 case INPLACE_AND:
1116 w = POP();
1117 v = POP();
1118 x = PyNumber_InPlaceAnd(v, w);
1119 Py_DECREF(v);
1120 Py_DECREF(w);
1121 PUSH(x);
1122 if (x != NULL) continue;
1123 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001124
Thomas Wouters434d0822000-08-24 20:11:32 +00001125 case INPLACE_XOR:
1126 w = POP();
1127 v = POP();
1128 x = PyNumber_InPlaceXor(v, w);
1129 Py_DECREF(v);
1130 Py_DECREF(w);
1131 PUSH(x);
1132 if (x != NULL) continue;
1133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 case INPLACE_OR:
1136 w = POP();
1137 v = POP();
1138 x = PyNumber_InPlaceOr(v, w);
1139 Py_DECREF(v);
1140 Py_DECREF(w);
1141 PUSH(x);
1142 if (x != NULL) continue;
1143 break;
1144
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 case SLICE+0:
1146 case SLICE+1:
1147 case SLICE+2:
1148 case SLICE+3:
1149 if ((opcode-SLICE) & 2)
1150 w = POP();
1151 else
1152 w = NULL;
1153 if ((opcode-SLICE) & 1)
1154 v = POP();
1155 else
1156 v = NULL;
1157 u = POP();
1158 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001159 Py_DECREF(u);
1160 Py_XDECREF(v);
1161 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001163 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001165
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 case STORE_SLICE+0:
1167 case STORE_SLICE+1:
1168 case STORE_SLICE+2:
1169 case STORE_SLICE+3:
1170 if ((opcode-STORE_SLICE) & 2)
1171 w = POP();
1172 else
1173 w = NULL;
1174 if ((opcode-STORE_SLICE) & 1)
1175 v = POP();
1176 else
1177 v = NULL;
1178 u = POP();
1179 t = POP();
1180 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001181 Py_DECREF(t);
1182 Py_DECREF(u);
1183 Py_XDECREF(v);
1184 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001185 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001187
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 case DELETE_SLICE+0:
1189 case DELETE_SLICE+1:
1190 case DELETE_SLICE+2:
1191 case DELETE_SLICE+3:
1192 if ((opcode-DELETE_SLICE) & 2)
1193 w = POP();
1194 else
1195 w = NULL;
1196 if ((opcode-DELETE_SLICE) & 1)
1197 v = POP();
1198 else
1199 v = NULL;
1200 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001201 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001202 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001203 Py_DECREF(u);
1204 Py_XDECREF(v);
1205 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001206 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001208
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 case STORE_SUBSCR:
1210 w = POP();
1211 v = POP();
1212 u = POP();
1213 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001214 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001215 Py_DECREF(u);
1216 Py_DECREF(v);
1217 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001218 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001219 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001220
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 case DELETE_SUBSCR:
1222 w = POP();
1223 v = POP();
1224 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001225 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(v);
1227 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001228 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001230
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 case PRINT_EXPR:
1232 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001233 w = PySys_GetObject("displayhook");
1234 if (w == NULL) {
1235 PyErr_SetString(PyExc_RuntimeError,
1236 "lost sys.displayhook");
1237 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001238 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001239 }
1240 if (err == 0) {
1241 x = Py_BuildValue("(O)", v);
1242 if (x == NULL)
1243 err = -1;
1244 }
1245 if (err == 0) {
1246 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001247 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001248 if (w == NULL)
1249 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001252 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001254
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001255 case PRINT_ITEM_TO:
1256 w = stream = POP();
1257 /* fall through to PRINT_ITEM */
1258
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 case PRINT_ITEM:
1260 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001261 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001262 w = PySys_GetObject("stdout");
1263 if (w == NULL) {
1264 PyErr_SetString(PyExc_RuntimeError,
1265 "lost sys.stdout");
1266 err = -1;
1267 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001268 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001269 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001270 err = PyFile_WriteString(" ", w);
1271 if (err == 0)
1272 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001273 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001274 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001275 char *s = PyString_AsString(v);
1276 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001277 if (len > 0 &&
1278 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001279 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001283 Py_XDECREF(stream);
1284 stream = NULL;
1285 if (err == 0)
1286 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001288
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001289 case PRINT_NEWLINE_TO:
1290 w = stream = POP();
1291 /* fall through to PRINT_NEWLINE */
1292
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001294 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001295 w = PySys_GetObject("stdout");
1296 if (w == NULL)
1297 PyErr_SetString(PyExc_RuntimeError,
1298 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001299 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001300 if (w != NULL) {
1301 err = PyFile_WriteString("\n", w);
1302 if (err == 0)
1303 PyFile_SoftSpace(w, 0);
1304 }
1305 Py_XDECREF(stream);
1306 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001308
Thomas Wouters434d0822000-08-24 20:11:32 +00001309
1310#ifdef CASE_TOO_BIG
1311 default: switch (opcode) {
1312#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 case BREAK_LOOP:
1314 why = WHY_BREAK;
1315 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001316
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001317 case CONTINUE_LOOP:
1318 retval = PyInt_FromLong(oparg);
1319 why = WHY_CONTINUE;
1320 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001321
Guido van Rossumf10570b1995-07-07 22:53:21 +00001322 case RAISE_VARARGS:
1323 u = v = w = NULL;
1324 switch (oparg) {
1325 case 3:
1326 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001327 /* Fallthrough */
1328 case 2:
1329 v = POP(); /* value */
1330 /* Fallthrough */
1331 case 1:
1332 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001333 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001334 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001335 break;
1336 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001337 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001338 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001339 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001340 break;
1341 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001343
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001345 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001346 PyErr_SetString(PyExc_SystemError,
1347 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001348 break;
1349 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001351 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001353
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 case RETURN_VALUE:
1355 retval = POP();
1356 why = WHY_RETURN;
1357 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001358
Tim Peters5ca576e2001-06-18 22:08:13 +00001359 case YIELD_VALUE:
1360 retval = POP();
1361 f->f_stackbottom = stack_pointer;
1362 f->f_lasti = INSTR_OFFSET();
1363 why = WHY_YIELD;
1364 break;
1365
1366
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001367 case EXEC_STMT:
1368 w = POP();
1369 v = POP();
1370 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001371 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001372 Py_DECREF(u);
1373 Py_DECREF(v);
1374 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001375 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001376
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 case POP_BLOCK:
1378 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001379 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 while (STACK_LEVEL() > b->b_level) {
1381 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 }
1384 }
1385 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001386
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 case END_FINALLY:
1388 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 if (PyInt_Check(v)) {
1390 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001391 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001392 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001393 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001394 retval = POP();
1395 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001398 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001401 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001403 else if (v != Py_None) {
1404 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 "'finally' pops bad exception");
1406 why = WHY_EXCEPTION;
1407 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001408 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001409 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001410
Guido van Rossum374a9221991-04-04 10:40:29 +00001411 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001412 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001414 w = POP();
1415 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001417 Py_DECREF(u);
1418 Py_DECREF(v);
1419 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001421
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 case STORE_NAME:
1423 w = GETNAMEV(oparg);
1424 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001425 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001426 PyErr_Format(PyExc_SystemError,
1427 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001428 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001429 break;
1430 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 err = PyDict_SetItem(x, w, v);
1432 Py_DECREF(v);
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 DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001436 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001438 PyErr_Format(PyExc_SystemError,
1439 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001440 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001441 break;
1442 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001443 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001444 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001445 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001447
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001448 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001450 if (PyTuple_Check(v)) {
1451 if (PyTuple_Size(v) != oparg) {
1452 PyErr_SetString(PyExc_ValueError,
1453 "unpack tuple of wrong size");
1454 why = WHY_EXCEPTION;
1455 }
1456 else {
1457 for (; --oparg >= 0; ) {
1458 w = PyTuple_GET_ITEM(v, oparg);
1459 Py_INCREF(w);
1460 PUSH(w);
1461 }
1462 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001464 else if (PyList_Check(v)) {
1465 if (PyList_Size(v) != oparg) {
1466 PyErr_SetString(PyExc_ValueError,
1467 "unpack list of wrong size");
1468 why = WHY_EXCEPTION;
1469 }
1470 else {
1471 for (; --oparg >= 0; ) {
1472 w = PyList_GET_ITEM(v, oparg);
1473 Py_INCREF(w);
1474 PUSH(w);
1475 }
1476 }
1477 }
1478 else if (PySequence_Check(v)) {
1479 if (unpack_sequence(v, oparg,
1480 stack_pointer + oparg))
1481 stack_pointer += oparg;
1482 else
1483 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 }
1485 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001486 PyErr_SetString(PyExc_TypeError,
1487 "unpack non-sequence");
1488 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001492
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001494 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 v = POP();
1496 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1498 Py_DECREF(v);
1499 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001501
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001503 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001505 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1506 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001509
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001510 case STORE_GLOBAL:
1511 w = GETNAMEV(oparg);
1512 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 err = PyDict_SetItem(f->f_globals, w, v);
1514 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001515 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001516
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001517 case DELETE_GLOBAL:
1518 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001519 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001520 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001521 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001522 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001523
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 case LOAD_CONST:
1525 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 PUSH(x);
1528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001531 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001532 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001533 PyErr_Format(PyExc_SystemError,
1534 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001535 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001536 break;
1537 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001540 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001544 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001545 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001546 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 break;
1548 }
1549 }
1550 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 PUSH(x);
1553 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001554
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001556 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001561 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001562 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001563 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 break;
1565 }
1566 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001567 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 PUSH(x);
1569 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001570
Guido van Rossum9bfef441993-03-29 10:43:31 +00001571 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001573 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001574 format_exc_check_arg(
1575 PyExc_UnboundLocalError,
1576 UNBOUNDLOCAL_ERROR_MSG,
1577 PyTuple_GetItem(co->co_varnames, oparg)
1578 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001579 break;
1580 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001582 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001583 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001584 break;
1585
1586 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001587 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001589 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001590
1591 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001592 x = GETLOCAL(oparg);
1593 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001594 format_exc_check_arg(
1595 PyExc_UnboundLocalError,
1596 UNBOUNDLOCAL_ERROR_MSG,
1597 PyTuple_GetItem(co->co_varnames, oparg)
1598 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001599 break;
1600 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001602 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001603
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001604 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001605 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001606 Py_INCREF(x);
1607 PUSH(x);
1608 break;
1609
1610 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001611 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001612 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001613 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001614 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001615 v = PyTuple_GetItem(co->co_cellvars,
1616 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001617 format_exc_check_arg(
1618 PyExc_UnboundLocalError,
1619 UNBOUNDLOCAL_ERROR_MSG,
1620 v);
1621 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001622 v = PyTuple_GetItem(
1623 co->co_freevars,
1624 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001625 format_exc_check_arg(
1626 PyExc_NameError,
1627 UNBOUNDFREE_ERROR_MSG,
1628 v);
1629 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001630 err = -1;
1631 break;
1632 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001633 PUSH(w);
1634 break;
1635
1636 case STORE_DEREF:
1637 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001638 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001639 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001640 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001641 continue;
1642
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 if (x != NULL) {
1646 for (; --oparg >= 0;) {
1647 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001648 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 }
1650 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001651 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001652 }
1653 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001654
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 if (x != NULL) {
1658 for (; --oparg >= 0;) {
1659 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001660 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 }
1662 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001663 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 }
1665 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001666
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001670 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001671 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001672
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001674 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 x = PyObject_GetAttr(v, w);
1677 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001678 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001679 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001681
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 case COMPARE_OP:
1683 w = POP();
1684 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001685 if (PyInt_Check(v) && PyInt_Check(w)) {
1686 /* INLINE: cmp(int, int) */
1687 register long a, b;
1688 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001689 a = PyInt_AS_LONG(v);
1690 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001691 switch (oparg) {
1692 case LT: res = a < b; break;
1693 case LE: res = a <= b; break;
1694 case EQ: res = a == b; break;
1695 case NE: res = a != b; break;
1696 case GT: res = a > b; break;
1697 case GE: res = a >= b; break;
1698 case IS: res = v == w; break;
1699 case IS_NOT: res = v != w; break;
1700 default: goto slow_compare;
1701 }
1702 x = res ? Py_True : Py_False;
1703 Py_INCREF(x);
1704 }
1705 else {
1706 slow_compare:
1707 x = cmp_outcome(oparg, v, w);
1708 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001709 Py_DECREF(v);
1710 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001712 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001714
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001716 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001717 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001718 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001719 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001720 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001721 break;
1722 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001723 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001724 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001725 w,
1726 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001727 f->f_locals == NULL ?
1728 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001729 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001731 if (w == NULL) {
1732 x = NULL;
1733 break;
1734 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 x = PyEval_CallObject(x, w);
1736 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001737 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001738 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001740
Thomas Wouters52152252000-08-17 22:55:00 +00001741 case IMPORT_STAR:
1742 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001744 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001745 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001746 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001747 break;
1748 }
Thomas Wouters52152252000-08-17 22:55:00 +00001749 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001750 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001751 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001752 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001754
Thomas Wouters52152252000-08-17 22:55:00 +00001755 case IMPORT_FROM:
1756 w = GETNAMEV(oparg);
1757 v = TOP();
1758 x = import_from(v, w);
1759 PUSH(x);
1760 if (x != NULL) continue;
1761 break;
1762
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 case JUMP_FORWARD:
1764 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001765 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001766
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001768 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001769 if (err > 0)
1770 err = 0;
1771 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001773 else
1774 break;
1775 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001776
Guido van Rossum374a9221991-04-04 10:40:29 +00001777 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001778 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001779 if (err > 0) {
1780 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001782 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001783 else if (err == 0)
1784 ;
1785 else
1786 break;
1787 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001788
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 case JUMP_ABSOLUTE:
1790 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001791 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001792
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001793 case GET_ITER:
1794 /* before: [obj]; after [getiter(obj)] */
1795 v = POP();
1796 x = PyObject_GetIter(v);
1797 Py_DECREF(v);
1798 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001799 PUSH(x);
1800 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001801 }
1802 break;
1803
1804 case FOR_ITER:
1805 /* before: [iter]; after: [iter, iter()] *or* [] */
1806 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001807 x = PyIter_Next(v);
1808 if (x != NULL) {
1809 PUSH(x);
1810 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001811 }
Tim Petersf4848da2001-05-05 00:14:56 +00001812 if (!PyErr_Occurred()) {
1813 /* iterator ended normally */
1814 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001815 Py_DECREF(v);
1816 JUMPBY(oparg);
1817 continue;
1818 }
1819 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001820
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 case FOR_LOOP:
1822 /* for v in s: ...
1823 On entry: stack contains s, i.
1824 On exit: stack contains s, i+1, s[i];
1825 but if loop exhausted:
1826 s, i are popped, and we jump */
1827 w = POP(); /* Loop index */
1828 v = POP(); /* Sequence object */
1829 u = loop_subscript(v, w);
1830 if (u != NULL) {
1831 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001832 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001836 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 }
1838 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001839 Py_DECREF(v);
1840 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 /* A NULL can mean "s exhausted"
1842 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001845 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001847 continue;
1848 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 }
1850 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001851
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 case SETUP_LOOP:
1853 case SETUP_EXCEPT:
1854 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001856 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001857 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001858
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001860#ifdef LLTRACE
1861 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001862 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001863#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001864 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001865 if (f->f_trace == NULL)
1866 continue;
1867 /* Trace each line of code reached */
1868 f->f_lasti = INSTR_OFFSET();
1869 err = call_trace(&f->f_trace, &f->f_trace,
Fred Draked0838392001-06-16 21:02:31 +00001870 f, str_line, Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001872
1873 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001874 {
1875 int na = oparg & 0xff;
1876 int nk = (oparg>>8) & 0xff;
1877 int n = na + 2 * nk;
1878 PyObject **pfunc = stack_pointer - n - 1;
1879 PyObject *func = *pfunc;
1880 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1881
1882 /* Always dispatch PyCFunction first, because
1883 these are presumed to be the most frequent
1884 callable object.
1885 */
1886 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001887 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001888 if (flags > 1 || nk != 0)
1889 x = do_call(func, &stack_pointer,
1890 na, nk);
1891 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001892 PyObject *callargs;
1893 callargs = load_args(&stack_pointer, na);
1894 x = call_cfunction(func, callargs, NULL);
1895 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001896 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001897 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001898 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001899 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001900 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001901 && PyMethod_GET_SELF(func) != NULL) {
1902 /* optimize access to bound methods */
1903 PyObject *self = PyMethod_GET_SELF(func);
1904 Py_INCREF(self);
1905 func = PyMethod_GET_FUNCTION(func);
1906 Py_INCREF(func);
1907 Py_DECREF(*pfunc);
1908 *pfunc = self;
1909 na++;
1910 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001911 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001912 Py_INCREF(func);
1913 if (PyFunction_Check(func)) {
1914 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001915 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001916 } else {
1917 x = do_call(func, &stack_pointer,
1918 na, nk);
1919 }
1920 Py_DECREF(func);
1921 }
1922
1923 while (stack_pointer > pfunc) {
1924 w = POP();
1925 Py_DECREF(w);
1926 }
1927 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001928 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001929 continue;
1930 break;
1931 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001932
Jeremy Hylton76901512000-03-28 23:49:17 +00001933 case CALL_FUNCTION_VAR:
1934 case CALL_FUNCTION_KW:
1935 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001936 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001937 int na = oparg & 0xff;
1938 int nk = (oparg>>8) & 0xff;
1939 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001940 int n = na + 2 * nk;
1941 PyObject **pfunc, *func;
1942 if (flags & CALL_FLAG_VAR)
1943 n++;
1944 if (flags & CALL_FLAG_KW)
1945 n++;
1946 pfunc = stack_pointer - n - 1;
1947 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001948 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001949
Guido van Rossumac7be682001-01-17 15:42:30 +00001950 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001951 && PyMethod_GET_SELF(func) != NULL) {
1952 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001953 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001954 func = PyMethod_GET_FUNCTION(func);
1955 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001956 Py_DECREF(*pfunc);
1957 *pfunc = self;
1958 na++;
1959 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001960 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001961 Py_INCREF(func);
1962 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001963 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001964
Jeremy Hylton76901512000-03-28 23:49:17 +00001965 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001966 w = POP();
1967 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001968 }
1969 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001970 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001971 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001972 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001973 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001974
Guido van Rossum681d79a1995-07-18 14:51:37 +00001975 case MAKE_FUNCTION:
1976 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001977 x = PyFunction_New(v, f->f_globals);
1978 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001979 /* XXX Maybe this should be a separate opcode? */
1980 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001981 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001982 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001983 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001984 x = NULL;
1985 break;
1986 }
1987 while (--oparg >= 0) {
1988 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001989 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001990 }
1991 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001992 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001993 }
1994 PUSH(x);
1995 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001996
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001997 case MAKE_CLOSURE:
1998 {
1999 int nfree;
2000 v = POP(); /* code object */
2001 x = PyFunction_New(v, f->f_globals);
2002 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2003 Py_DECREF(v);
2004 /* XXX Maybe this should be a separate opcode? */
2005 if (x != NULL && nfree > 0) {
2006 v = PyTuple_New(nfree);
2007 if (v == NULL) {
2008 Py_DECREF(x);
2009 x = NULL;
2010 break;
2011 }
2012 while (--nfree >= 0) {
2013 w = POP();
2014 PyTuple_SET_ITEM(v, nfree, w);
2015 }
2016 err = PyFunction_SetClosure(x, v);
2017 Py_DECREF(v);
2018 }
2019 if (x != NULL && oparg > 0) {
2020 v = PyTuple_New(oparg);
2021 if (v == NULL) {
2022 Py_DECREF(x);
2023 x = NULL;
2024 break;
2025 }
2026 while (--oparg >= 0) {
2027 w = POP();
2028 PyTuple_SET_ITEM(v, oparg, w);
2029 }
2030 err = PyFunction_SetDefaults(x, v);
2031 Py_DECREF(v);
2032 }
2033 PUSH(x);
2034 break;
2035 }
2036
Guido van Rossum8861b741996-07-30 16:49:37 +00002037 case BUILD_SLICE:
2038 if (oparg == 3)
2039 w = POP();
2040 else
2041 w = NULL;
2042 v = POP();
2043 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002044 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 Py_DECREF(u);
2046 Py_DECREF(v);
2047 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002048 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002049 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002050 break;
2051
Fred Drakeef8ace32000-08-24 00:32:09 +00002052 case EXTENDED_ARG:
2053 opcode = NEXTOP();
2054 oparg = oparg<<16 | NEXTARG();
2055 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002056
Guido van Rossum374a9221991-04-04 10:40:29 +00002057 default:
2058 fprintf(stderr,
2059 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002060 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002062 why = WHY_EXCEPTION;
2063 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002064
2065#ifdef CASE_TOO_BIG
2066 }
2067#endif
2068
Guido van Rossum374a9221991-04-04 10:40:29 +00002069 } /* switch */
2070
2071 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002072
Guido van Rossum374a9221991-04-04 10:40:29 +00002073 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002074
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002076 if (err == 0 && x != NULL) {
2077#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002078 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002079 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002080 fprintf(stderr,
2081 "XXX undetected error\n");
2082 else
2083#endif
2084 continue; /* Normal, fast path */
2085 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 err = 0;
2089 }
2090
Guido van Rossum374a9221991-04-04 10:40:29 +00002091 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002092
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002095 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002096 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002097 why = WHY_EXCEPTION;
2098 }
2099 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002100#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002101 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002102 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002104 fprintf(stderr,
2105 "XXX undetected error (why=%d)\n",
2106 why);
2107 why = WHY_EXCEPTION;
2108 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002109 }
2110#endif
2111
2112 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002113
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002115 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002117 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002119
Guido van Rossume59214e1994-08-30 08:01:59 +00002120 if (f->f_trace)
2121 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002122 if (tstate->sys_profilefunc)
2123 call_exc_trace(&tstate->sys_profilefunc,
2124 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002125 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002126
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002128
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 if (why == WHY_RERAISE)
2130 why = WHY_EXCEPTION;
2131
2132 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002133
Tim Peters5ca576e2001-06-18 22:08:13 +00002134 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002136
2137 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2138 /* For a continue inside a try block,
2139 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002140 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002141 b->b_handler);
2142 why = WHY_NOT;
2143 JUMPTO(PyInt_AS_LONG(retval));
2144 Py_DECREF(retval);
2145 break;
2146 }
2147
Guido van Rossum374a9221991-04-04 10:40:29 +00002148 while (STACK_LEVEL() > b->b_level) {
2149 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 }
2152 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2153 why = WHY_NOT;
2154 JUMPTO(b->b_handler);
2155 break;
2156 }
2157 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002158 (b->b_type == SETUP_EXCEPT &&
2159 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyObject *exc, *val, *tb;
2162 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 val = Py_None;
2165 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 /* Make the raw exception data
2168 available to the handler,
2169 so a program can emulate the
2170 Python main loop. Don't do
2171 this for 'finally'. */
2172 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002173 PyErr_NormalizeException(
2174 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 set_exc_info(tstate,
2176 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 PUSH(val);
2180 PUSH(exc);
2181 }
2182 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002183 if (why == WHY_RETURN ||
2184 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 PUSH(v);
2188 }
2189 why = WHY_NOT;
2190 JUMPTO(b->b_handler);
2191 break;
2192 }
2193 } /* unwind stack */
2194
2195 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002196
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 if (why != WHY_NOT)
2198 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002199
Guido van Rossum374a9221991-04-04 10:40:29 +00002200 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002201
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002203
Tim Peters5ca576e2001-06-18 22:08:13 +00002204 /*
Guido van Rossum374a9221991-04-04 10:40:29 +00002205 while (!EMPTY()) {
2206 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002209 */
Guido van Rossumac7be682001-01-17 15:42:30 +00002210
Tim Peters5ca576e2001-06-18 22:08:13 +00002211 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002212 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002213
Guido van Rossume59214e1994-08-30 08:01:59 +00002214 if (f->f_trace) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002215 if (why == WHY_RETURN || why == WHY_YIELD) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002216 if (call_trace(&f->f_trace, &f->f_trace, f,
Fred Draked0838392001-06-16 21:02:31 +00002217 str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002218 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002219 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002220 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002221 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002222 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002223 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002224
Tim Peters5ca576e2001-06-18 22:08:13 +00002225 if (tstate->sys_profilefunc &&
2226 (why == WHY_RETURN || why == WHY_YIELD)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002227 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Fred Draked0838392001-06-16 21:02:31 +00002228 f, str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002230 retval = NULL;
2231 why = WHY_EXCEPTION;
2232 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002233 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002234
Guido van Rossuma027efa1997-05-05 20:56:21 +00002235 reset_exc_info(tstate);
2236
Tim Peters5ca576e2001-06-18 22:08:13 +00002237 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002238 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002239 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002240
Guido van Rossum96a42c81992-01-12 02:29:51 +00002241 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002242}
2243
Tim Peters5ca576e2001-06-18 22:08:13 +00002244static PyObject *
2245eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2246 PyObject **args, int argcount, PyObject **kws, int kwcount,
2247 PyObject **defs, int defcount, PyObject *closure)
2248{
2249 register PyFrameObject *f;
2250 register PyObject *retval = NULL;
2251 register PyObject **fastlocals, **freevars;
2252 PyThreadState *tstate = PyThreadState_GET();
2253 PyObject *x, *u;
2254
2255 if (globals == NULL) {
2256 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2257 return NULL;
2258 }
2259
2260 f = PyFrame_New(tstate, /*back*/
2261 co, /*code*/
2262 globals, locals);
2263 if (f == NULL)
2264 return NULL;
2265
2266 fastlocals = f->f_localsplus;
2267 freevars = f->f_localsplus + f->f_nlocals;
2268
2269 if (co->co_argcount > 0 ||
2270 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2271 int i;
2272 int n = argcount;
2273 PyObject *kwdict = NULL;
2274 if (co->co_flags & CO_VARKEYWORDS) {
2275 kwdict = PyDict_New();
2276 if (kwdict == NULL)
2277 goto fail;
2278 i = co->co_argcount;
2279 if (co->co_flags & CO_VARARGS)
2280 i++;
2281 SETLOCAL(i, kwdict);
2282 }
2283 if (argcount > co->co_argcount) {
2284 if (!(co->co_flags & CO_VARARGS)) {
2285 PyErr_Format(PyExc_TypeError,
2286 "%.200s() takes %s %d "
2287 "%sargument%s (%d given)",
2288 PyString_AsString(co->co_name),
2289 defcount ? "at most" : "exactly",
2290 co->co_argcount,
2291 kwcount ? "non-keyword " : "",
2292 co->co_argcount == 1 ? "" : "s",
2293 argcount);
2294 goto fail;
2295 }
2296 n = co->co_argcount;
2297 }
2298 for (i = 0; i < n; i++) {
2299 x = args[i];
2300 Py_INCREF(x);
2301 SETLOCAL(i, x);
2302 }
2303 if (co->co_flags & CO_VARARGS) {
2304 u = PyTuple_New(argcount - n);
2305 if (u == NULL)
2306 goto fail;
2307 SETLOCAL(co->co_argcount, u);
2308 for (i = n; i < argcount; i++) {
2309 x = args[i];
2310 Py_INCREF(x);
2311 PyTuple_SET_ITEM(u, i-n, x);
2312 }
2313 }
2314 for (i = 0; i < kwcount; i++) {
2315 PyObject *keyword = kws[2*i];
2316 PyObject *value = kws[2*i + 1];
2317 int j;
2318 if (keyword == NULL || !PyString_Check(keyword)) {
2319 PyErr_Format(PyExc_TypeError,
2320 "%.200s() keywords must be strings",
2321 PyString_AsString(co->co_name));
2322 goto fail;
2323 }
2324 /* XXX slow -- speed up using dictionary? */
2325 for (j = 0; j < co->co_argcount; j++) {
2326 PyObject *nm = PyTuple_GET_ITEM(
2327 co->co_varnames, j);
2328 int cmp = PyObject_RichCompareBool(
2329 keyword, nm, Py_EQ);
2330 if (cmp > 0)
2331 break;
2332 else if (cmp < 0)
2333 goto fail;
2334 }
2335 /* Check errors from Compare */
2336 if (PyErr_Occurred())
2337 goto fail;
2338 if (j >= co->co_argcount) {
2339 if (kwdict == NULL) {
2340 PyErr_Format(PyExc_TypeError,
2341 "%.200s() got an unexpected "
2342 "keyword argument '%.400s'",
2343 PyString_AsString(co->co_name),
2344 PyString_AsString(keyword));
2345 goto fail;
2346 }
2347 PyDict_SetItem(kwdict, keyword, value);
2348 }
2349 else {
2350 if (GETLOCAL(j) != NULL) {
2351 PyErr_Format(PyExc_TypeError,
2352 "%.200s() got multiple "
2353 "values for keyword "
2354 "argument '%.400s'",
2355 PyString_AsString(co->co_name),
2356 PyString_AsString(keyword));
2357 goto fail;
2358 }
2359 Py_INCREF(value);
2360 SETLOCAL(j, value);
2361 }
2362 }
2363 if (argcount < co->co_argcount) {
2364 int m = co->co_argcount - defcount;
2365 for (i = argcount; i < m; i++) {
2366 if (GETLOCAL(i) == NULL) {
2367 PyErr_Format(PyExc_TypeError,
2368 "%.200s() takes %s %d "
2369 "%sargument%s (%d given)",
2370 PyString_AsString(co->co_name),
2371 ((co->co_flags & CO_VARARGS) ||
2372 defcount) ? "at least"
2373 : "exactly",
2374 m, kwcount ? "non-keyword " : "",
2375 m == 1 ? "" : "s", i);
2376 goto fail;
2377 }
2378 }
2379 if (n > m)
2380 i = n - m;
2381 else
2382 i = 0;
2383 for (; i < defcount; i++) {
2384 if (GETLOCAL(m+i) == NULL) {
2385 PyObject *def = defs[i];
2386 Py_INCREF(def);
2387 SETLOCAL(m+i, def);
2388 }
2389 }
2390 }
2391 }
2392 else {
2393 if (argcount > 0 || kwcount > 0) {
2394 PyErr_Format(PyExc_TypeError,
2395 "%.200s() takes no arguments (%d given)",
2396 PyString_AsString(co->co_name),
2397 argcount + kwcount);
2398 goto fail;
2399 }
2400 }
2401 /* Allocate and initialize storage for cell vars, and copy free
2402 vars into frame. This isn't too efficient right now. */
2403 if (f->f_ncells) {
2404 int i = 0, j = 0, nargs, found;
2405 char *cellname, *argname;
2406 PyObject *c;
2407
2408 nargs = co->co_argcount;
2409 if (co->co_flags & CO_VARARGS)
2410 nargs++;
2411 if (co->co_flags & CO_VARKEYWORDS)
2412 nargs++;
2413
2414 /* Check for cells that shadow args */
2415 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2416 cellname = PyString_AS_STRING(
2417 PyTuple_GET_ITEM(co->co_cellvars, i));
2418 found = 0;
2419 while (j < nargs) {
2420 argname = PyString_AS_STRING(
2421 PyTuple_GET_ITEM(co->co_varnames, j));
2422 if (strcmp(cellname, argname) == 0) {
2423 c = PyCell_New(GETLOCAL(j));
2424 if (c == NULL)
2425 goto fail;
2426 GETLOCAL(f->f_nlocals + i) = c;
2427 found = 1;
2428 break;
2429 }
2430 j++;
2431 }
2432 if (found == 0) {
2433 c = PyCell_New(NULL);
2434 if (c == NULL)
2435 goto fail;
2436 SETLOCAL(f->f_nlocals + i, c);
2437 }
2438 }
2439 /* Initialize any that are left */
2440 while (i < f->f_ncells) {
2441 c = PyCell_New(NULL);
2442 if (c == NULL)
2443 goto fail;
2444 SETLOCAL(f->f_nlocals + i, c);
2445 i++;
2446 }
2447 }
2448 if (f->f_nfreevars) {
2449 int i;
2450 for (i = 0; i < f->f_nfreevars; ++i) {
2451 PyObject *o = PyTuple_GET_ITEM(closure, i);
2452 Py_INCREF(o);
2453 freevars[f->f_ncells + i] = o;
2454 }
2455 }
2456
2457 if (tstate->sys_tracefunc != NULL) {
2458 /* tstate->sys_tracefunc, if defined, is a function that
2459 will be called on *every* entry to a code block.
2460 Its return value, if not None, is a function that
2461 will be called at the start of each executed line
2462 of code. (Actually, the function must return
2463 itself in order to continue tracing.)
2464 The trace functions are called with three arguments:
2465 a pointer to the current frame, a string indicating
2466 why the function is called, and an argument which
2467 depends on the situation. The global trace function
2468 (sys.trace) is also called whenever an exception
2469 is detected. */
2470 if (call_trace(&tstate->sys_tracefunc,
2471 &f->f_trace, f, str_call,
2472 Py_None/*XXX how to compute arguments now?*/)) {
2473 /* Trace function raised an error */
2474 goto fail;
2475 }
2476 }
2477
2478 if (tstate->sys_profilefunc != NULL) {
2479 /* Similar for sys_profilefunc, except it needn't return
2480 itself and isn't called for "line" events */
2481 if (call_trace(&tstate->sys_profilefunc,
2482 (PyObject**)0, f, str_call,
2483 Py_None/*XXX*/)) {
2484 goto fail;
2485 }
2486 }
2487
2488 if (co->co_flags & CO_GENERATOR) {
2489 /* create a new generator that owns the ready to run frame
2490 * and return that as the value */
2491 return gen_new(f);
2492 }
2493
2494 retval = eval_frame(f);
2495
2496 fail: /* Jump here from prelude on failure */
2497
2498 Py_DECREF(f);
2499 return retval;
2500}
2501
2502
Guido van Rossuma027efa1997-05-05 20:56:21 +00002503static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002504set_exc_info(PyThreadState *tstate,
2505 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002506{
2507 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002508 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002509
Guido van Rossuma027efa1997-05-05 20:56:21 +00002510 frame = tstate->frame;
2511 if (frame->f_exc_type == NULL) {
2512 /* This frame didn't catch an exception before */
2513 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002514 if (tstate->exc_type == NULL) {
2515 Py_INCREF(Py_None);
2516 tstate->exc_type = Py_None;
2517 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002518 tmp_type = frame->f_exc_type;
2519 tmp_value = frame->f_exc_value;
2520 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002521 Py_XINCREF(tstate->exc_type);
2522 Py_XINCREF(tstate->exc_value);
2523 Py_XINCREF(tstate->exc_traceback);
2524 frame->f_exc_type = tstate->exc_type;
2525 frame->f_exc_value = tstate->exc_value;
2526 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002527 Py_XDECREF(tmp_type);
2528 Py_XDECREF(tmp_value);
2529 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002530 }
2531 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002532 tmp_type = tstate->exc_type;
2533 tmp_value = tstate->exc_value;
2534 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002535 Py_XINCREF(type);
2536 Py_XINCREF(value);
2537 Py_XINCREF(tb);
2538 tstate->exc_type = type;
2539 tstate->exc_value = value;
2540 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002541 Py_XDECREF(tmp_type);
2542 Py_XDECREF(tmp_value);
2543 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002544 /* For b/w compatibility */
2545 PySys_SetObject("exc_type", type);
2546 PySys_SetObject("exc_value", value);
2547 PySys_SetObject("exc_traceback", tb);
2548}
2549
2550static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002551reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002552{
2553 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002554 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002555 frame = tstate->frame;
2556 if (frame->f_exc_type != NULL) {
2557 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002558 tmp_type = tstate->exc_type;
2559 tmp_value = tstate->exc_value;
2560 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002561 Py_XINCREF(frame->f_exc_type);
2562 Py_XINCREF(frame->f_exc_value);
2563 Py_XINCREF(frame->f_exc_traceback);
2564 tstate->exc_type = frame->f_exc_type;
2565 tstate->exc_value = frame->f_exc_value;
2566 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002567 Py_XDECREF(tmp_type);
2568 Py_XDECREF(tmp_value);
2569 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 /* For b/w compatibility */
2571 PySys_SetObject("exc_type", frame->f_exc_type);
2572 PySys_SetObject("exc_value", frame->f_exc_value);
2573 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2574 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002575 tmp_type = frame->f_exc_type;
2576 tmp_value = frame->f_exc_value;
2577 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578 frame->f_exc_type = NULL;
2579 frame->f_exc_value = NULL;
2580 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002581 Py_XDECREF(tmp_type);
2582 Py_XDECREF(tmp_value);
2583 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584}
2585
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002586/* Logic for the raise statement (too complicated for inlining).
2587 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002588static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002589do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002590{
Guido van Rossumd295f121998-04-09 21:39:57 +00002591 if (type == NULL) {
2592 /* Reraise */
2593 PyThreadState *tstate = PyThreadState_Get();
2594 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2595 value = tstate->exc_value;
2596 tb = tstate->exc_traceback;
2597 Py_XINCREF(type);
2598 Py_XINCREF(value);
2599 Py_XINCREF(tb);
2600 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002601
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002602 /* We support the following forms of raise:
2603 raise <class>, <classinstance>
2604 raise <class>, <argument tuple>
2605 raise <class>, None
2606 raise <class>, <argument>
2607 raise <classinstance>, None
2608 raise <string>, <object>
2609 raise <string>, None
2610
2611 An omitted second argument is the same as None.
2612
2613 In addition, raise <tuple>, <anything> is the same as
2614 raising the tuple's first item (and it better have one!);
2615 this rule is applied recursively.
2616
2617 Finally, an optional third argument can be supplied, which
2618 gives the traceback to be substituted (useful when
2619 re-raising an exception after examining it). */
2620
2621 /* First, check the traceback argument, replacing None with
2622 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 if (tb == Py_None) {
2624 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002625 tb = NULL;
2626 }
2627 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002629 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002630 goto raise_error;
2631 }
2632
2633 /* Next, replace a missing value with None */
2634 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002635 value = Py_None;
2636 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002637 }
2638
2639 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2641 PyObject *tmp = type;
2642 type = PyTuple_GET_ITEM(type, 0);
2643 Py_INCREF(type);
2644 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002645 }
2646
Barry Warsaw4249f541997-08-22 21:26:19 +00002647 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002648 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002649
2650 else if (PyClass_Check(type))
2651 PyErr_NormalizeException(&type, &value, &tb);
2652
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002654 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002655 if (value != Py_None) {
2656 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002657 "instance exception may not have a separate value");
2658 goto raise_error;
2659 }
2660 else {
2661 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002663 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2665 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002666 }
2667 }
2668 else {
2669 /* Not something you can raise. You get an exception
2670 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002671 PyErr_Format(PyExc_TypeError,
2672 "exceptions must be strings, classes, or "
2673 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002674 goto raise_error;
2675 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002677 if (tb == NULL)
2678 return WHY_EXCEPTION;
2679 else
2680 return WHY_RERAISE;
2681 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 Py_XDECREF(value);
2683 Py_XDECREF(type);
2684 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002685 return WHY_EXCEPTION;
2686}
2687
Barry Warsawe42b18f1997-08-25 22:13:04 +00002688static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002689unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002690{
2691 int i;
2692 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002693
Barry Warsawe42b18f1997-08-25 22:13:04 +00002694 for (i = 0; i < argcnt; i++) {
2695 if (! (w = PySequence_GetItem(v, i))) {
2696 if (PyErr_ExceptionMatches(PyExc_IndexError))
2697 PyErr_SetString(PyExc_ValueError,
2698 "unpack sequence of wrong size");
2699 goto finally;
2700 }
2701 *--sp = w;
2702 }
2703 /* we better get an IndexError now */
2704 if (PySequence_GetItem(v, i) == NULL) {
2705 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2706 PyErr_Clear();
2707 return 1;
2708 }
2709 /* some other exception occurred. fall through to finally */
2710 }
2711 else
2712 PyErr_SetString(PyExc_ValueError,
2713 "unpack sequence of wrong size");
2714 /* fall through */
2715finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002716 for (; i > 0; i--, sp++)
2717 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002718
2719 return 0;
2720}
2721
2722
Guido van Rossum96a42c81992-01-12 02:29:51 +00002723#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002724static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002725prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002727 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 if (PyObject_Print(v, stdout, 0) != 0)
2729 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002731 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002733#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002735static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002736call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002737{
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002739 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002741 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 value = Py_None;
2743 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002744 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002746 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002748 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002749 }
Fred Draked0838392001-06-16 21:02:31 +00002750 err = call_trace(p_trace, p_newtrace, f, str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002752 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002753 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002754 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 Py_XDECREF(type);
2756 Py_XDECREF(value);
2757 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002758 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002759}
2760
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002761/* PyObject **p_trace: in/out; may not be NULL;
2762 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002763 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002764 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002765 may be same variable as p_newtrace
Fred Draked0838392001-06-16 21:02:31 +00002766 PyObject *msg: in; must not be NULL
Fred Drake904aa7b2001-06-08 04:33:09 +00002767*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002768
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002769static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002770call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Draked0838392001-06-16 21:02:31 +00002771 PyObject *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002772{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002773 PyThreadState *tstate = f->f_tstate;
Fred Draked0838392001-06-16 21:02:31 +00002774 PyObject *args;
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002776
Guido van Rossuma027efa1997-05-05 20:56:21 +00002777 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002778 /* Don't do recursive traces */
2779 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002780 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002781 *p_newtrace = NULL;
2782 }
2783 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002784 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002785
Guido van Rossumb209a111997-04-29 18:18:01 +00002786 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002787 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002788 goto cleanup;
Fred Draked0838392001-06-16 21:02:31 +00002789 Py_INCREF(msg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 Py_INCREF(f);
2791 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
Fred Draked0838392001-06-16 21:02:31 +00002792 PyTuple_SET_ITEM(args, 1, msg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002793 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 arg = Py_None;
2795 Py_INCREF(arg);
2796 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002797 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002798 PyFrame_FastToLocals(f);
2799 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2800 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002801 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002802 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804 if (res == NULL) {
2805 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 PyTraceBack_Here(f);
2807 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808 *p_trace = NULL;
2809 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002810 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002811 *p_newtrace = NULL;
2812 }
Barry Warsawf6202631999-09-08 16:26:33 +00002813 /* to be extra double plus sure we don't get recursive
2814 * calls inf either tracefunc or profilefunc gets an
2815 * exception, zap the global variables.
2816 */
2817 Py_XDECREF(tstate->sys_tracefunc);
2818 tstate->sys_tracefunc = NULL;
2819 Py_XDECREF(tstate->sys_profilefunc);
2820 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002821 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822 }
2823 else {
2824 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 Py_XDECREF(*p_newtrace);
2826 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002827 *p_newtrace = NULL;
2828 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002830 *p_newtrace = res;
2831 }
2832 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002834 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002835 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002836}
2837
Fred Draked0838392001-06-16 21:02:31 +00002838/* Initialize the strings that get passed to the profile and trace functions;
2839 * this avoids doing this while we're actually profiling/tracing.
2840 */
2841int
2842_PyTrace_Init(void)
2843{
2844 if (str_call == NULL) {
2845 str_call = PyString_InternFromString("call");
2846 if (str_call == NULL)
2847 return -1;
2848 }
2849 if (str_exception == NULL) {
2850 str_exception = PyString_InternFromString("exception");
2851 if (str_exception == NULL)
2852 return -1;
2853 }
2854 if (str_line == NULL) {
2855 str_line = PyString_InternFromString("line");
2856 if (str_line == NULL)
2857 return -1;
2858 }
2859 if (str_return == NULL) {
2860 str_return = PyString_InternFromString("return");
2861 if (str_return == NULL)
2862 return -1;
2863 }
2864 return 0;
2865}
2866
Guido van Rossumb209a111997-04-29 18:18:01 +00002867PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002868PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002869{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002870 PyThreadState *tstate = PyThreadState_Get();
2871 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002872 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002873 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002874 else
2875 return current_frame->f_builtins;
2876}
2877
Guido van Rossumb209a111997-04-29 18:18:01 +00002878PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002879PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002880{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002881 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002882 if (current_frame == NULL)
2883 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002884 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002885 return current_frame->f_locals;
2886}
2887
Guido van Rossumb209a111997-04-29 18:18:01 +00002888PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002889PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002890{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002891 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002892 if (current_frame == NULL)
2893 return NULL;
2894 else
2895 return current_frame->f_globals;
2896}
2897
Guido van Rossumb209a111997-04-29 18:18:01 +00002898PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002899PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002900{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002901 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002902 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002903}
2904
Guido van Rossum6135a871995-01-09 17:53:26 +00002905int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002906PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002907{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002908 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002909 return current_frame == NULL ? 0 : current_frame->f_restricted;
2910}
2911
Guido van Rossumbe270261997-05-22 22:26:18 +00002912int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002913PyEval_GetNestedScopes(void)
2914{
2915 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2916 return current_frame == NULL ? 0 :
2917 current_frame->f_code->co_flags & CO_NESTED;
2918}
2919
2920int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002921Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002922{
Guido van Rossumb209a111997-04-29 18:18:01 +00002923 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002924 if (f == NULL)
2925 return 0;
2926 if (!PyFile_SoftSpace(f, 0))
2927 return 0;
2928 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929}
2930
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931
Guido van Rossum681d79a1995-07-18 14:51:37 +00002932/* External interface to call any callable object.
2933 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002934
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002935#undef PyEval_CallObject
2936/* for backward compatibility: export this interface */
2937
Guido van Rossumb209a111997-04-29 18:18:01 +00002938PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002939PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002940{
Guido van Rossumb209a111997-04-29 18:18:01 +00002941 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002942}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002943#define PyEval_CallObject(func,arg) \
2944 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002945
Guido van Rossumb209a111997-04-29 18:18:01 +00002946PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002947PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002948{
Jeremy Hylton52820442001-01-03 23:52:36 +00002949 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002950
2951 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002952 arg = PyTuple_New(0);
2953 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002954 PyErr_SetString(PyExc_TypeError,
2955 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002956 return NULL;
2957 }
2958 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002959 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002960
Guido van Rossumb209a111997-04-29 18:18:01 +00002961 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002962 PyErr_SetString(PyExc_TypeError,
2963 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002964 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002965 return NULL;
2966 }
2967
Jeremy Hylton52820442001-01-03 23:52:36 +00002968 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002969 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002970 return result;
2971}
2972
2973/* How often is each kind of object called? The answer depends on the
2974 program. An instrumented call_object() was used to run the Python
2975 regression test suite. The results were:
2976 4200000 PyCFunctions
2977 390000 fast_function() calls
2978 94000 other functions
2979 480000 all functions (sum of prev two)
2980 150000 methods
2981 100000 classes
2982
2983 Tests on other bodies of code show that PyCFunctions are still
2984 most common, but not by such a large margin.
2985*/
2986
Jeremy Hylton512a2372001-04-11 13:52:29 +00002987static char *
2988get_func_name(PyObject *func)
2989{
2990 if (PyMethod_Check(func))
2991 return get_func_name(PyMethod_GET_FUNCTION(func));
2992 else if (PyFunction_Check(func))
2993 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2994 else if (PyCFunction_Check(func))
2995 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2996 else if (PyClass_Check(func))
2997 return PyString_AsString(((PyClassObject*)func)->cl_name);
2998 else if (PyInstance_Check(func)) {
2999 return PyString_AsString(
3000 ((PyInstanceObject*)func)->in_class->cl_name);
3001 } else {
3002 return func->ob_type->tp_name;
3003 }
3004}
3005
3006static char *
3007get_func_desc(PyObject *func)
3008{
3009 if (PyMethod_Check(func))
3010 return "()";
3011 else if (PyFunction_Check(func))
3012 return "()";
3013 else if (PyCFunction_Check(func))
3014 return "()";
3015 else if (PyClass_Check(func))
3016 return " constructor";
3017 else if (PyInstance_Check(func)) {
3018 return " instance";
3019 } else {
3020 return " object";
3021 }
3022}
3023
Jeremy Hylton52820442001-01-03 23:52:36 +00003024static PyObject *
3025call_object(PyObject *func, PyObject *arg, PyObject *kw)
3026{
3027 ternaryfunc call;
3028 PyObject *result;
3029
3030 if (PyMethod_Check(func))
3031 result = call_method(func, arg, kw);
3032 else if (PyFunction_Check(func))
3033 result = call_eval_code2(func, arg, kw);
3034 else if (PyCFunction_Check(func))
3035 result = call_cfunction(func, arg, kw);
3036 else if (PyClass_Check(func))
3037 result = PyInstance_New(func, arg, kw);
3038 else if (PyInstance_Check(func))
3039 result = call_instance(func, arg, kw);
3040 else if ((call = func->ob_type->tp_call) != NULL)
3041 result = (*call)(func, arg, kw);
3042 else {
Tim Peters239508c2001-06-16 00:09:28 +00003043 PyErr_Format(PyExc_TypeError,
3044 "object of type '%.100s' is not callable",
3045 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003046 return NULL;
3047 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003048 if (result == NULL && !PyErr_Occurred())
3049 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003050 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003051
Guido van Rossume59214e1994-08-30 08:01:59 +00003052 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003053}
3054
Guido van Rossumb209a111997-04-29 18:18:01 +00003055static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003056call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003057{
Jeremy Hylton52820442001-01-03 23:52:36 +00003058 PyCFunctionObject* f = (PyCFunctionObject*)func;
3059 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3060 PyObject *self = PyCFunction_GET_SELF(func);
3061 int flags = PyCFunction_GET_FLAGS(func);
3062
Jeremy Hylton52820442001-01-03 23:52:36 +00003063 if (flags & METH_KEYWORDS) {
3064 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003066 if (kw != NULL && PyDict_Size(kw) != 0) {
3067 PyErr_Format(PyExc_TypeError,
3068 "%.200s() takes no keyword arguments",
3069 f->m_ml->ml_name);
3070 return NULL;
3071 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003072 if (flags & METH_VARARGS) {
3073 return (*meth)(self, arg);
3074 }
3075 if (!(flags & METH_VARARGS)) {
3076 /* the really old style */
3077 int size = PyTuple_GET_SIZE(arg);
3078 if (size == 1)
3079 arg = PyTuple_GET_ITEM(arg, 0);
3080 else if (size == 0)
3081 arg = NULL;
3082 return (*meth)(self, arg);
3083 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003084 /* should never get here ??? */
3085 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 return NULL;
3087}
3088
Guido van Rossumb209a111997-04-29 18:18:01 +00003089static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003090call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091{
Jeremy Hylton52820442001-01-03 23:52:36 +00003092 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3093 if (call == NULL) {
3094 PyInstanceObject *inst = (PyInstanceObject*) func;
3095 PyErr_Clear();
3096 PyErr_Format(PyExc_AttributeError,
3097 "%.200s instance has no __call__ method",
3098 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003099 return NULL;
3100 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003101 res = call_object(call, arg, kw);
3102 Py_DECREF(call);
3103 return res;
3104}
3105
3106static PyObject *
3107call_method(PyObject *func, PyObject *arg, PyObject *kw)
3108{
3109 PyObject *self = PyMethod_GET_SELF(func);
3110 PyObject *class = PyMethod_GET_CLASS(func);
3111 PyObject *result;
3112
3113 func = PyMethod_GET_FUNCTION(func);
3114 if (self == NULL) {
3115 /* Unbound methods must be called with an instance of
3116 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003117 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003118 if (PyTuple_Size(arg) >= 1)
3119 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003120 if (self == NULL)
3121 ok = 0;
3122 else {
3123 ok = PyObject_IsInstance(self, class);
3124 if (ok < 0)
3125 return NULL;
3126 }
3127 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003128 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003129 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003130 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003131 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132 return NULL;
3133 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003134 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003135 }
3136 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003137 int argcount = PyTuple_Size(arg);
3138 PyObject *newarg = PyTuple_New(argcount + 1);
3139 int i;
3140 if (newarg == NULL)
3141 return NULL;
3142 Py_INCREF(self);
3143 PyTuple_SET_ITEM(newarg, 0, self);
3144 for (i = 0; i < argcount; i++) {
3145 PyObject *v = PyTuple_GET_ITEM(arg, i);
3146 Py_XINCREF(v);
3147 PyTuple_SET_ITEM(newarg, i+1, v);
3148 }
3149 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003151 result = call_object(func, arg, kw);
3152 Py_DECREF(arg);
3153 return result;
3154}
3155
3156static PyObject *
3157call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3158{
3159 PyObject *result;
3160 PyObject *argdefs;
3161 PyObject **d, **k;
3162 int nk, nd;
3163
3164 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003165 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3166 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3167 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003168 }
3169 else {
3170 d = NULL;
3171 nd = 0;
3172 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003173
Guido van Rossum681d79a1995-07-18 14:51:37 +00003174 if (kw != NULL) {
3175 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003176 nk = PyDict_Size(kw);
3177 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003178 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003179 PyErr_NoMemory();
3180 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003181 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003182 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003183 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003184 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003185 i += 2;
3186 nk = i/2;
3187 /* XXX This is broken if the caller deletes dict items! */
3188 }
3189 else {
3190 k = NULL;
3191 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003192 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003193
Guido van Rossum681d79a1995-07-18 14:51:37 +00003194 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003195 (PyCodeObject *)PyFunction_GET_CODE(func),
3196 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003197 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003198 k, nk, d, nd,
3199 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003200
Guido van Rossumb18618d2000-05-03 23:44:39 +00003201 if (k != NULL)
3202 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003203
Guido van Rossum681d79a1995-07-18 14:51:37 +00003204 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205}
3206
Jeremy Hylton52820442001-01-03 23:52:36 +00003207#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3208
3209/* The two fast_xxx() functions optimize calls for which no argument
3210 tuple is necessary; the objects are passed directly from the stack.
3211 fast_cfunction() is called for METH_OLDARGS functions.
3212 fast_function() is for functions with no special argument handling.
3213*/
3214
3215static PyObject *
3216fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3217{
3218 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3219 PyObject *self = PyCFunction_GET_SELF(func);
3220
3221 if (na == 0)
3222 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003223 else if (na == 1) {
3224 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003225 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003226 Py_DECREF(arg);
3227 return result;
3228 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003229 PyObject *args = load_args(pp_stack, na);
3230 PyObject *result = (*meth)(self, args);
3231 Py_DECREF(args);
3232 return result;
3233 }
3234}
3235
3236static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003237fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003238{
3239 PyObject *co = PyFunction_GET_CODE(func);
3240 PyObject *globals = PyFunction_GET_GLOBALS(func);
3241 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003242 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003243 PyObject **d = NULL;
3244 int nd = 0;
3245
3246 if (argdefs != NULL) {
3247 d = &PyTuple_GET_ITEM(argdefs, 0);
3248 nd = ((PyTupleObject *)argdefs)->ob_size;
3249 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003250 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003251 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003252 (*pp_stack)-2*nk, nk, d, nd,
3253 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003254}
3255
3256static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003257update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3258 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003259{
3260 PyObject *kwdict = NULL;
3261 if (orig_kwdict == NULL)
3262 kwdict = PyDict_New();
3263 else {
3264 kwdict = PyDict_Copy(orig_kwdict);
3265 Py_DECREF(orig_kwdict);
3266 }
3267 if (kwdict == NULL)
3268 return NULL;
3269 while (--nk >= 0) {
3270 int err;
3271 PyObject *value = EXT_POP(*pp_stack);
3272 PyObject *key = EXT_POP(*pp_stack);
3273 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003274 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003275 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003276 "for keyword argument '%.200s'",
3277 get_func_name(func),
3278 get_func_desc(func),
3279 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003280 Py_DECREF(key);
3281 Py_DECREF(value);
3282 Py_DECREF(kwdict);
3283 return NULL;
3284 }
3285 err = PyDict_SetItem(kwdict, key, value);
3286 Py_DECREF(key);
3287 Py_DECREF(value);
3288 if (err) {
3289 Py_DECREF(kwdict);
3290 return NULL;
3291 }
3292 }
3293 return kwdict;
3294}
3295
3296static PyObject *
3297update_star_args(int nstack, int nstar, PyObject *stararg,
3298 PyObject ***pp_stack)
3299{
3300 PyObject *callargs, *w;
3301
3302 callargs = PyTuple_New(nstack + nstar);
3303 if (callargs == NULL) {
3304 return NULL;
3305 }
3306 if (nstar) {
3307 int i;
3308 for (i = 0; i < nstar; i++) {
3309 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3310 Py_INCREF(a);
3311 PyTuple_SET_ITEM(callargs, nstack + i, a);
3312 }
3313 }
3314 while (--nstack >= 0) {
3315 w = EXT_POP(*pp_stack);
3316 PyTuple_SET_ITEM(callargs, nstack, w);
3317 }
3318 return callargs;
3319}
3320
3321static PyObject *
3322load_args(PyObject ***pp_stack, int na)
3323{
3324 PyObject *args = PyTuple_New(na);
3325 PyObject *w;
3326
3327 if (args == NULL)
3328 return NULL;
3329 while (--na >= 0) {
3330 w = EXT_POP(*pp_stack);
3331 PyTuple_SET_ITEM(args, na, w);
3332 }
3333 return args;
3334}
3335
3336static PyObject *
3337do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3338{
3339 PyObject *callargs = NULL;
3340 PyObject *kwdict = NULL;
3341 PyObject *result = NULL;
3342
3343 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003344 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003345 if (kwdict == NULL)
3346 goto call_fail;
3347 }
3348 callargs = load_args(pp_stack, na);
3349 if (callargs == NULL)
3350 goto call_fail;
3351 result = call_object(func, callargs, kwdict);
3352 call_fail:
3353 Py_XDECREF(callargs);
3354 Py_XDECREF(kwdict);
3355 return result;
3356}
3357
3358static PyObject *
3359ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3360{
3361 int nstar = 0;
3362 PyObject *callargs = NULL;
3363 PyObject *stararg = NULL;
3364 PyObject *kwdict = NULL;
3365 PyObject *result = NULL;
3366
3367 if (flags & CALL_FLAG_KW) {
3368 kwdict = EXT_POP(*pp_stack);
3369 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003370 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003371 "%s%s argument after ** "
3372 "must be a dictionary",
3373 get_func_name(func),
3374 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003375 goto ext_call_fail;
3376 }
3377 }
3378 if (flags & CALL_FLAG_VAR) {
3379 stararg = EXT_POP(*pp_stack);
3380 if (!PyTuple_Check(stararg)) {
3381 PyObject *t = NULL;
3382 t = PySequence_Tuple(stararg);
3383 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003384 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3385 PyErr_Format(PyExc_TypeError,
3386 "%s%s argument after * "
3387 "must be a sequence",
3388 get_func_name(func),
3389 get_func_desc(func));
3390 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003391 goto ext_call_fail;
3392 }
3393 Py_DECREF(stararg);
3394 stararg = t;
3395 }
3396 nstar = PyTuple_GET_SIZE(stararg);
3397 }
3398 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003399 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003400 if (kwdict == NULL)
3401 goto ext_call_fail;
3402 }
3403 callargs = update_star_args(na, nstar, stararg, pp_stack);
3404 if (callargs == NULL)
3405 goto ext_call_fail;
3406 result = call_object(func, callargs, kwdict);
3407 ext_call_fail:
3408 Py_XDECREF(callargs);
3409 Py_XDECREF(kwdict);
3410 Py_XDECREF(stararg);
3411 return result;
3412}
3413
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003414#define SLICE_ERROR_MSG \
3415 "standard sequence type does not support step size other than one"
3416
Guido van Rossumb209a111997-04-29 18:18:01 +00003417static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003418loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419{
Guido van Rossumb209a111997-04-29 18:18:01 +00003420 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003421 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003422 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003423 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424 return NULL;
3425 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003426 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003427 v = (*sq->sq_item)(v, i);
3428 if (v)
3429 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003430 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003431 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003432 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433}
3434
Guido van Rossum20c6add2000-05-08 14:06:50 +00003435/* Extract a slice index from a PyInt or PyLong, the index is bound to
3436 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3437 and error. Returns 1 on success.*/
3438
3439int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003440_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441{
3442 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003443 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003444 if (PyInt_Check(v)) {
3445 x = PyInt_AsLong(v);
3446 } else if (PyLong_Check(v)) {
3447 x = PyLong_AsLong(v);
3448 if (x==-1 && PyErr_Occurred()) {
3449 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003450 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003451
Guido van Rossumac7be682001-01-17 15:42:30 +00003452 if (!PyErr_ExceptionMatches(
3453 PyExc_OverflowError)) {
3454 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003455 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003456 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003457 }
3458
Guido van Rossumac7be682001-01-17 15:42:30 +00003459 /* Clear the OverflowError */
3460 PyErr_Clear();
3461
3462 /* It's an overflow error, so we need to
3463 check the sign of the long integer,
3464 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003465 the error. */
3466
3467 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003468 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003469 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003470
3471 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003472 cmp = PyObject_RichCompareBool(v, long_zero,
3473 Py_GT);
3474 Py_DECREF(long_zero);
3475 if (cmp < 0)
3476 return 0;
3477 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003478 x = INT_MAX;
3479 else
3480 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003481 }
3482 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003483 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003484 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003485 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003487 /* Truncate -- very long indices are truncated anyway */
3488 if (x > INT_MAX)
3489 x = INT_MAX;
3490 else if (x < -INT_MAX)
3491 x = 0;
3492 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003494 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495}
3496
Guido van Rossumb209a111997-04-29 18:18:01 +00003497static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003498apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003500 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003501 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003503 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003504 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003505 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003507
3508static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003509assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3510 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003512 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003513 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003514 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003515 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003516 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003517 if (x == NULL)
3518 return PySequence_DelSlice(u, ilow, ihigh);
3519 else
3520 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521}
3522
Guido van Rossumb209a111997-04-29 18:18:01 +00003523static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003524cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525{
Guido van Rossumac7be682001-01-17 15:42:30 +00003526 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003528 case IS:
3529 case IS_NOT:
3530 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003531 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003532 res = !res;
3533 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534 case IN:
3535 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003536 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003537 if (res < 0)
3538 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003539 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003540 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003541 break;
3542 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003543 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003544 break;
3545 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003546 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003548 v = res ? Py_True : Py_False;
3549 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003550 return v;
3551}
3552
Thomas Wouters52152252000-08-17 22:55:00 +00003553static PyObject *
3554import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003555{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003556 PyObject *x;
3557
3558 x = PyObject_GetAttr(v, name);
3559 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003560 PyErr_Format(PyExc_ImportError,
3561 "cannot import name %.230s",
3562 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003563 }
Thomas Wouters52152252000-08-17 22:55:00 +00003564 return x;
3565}
Guido van Rossumac7be682001-01-17 15:42:30 +00003566
Thomas Wouters52152252000-08-17 22:55:00 +00003567static int
3568import_all_from(PyObject *locals, PyObject *v)
3569{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003570 PyObject *all = PyObject_GetAttrString(v, "__all__");
3571 PyObject *dict, *name, *value;
3572 int skip_leading_underscores = 0;
3573 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003574
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003575 if (all == NULL) {
3576 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3577 return -1; /* Unexpected error */
3578 PyErr_Clear();
3579 dict = PyObject_GetAttrString(v, "__dict__");
3580 if (dict == NULL) {
3581 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3582 return -1;
3583 PyErr_SetString(PyExc_ImportError,
3584 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003585 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003586 }
3587 all = PyMapping_Keys(dict);
3588 Py_DECREF(dict);
3589 if (all == NULL)
3590 return -1;
3591 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003592 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003593
3594 for (pos = 0, err = 0; ; pos++) {
3595 name = PySequence_GetItem(all, pos);
3596 if (name == NULL) {
3597 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3598 err = -1;
3599 else
3600 PyErr_Clear();
3601 break;
3602 }
3603 if (skip_leading_underscores &&
3604 PyString_Check(name) &&
3605 PyString_AS_STRING(name)[0] == '_')
3606 {
3607 Py_DECREF(name);
3608 continue;
3609 }
3610 value = PyObject_GetAttr(v, name);
3611 if (value == NULL)
3612 err = -1;
3613 else
3614 err = PyDict_SetItem(locals, name, value);
3615 Py_DECREF(name);
3616 Py_XDECREF(value);
3617 if (err != 0)
3618 break;
3619 }
3620 Py_DECREF(all);
3621 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003622}
3623
Guido van Rossumb209a111997-04-29 18:18:01 +00003624static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003625build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003626{
Guido van Rossumcd649651997-08-22 16:56:16 +00003627 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003628 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003629 PyErr_SetString(PyExc_SystemError,
3630 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003631 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003632 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003633 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003634 PyErr_SetString(PyExc_SystemError,
3635 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003636 return NULL;
3637 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003638 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003639 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003640 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003641 return NULL;
3642 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003643 n = PyTuple_Size(bases);
3644 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003645 PyObject *base = PyTuple_GET_ITEM(bases, i);
3646 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003647 /* Call the base's *type*, if it is callable.
3648 This code is a hook for Donald Beaudry's
3649 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003650 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003651 since its types are not callable.
3652 Ditto: call the bases's *class*, if it has
3653 one. This makes the same thing possible
3654 without writing C code. A true meta-object
3655 protocol! */
3656 PyObject *basetype = (PyObject *)base->ob_type;
3657 PyObject *callable = NULL;
3658 if (PyCallable_Check(basetype))
3659 callable = basetype;
3660 else
3661 callable = PyObject_GetAttrString(
3662 base, "__class__");
3663 if (callable) {
3664 PyObject *args;
3665 PyObject *newclass = NULL;
3666 args = Py_BuildValue(
3667 "(OOO)", name, bases, methods);
3668 if (args != NULL) {
3669 newclass = PyEval_CallObject(
3670 callable, args);
3671 Py_DECREF(args);
3672 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003673 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003674 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003675 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003676 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003677 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003678 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003679 "base is not a class object");
3680 return NULL;
3681 }
3682 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003683 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003684}
3685
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003686static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003687exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3688 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003689{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003690 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003691 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003692 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003693
Guido van Rossumb209a111997-04-29 18:18:01 +00003694 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3695 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003696 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003697 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003698 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003699 locals = PyTuple_GetItem(prog, 2);
3700 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003701 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003702 if (globals == Py_None) {
3703 globals = PyEval_GetGlobals();
3704 if (locals == Py_None) {
3705 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003706 plain = 1;
3707 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003708 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003709 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003710 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003711 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003712 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003713 !PyCode_Check(prog) &&
3714 !PyFile_Check(prog)) {
3715 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003716 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003717 return -1;
3718 }
Fred Drake661ea262000-10-24 19:57:45 +00003719 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003720 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003721 "exec: arg 2 must be a dictionary or None");
3722 return -1;
3723 }
3724 if (!PyDict_Check(locals)) {
3725 PyErr_SetString(PyExc_TypeError,
3726 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003727 return -1;
3728 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003729 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003730 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003731 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003732 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003733 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003734 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003735 FILE *fp = PyFile_AsFile(prog);
3736 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003737 if (PyEval_GetNestedScopes()) {
3738 PyCompilerFlags cf;
3739 cf.cf_nested_scopes = 1;
3740 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3741 locals, &cf);
3742 } else {
3743 v = PyRun_File(fp, name, Py_file_input, globals,
3744 locals);
3745 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003746 }
3747 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003748 char *str;
3749 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003750 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003751 if (PyEval_GetNestedScopes()) {
3752 PyCompilerFlags cf;
3753 cf.cf_nested_scopes = 1;
3754 v = PyRun_StringFlags(str, Py_file_input, globals,
3755 locals, &cf);
3756 } else
3757 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003758 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003759 if (plain)
3760 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003761 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003762 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003763 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003764 return 0;
3765}
Guido van Rossum24c13741995-02-14 09:42:43 +00003766
Guido van Rossumac7be682001-01-17 15:42:30 +00003767static void
Paul Prescode68140d2000-08-30 20:25:01 +00003768format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3769{
3770 char *obj_str;
3771
3772 if (!obj)
3773 return;
3774
3775 obj_str = PyString_AsString(obj);
3776 if (!obj_str)
3777 return;
3778
3779 PyErr_Format(exc, format_str, obj_str);
3780}
Guido van Rossum950361c1997-01-24 13:49:28 +00003781
3782#ifdef DYNAMIC_EXECUTION_PROFILE
3783
3784PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003785getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003786{
3787 int i;
3788 PyObject *l = PyList_New(256);
3789 if (l == NULL) return NULL;
3790 for (i = 0; i < 256; i++) {
3791 PyObject *x = PyInt_FromLong(a[i]);
3792 if (x == NULL) {
3793 Py_DECREF(l);
3794 return NULL;
3795 }
3796 PyList_SetItem(l, i, x);
3797 }
3798 for (i = 0; i < 256; i++)
3799 a[i] = 0;
3800 return l;
3801}
3802
3803PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003804_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003805{
3806#ifndef DXPAIRS
3807 return getarray(dxp);
3808#else
3809 int i;
3810 PyObject *l = PyList_New(257);
3811 if (l == NULL) return NULL;
3812 for (i = 0; i < 257; i++) {
3813 PyObject *x = getarray(dxpairs[i]);
3814 if (x == NULL) {
3815 Py_DECREF(l);
3816 return NULL;
3817 }
3818 PyList_SetItem(l, i, x);
3819 }
3820 return l;
3821#endif
3822}
3823
3824#endif