blob: a73e4d06a72446bd265c66ffaeb8d1a9872f145f [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
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000114 /* The gi_ prefix is intended to remind of generator-iterator. */
115
116 PyFrameObject *gi_frame;
117
Tim Peterse77f2e22001-06-26 22:24:51 +0000118 /* True if generator is being executed. */
119 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +0000120} genobject;
121
122static PyObject *
123gen_new(PyFrameObject *f)
124{
125 genobject *gen = PyObject_New(genobject, &gentype);
126 if (gen == NULL) {
127 Py_DECREF(f);
128 return NULL;
129 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000130 gen->gi_frame = f;
131 gen->gi_running = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +0000132 return (PyObject *)gen;
133}
134
135static void
136gen_dealloc(genobject *gen)
137{
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000138 Py_DECREF(gen->gi_frame);
Tim Peters5ca576e2001-06-18 22:08:13 +0000139 PyObject_DEL(gen);
140}
141
142static PyObject *
143gen_iternext(genobject *gen)
144{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000145 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000146 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000147 PyObject *result;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 PyErr_SetString(PyExc_ValueError,
151 "generator already executing");
152 return NULL;
153 }
Tim Peters8c963692001-06-23 05:26:56 +0000154 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000155 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000156
157 /* Generators always return to their most recent caller, not
158 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000159 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000160 assert(f->f_back == NULL);
161 f->f_back = tstate->frame;
162
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000163 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000164 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000165 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166
167 /* Don't keep the reference to f_back any longer than necessary. It
168 * may keep a chain of frames alive or it could create a reference
169 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000170 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000171 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000172
Tim Petersad1a18b2001-06-23 06:19:16 +0000173 /* If the generator just returned (as opposed to yielding), signal
174 * that the generator is exhausted. */
175 if (result == Py_None && f->f_stacktop == NULL) {
176 Py_DECREF(result);
177 result = NULL;
178 }
179
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000180 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000181}
182
183static PyObject *
184gen_next(genobject *gen, PyObject *args)
185{
186 PyObject *result;
187
188 if (!PyArg_ParseTuple(args, ":next"))
189 return NULL;
190
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000191 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000192
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000193 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 PyErr_SetObject(PyExc_StopIteration, Py_None);
195 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000196 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000197
198 return result;
199}
200
201static PyObject *
202gen_getiter(PyObject *gen)
203{
204 Py_INCREF(gen);
205 return gen;
206}
207
208static struct PyMethodDef gen_methods[] = {
209 {"next", (PyCFunction)gen_next, METH_VARARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000210 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000211 {NULL, NULL} /* Sentinel */
212};
213
214static PyObject *
215gen_getattr(genobject *gen, char *name)
216{
Tim Peterse77f2e22001-06-26 22:24:51 +0000217 PyObject *result;
218
219 if (strcmp(name, "gi_frame") == 0) {
220 result = (PyObject *)gen->gi_frame;
221 assert(result != NULL);
222 Py_INCREF(result);
223 }
224 else if (strcmp(name, "gi_running") == 0)
225 result = (PyObject *)PyInt_FromLong((long)gen->gi_running);
226 else if (strcmp(name, "__members__") == 0)
227 result = Py_BuildValue("[ss]", "gi_frame", "gi_running");
228 else
229 result = Py_FindMethod(gen_methods, (PyObject *)gen, name);
230 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000231}
232
233statichere PyTypeObject gentype = {
234 PyObject_HEAD_INIT(&PyType_Type)
235 0, /* ob_size */
236 "generator", /* tp_name */
237 sizeof(genobject), /* tp_basicsize */
238 0, /* tp_itemsize */
239 /* methods */
240 (destructor)gen_dealloc, /* tp_dealloc */
241 0, /* tp_print */
242 (getattrfunc)gen_getattr, /* tp_getattr */
243 0, /* tp_setattr */
244 0, /* tp_compare */
245 0, /* tp_repr */
246 0, /* tp_as_number */
247 0, /* tp_as_sequence */
248 0, /* tp_as_mapping */
249 0, /* tp_hash */
250 0, /* tp_call */
251 0, /* tp_str */
252 0, /* tp_getattro */
253 0, /* tp_setattro */
254 0, /* tp_as_buffer */
255 Py_TPFLAGS_DEFAULT, /* tp_flags */
256 0, /* tp_doc */
257 0, /* tp_traverse */
258 0, /* tp_clear */
259 0, /* tp_richcompare */
260 0, /* tp_weaklistoffset */
261 (getiterfunc)gen_getiter, /* tp_iter */
262 (iternextfunc)gen_iternext, /* tp_iternext */
263};
264
265
Guido van Rossume59214e1994-08-30 08:01:59 +0000266#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000267
Guido van Rossum2571cc81999-04-07 16:07:23 +0000268#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000269#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000270#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000271#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000272
Guido van Rossuma027efa1997-05-05 20:56:21 +0000273extern int _PyThread_Started; /* Flag for Py_Exit */
274
Guido van Rossum65d5b571998-12-21 19:32:43 +0000275static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000276static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000277
278void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000280{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000281 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000282 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000283 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000284 interpreter_lock = PyThread_allocate_lock();
285 PyThread_acquire_lock(interpreter_lock, 1);
286 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000287}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000288
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000290PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000291{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000292 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000293}
294
295void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000296PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000297{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000298 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000299}
300
301void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000302PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000303{
304 if (tstate == NULL)
305 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000306 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000307 if (PyThreadState_Swap(tstate) != NULL)
308 Py_FatalError(
309 "PyEval_AcquireThread: non-NULL old thread state");
310}
311
312void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000313PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000314{
315 if (tstate == NULL)
316 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
317 if (PyThreadState_Swap(NULL) != tstate)
318 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000319 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000320}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000321
322/* This function is called from PyOS_AfterFork to ensure that newly
323 created child processes don't hold locks referring to threads which
324 are not running in the child process. (This could also be done using
325 pthread_atfork mechanism, at least for the pthreads implementation.) */
326
327void
328PyEval_ReInitThreads(void)
329{
330 if (!interpreter_lock)
331 return;
332 /*XXX Can't use PyThread_free_lock here because it does too
333 much error-checking. Doing this cleanly would require
334 adding a new function to each thread_*.h. Instead, just
335 create a new lock and waste a little bit of memory */
336 interpreter_lock = PyThread_allocate_lock();
337 PyThread_acquire_lock(interpreter_lock, 1);
338 main_thread = PyThread_get_thread_ident();
339}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340#endif
341
Guido van Rossumff4949e1992-08-05 19:58:53 +0000342/* Functions save_thread and restore_thread are always defined so
343 dynamically loaded modules needn't be compiled separately for use
344 with and without threads: */
345
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000346PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000347PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000348{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000349 PyThreadState *tstate = PyThreadState_Swap(NULL);
350 if (tstate == NULL)
351 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000352#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000353 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000354 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000355#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000356 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000357}
358
359void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000360PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000361{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000362 if (tstate == NULL)
363 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000364#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000365 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000366 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000367 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000368 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000369 }
370#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000371 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000372}
373
374
Guido van Rossuma9672091994-09-14 13:31:22 +0000375/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
376 signal handlers or Mac I/O completion routines) can schedule calls
377 to a function to be called synchronously.
378 The synchronous function is called with one void* argument.
379 It should return 0 for success or -1 for failure -- failure should
380 be accompanied by an exception.
381
382 If registry succeeds, the registry function returns 0; if it fails
383 (e.g. due to too many pending calls) it returns -1 (without setting
384 an exception condition).
385
386 Note that because registry may occur from within signal handlers,
387 or other asynchronous events, calling malloc() is unsafe!
388
389#ifdef WITH_THREAD
390 Any thread can schedule pending calls, but only the main thread
391 will execute them.
392#endif
393
394 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
395 There are two possible race conditions:
396 (1) nested asynchronous registry calls;
397 (2) registry calls made while pending calls are being processed.
398 While (1) is very unlikely, (2) is a real possibility.
399 The current code is safe against (2), but not against (1).
400 The safety against (2) is derived from the fact that only one
401 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000402
Guido van Rossuma027efa1997-05-05 20:56:21 +0000403 XXX Darn! With the advent of thread state, we should have an array
404 of pending calls per thread in the thread state! Later...
405*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000406
Guido van Rossuma9672091994-09-14 13:31:22 +0000407#define NPENDINGCALLS 32
408static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000409 int (*func)(void *);
410 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411} pendingcalls[NPENDINGCALLS];
412static volatile int pendingfirst = 0;
413static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000415
416int
Thomas Wouters334fb892000-07-25 12:56:38 +0000417Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000418{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000419 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 int i, j;
421 /* XXX Begin critical section */
422 /* XXX If you want this to be safe against nested
423 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 if (busy)
425 return -1;
426 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 i = pendinglast;
428 j = (i + 1) % NPENDINGCALLS;
429 if (j == pendingfirst)
430 return -1; /* Queue full */
431 pendingcalls[i].func = func;
432 pendingcalls[i].arg = arg;
433 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000434 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000435 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000436 /* XXX End critical section */
437 return 0;
438}
439
Guido van Rossum180d7b41994-09-29 09:45:57 +0000440int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000441Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000442{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000445 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000446 return 0;
447#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000448 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000449 return 0;
450 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000451 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000452 for (;;) {
453 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000454 int (*func)(void *);
455 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000456 i = pendingfirst;
457 if (i == pendinglast)
458 break; /* Queue empty */
459 func = pendingcalls[i].func;
460 arg = pendingcalls[i].arg;
461 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000462 if (func(arg) < 0) {
463 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000464 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000465 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000466 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000467 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000468 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000469 return 0;
470}
471
472
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000473/* The interpreter's recursion limit */
474
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000475static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000476
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000477int
478Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000479{
480 return recursion_limit;
481}
482
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000483void
484Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000485{
486 recursion_limit = new_limit;
487}
488
Guido van Rossum374a9221991-04-04 10:40:29 +0000489/* Status code for main loop (reason for stack unwind) */
490
491enum why_code {
492 WHY_NOT, /* No error */
493 WHY_EXCEPTION, /* Exception occurred */
494 WHY_RERAISE, /* Exception re-raised by 'finally' */
495 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000496 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000497 WHY_CONTINUE, /* 'continue' statement */
498 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000499};
500
Tim Petersdbd9ba62000-07-09 03:09:57 +0000501static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000502static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000503
Guido van Rossum374a9221991-04-04 10:40:29 +0000504
Guido van Rossumb209a111997-04-29 18:18:01 +0000505PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000506PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000507{
508 return eval_code2(co,
509 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000510 (PyObject **)NULL, 0,
511 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000512 (PyObject **)NULL, 0,
513 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000514}
515
516
517/* Interpreter main loop */
518
Tim Peters5ca576e2001-06-18 22:08:13 +0000519PyObject *
520eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000521{
Guido van Rossum950361c1997-01-24 13:49:28 +0000522#ifdef DXPAIRS
523 int lastopcode = 0;
524#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000525 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000526 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000527 register int opcode=0; /* Current opcode */
528 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000529 register enum why_code why; /* Reason for block stack unwind */
530 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000531 register PyObject *x; /* Result object -- NULL if error */
532 register PyObject *v; /* Temporary objects popped off stack */
533 register PyObject *w;
534 register PyObject *u;
535 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000536 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000537 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000538 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000539 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000540 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000541 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000542#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000543 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000544#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000545#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000546 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000547 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000548#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000549
550/* Code access macros */
551
552#define GETCONST(i) Getconst(f, i)
553#define GETNAME(i) Getname(f, i)
554#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000555#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000556#define NEXTOP() (*next_instr++)
557#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000558#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000559#define JUMPBY(x) (next_instr += (x))
560
561/* Stack manipulation macros */
562
563#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
564#define EMPTY() (STACK_LEVEL() == 0)
565#define TOP() (stack_pointer[-1])
566#define BASIC_PUSH(v) (*stack_pointer++ = (v))
567#define BASIC_POP() (*--stack_pointer)
568
Guido van Rossum96a42c81992-01-12 02:29:51 +0000569#ifdef LLTRACE
570#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
571#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000572#else
573#define PUSH(v) BASIC_PUSH(v)
574#define POP() BASIC_POP()
575#endif
576
Guido van Rossum681d79a1995-07-18 14:51:37 +0000577/* Local variable macros */
578
579#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000580#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000581 GETLOCAL(i) = value; } while (0)
582
Guido van Rossuma027efa1997-05-05 20:56:21 +0000583/* Start of code */
584
Tim Peters5ca576e2001-06-18 22:08:13 +0000585 if (f == NULL)
586 return NULL;
587
Guido van Rossum8861b741996-07-30 16:49:37 +0000588#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000589 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000590 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000591 return NULL;
592 }
593#endif
594
Tim Peters5ca576e2001-06-18 22:08:13 +0000595 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000596 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000597 --tstate->recursion_depth;
598 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000599 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000601 return NULL;
602 }
603
Tim Peters5ca576e2001-06-18 22:08:13 +0000604 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000605 co = f->f_code;
606 fastlocals = f->f_localsplus;
607 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000608 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000609 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000610 stack_pointer = f->f_stacktop;
611 assert(stack_pointer != NULL);
612 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000613
614#ifdef LLTRACE
615 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
616#endif
617#if defined(Py_DEBUG) || defined(LLTRACE)
618 filename = PyString_AsString(co->co_filename);
619#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000620
Guido van Rossum374a9221991-04-04 10:40:29 +0000621 why = WHY_NOT;
622 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000623 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000624 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000625
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000627 /* Do periodic things. Doing this every time through
628 the loop would add too much overhead, so we do it
629 only every Nth instruction. We also do it if
630 ``things_to_do'' is set, i.e. when an asynchronous
631 event needs attention (e.g. a signal handler or
632 async I/O handler); see Py_AddPendingCall() and
633 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000634
Guido van Rossuma027efa1997-05-05 20:56:21 +0000635 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000636 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000637 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000638 if (Py_MakePendingCalls() < 0) {
639 why = WHY_EXCEPTION;
640 goto on_error;
641 }
642 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000643#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000644 /* If we have true signals, the signal handler
645 will call Py_AddPendingCall() so we don't
646 have to call sigcheck(). On the Mac and
647 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000648 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 goto on_error;
651 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000652#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000653
Guido van Rossume59214e1994-08-30 08:01:59 +0000654#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000655 if (interpreter_lock) {
656 /* Give another thread a chance */
657
Guido van Rossum25ce5661997-08-02 03:10:38 +0000658 if (PyThreadState_Swap(NULL) != tstate)
659 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000660 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000661
662 /* Other threads may run now */
663
Guido van Rossum65d5b571998-12-21 19:32:43 +0000664 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000665 if (PyThreadState_Swap(tstate) != NULL)
666 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 }
668#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000672
Guido van Rossum408027e1996-12-30 16:17:54 +0000673#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000674 f->f_lasti = INSTR_OFFSET();
675#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000676
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 opcode = NEXTOP();
678 if (HAS_ARG(opcode))
679 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000680 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000681#ifdef DYNAMIC_EXECUTION_PROFILE
682#ifdef DXPAIRS
683 dxpairs[lastopcode][opcode]++;
684 lastopcode = opcode;
685#endif
686 dxp[opcode]++;
687#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000688
Guido van Rossum96a42c81992-01-12 02:29:51 +0000689#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000691
Guido van Rossum96a42c81992-01-12 02:29:51 +0000692 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000693 if (HAS_ARG(opcode)) {
694 printf("%d: %d, %d\n",
695 (int) (INSTR_OFFSET() - 3),
696 opcode, oparg);
697 }
698 else {
699 printf("%d: %d\n",
700 (int) (INSTR_OFFSET() - 1), opcode);
701 }
702 }
703#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000705
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000707
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 /* BEWARE!
709 It is essential that any operation that fails sets either
710 x to NULL, err to nonzero, or why to anything but WHY_NOT,
711 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000712
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000714
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 case POP_TOP:
716 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000717 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000718 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000719
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 case ROT_TWO:
721 v = POP();
722 w = POP();
723 PUSH(v);
724 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000725 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000726
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 case ROT_THREE:
728 v = POP();
729 w = POP();
730 x = POP();
731 PUSH(v);
732 PUSH(x);
733 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000734 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000735
Thomas Wouters434d0822000-08-24 20:11:32 +0000736 case ROT_FOUR:
737 u = POP();
738 v = POP();
739 w = POP();
740 x = POP();
741 PUSH(u);
742 PUSH(x);
743 PUSH(w);
744 PUSH(v);
745 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000746
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 case DUP_TOP:
748 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000749 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000751 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000752
Thomas Wouters434d0822000-08-24 20:11:32 +0000753 case DUP_TOPX:
754 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000755 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000756 x = TOP();
757 Py_INCREF(x);
758 PUSH(x);
759 continue;
760 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000761 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000762 Py_INCREF(x);
763 w = TOP();
764 Py_INCREF(w);
765 PUSH(x);
766 PUSH(w);
767 PUSH(x);
768 continue;
769 case 3:
770 x = POP();
771 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000772 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000773 Py_INCREF(w);
774 v = TOP();
775 Py_INCREF(v);
776 PUSH(w);
777 PUSH(x);
778 PUSH(v);
779 PUSH(w);
780 PUSH(x);
781 continue;
782 case 4:
783 x = POP();
784 Py_INCREF(x);
785 w = POP();
786 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000787 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000788 Py_INCREF(v);
789 u = TOP();
790 Py_INCREF(u);
791 PUSH(v);
792 PUSH(w);
793 PUSH(x);
794 PUSH(u);
795 PUSH(v);
796 PUSH(w);
797 PUSH(x);
798 continue;
799 case 5:
800 x = POP();
801 Py_INCREF(x);
802 w = POP();
803 Py_INCREF(w);
804 v = POP();
805 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000806 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000807 Py_INCREF(u);
808 t = TOP();
809 Py_INCREF(t);
810 PUSH(u);
811 PUSH(v);
812 PUSH(w);
813 PUSH(x);
814 PUSH(t);
815 PUSH(u);
816 PUSH(v);
817 PUSH(w);
818 PUSH(x);
819 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000820 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000821 Py_FatalError("invalid argument to DUP_TOPX"
822 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000823 }
Tim Peters35ba6892000-10-11 07:04:49 +0000824 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000825
Guido van Rossum374a9221991-04-04 10:40:29 +0000826 case UNARY_POSITIVE:
827 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000828 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000829 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000830 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000831 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000833
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 case UNARY_NEGATIVE:
835 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000836 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000839 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000841
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 case UNARY_NOT:
843 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000844 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000845 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 if (err == 0) {
847 Py_INCREF(Py_True);
848 PUSH(Py_True);
849 continue;
850 }
851 else if (err > 0) {
852 Py_INCREF(Py_False);
853 PUSH(Py_False);
854 err = 0;
855 continue;
856 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000858
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 case UNARY_CONVERT:
860 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000861 x = PyObject_Repr(v);
862 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000863 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000864 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000866
Guido van Rossum7928cd71991-10-24 14:59:31 +0000867 case UNARY_INVERT:
868 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000869 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000870 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000871 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000872 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000873 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000874
Guido van Rossum50564e81996-01-12 01:13:16 +0000875 case BINARY_POWER:
876 w = POP();
877 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000878 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000879 Py_DECREF(v);
880 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000881 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000882 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000883 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000884
Guido van Rossum374a9221991-04-04 10:40:29 +0000885 case BINARY_MULTIPLY:
886 w = POP();
887 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000888 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000889 Py_DECREF(v);
890 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000894
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 case BINARY_DIVIDE:
896 w = POP();
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
900 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000904
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 case BINARY_MODULO:
906 w = POP();
907 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000908 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000909 Py_DECREF(v);
910 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000912 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000914
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 case BINARY_ADD:
916 w = POP();
917 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000918 if (PyInt_Check(v) && PyInt_Check(w)) {
919 /* INLINE: int + int */
920 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000921 a = PyInt_AS_LONG(v);
922 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000923 i = a + b;
924 if ((i^a) < 0 && (i^b) < 0) {
925 PyErr_SetString(PyExc_OverflowError,
926 "integer addition");
927 x = NULL;
928 }
929 else
930 x = PyInt_FromLong(i);
931 }
932 else
933 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000934 Py_DECREF(v);
935 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000936 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000937 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000939
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 case BINARY_SUBTRACT:
941 w = POP();
942 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000943 if (PyInt_Check(v) && PyInt_Check(w)) {
944 /* INLINE: int - int */
945 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000946 a = PyInt_AS_LONG(v);
947 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000948 i = a - b;
949 if ((i^a) < 0 && (i^~b) < 0) {
950 PyErr_SetString(PyExc_OverflowError,
951 "integer subtraction");
952 x = NULL;
953 }
954 else
955 x = PyInt_FromLong(i);
956 }
957 else
958 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(v);
960 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000962 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000964
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 case BINARY_SUBSCR:
966 w = POP();
967 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000968 if (PyList_Check(v) && PyInt_Check(w)) {
969 /* INLINE: list[int] */
970 long i = PyInt_AsLong(w);
971 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000972 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000973 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000974 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 PyErr_SetString(PyExc_IndexError,
976 "list index out of range");
977 x = NULL;
978 }
979 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000980 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000981 Py_INCREF(x);
982 }
983 }
984 else
985 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 Py_DECREF(v);
987 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000989 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000991
Guido van Rossum7928cd71991-10-24 14:59:31 +0000992 case BINARY_LSHIFT:
993 w = POP();
994 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000995 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000996 Py_DECREF(v);
997 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000998 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000999 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001001
Guido van Rossum7928cd71991-10-24 14:59:31 +00001002 case BINARY_RSHIFT:
1003 w = POP();
1004 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001005 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001006 Py_DECREF(v);
1007 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001009 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001010 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001011
Guido van Rossum7928cd71991-10-24 14:59:31 +00001012 case BINARY_AND:
1013 w = POP();
1014 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001015 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001016 Py_DECREF(v);
1017 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001018 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001019 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001020 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001021
Guido van Rossum7928cd71991-10-24 14:59:31 +00001022 case BINARY_XOR:
1023 w = POP();
1024 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001025 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001026 Py_DECREF(v);
1027 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001028 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001029 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001030 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001031
Guido van Rossum7928cd71991-10-24 14:59:31 +00001032 case BINARY_OR:
1033 w = POP();
1034 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001035 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001036 Py_DECREF(v);
1037 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001038 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001039 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001040 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001041
1042 case INPLACE_POWER:
1043 w = POP();
1044 v = POP();
1045 x = PyNumber_InPlacePower(v, w, Py_None);
1046 Py_DECREF(v);
1047 Py_DECREF(w);
1048 PUSH(x);
1049 if (x != NULL) continue;
1050 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001051
Thomas Wouters434d0822000-08-24 20:11:32 +00001052 case INPLACE_MULTIPLY:
1053 w = POP();
1054 v = POP();
1055 x = PyNumber_InPlaceMultiply(v, w);
1056 Py_DECREF(v);
1057 Py_DECREF(w);
1058 PUSH(x);
1059 if (x != NULL) continue;
1060 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001061
Thomas Wouters434d0822000-08-24 20:11:32 +00001062 case INPLACE_DIVIDE:
1063 w = POP();
1064 v = POP();
1065 x = PyNumber_InPlaceDivide(v, w);
1066 Py_DECREF(v);
1067 Py_DECREF(w);
1068 PUSH(x);
1069 if (x != NULL) continue;
1070 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001071
Thomas Wouters434d0822000-08-24 20:11:32 +00001072 case INPLACE_MODULO:
1073 w = POP();
1074 v = POP();
1075 x = PyNumber_InPlaceRemainder(v, w);
1076 Py_DECREF(v);
1077 Py_DECREF(w);
1078 PUSH(x);
1079 if (x != NULL) continue;
1080 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001081
Thomas Wouters434d0822000-08-24 20:11:32 +00001082 case INPLACE_ADD:
1083 w = POP();
1084 v = POP();
1085 if (PyInt_Check(v) && PyInt_Check(w)) {
1086 /* INLINE: int + int */
1087 register long a, b, i;
1088 a = PyInt_AS_LONG(v);
1089 b = PyInt_AS_LONG(w);
1090 i = a + b;
1091 if ((i^a) < 0 && (i^b) < 0) {
1092 PyErr_SetString(PyExc_OverflowError,
1093 "integer addition");
1094 x = NULL;
1095 }
1096 else
1097 x = PyInt_FromLong(i);
1098 }
1099 else
1100 x = PyNumber_InPlaceAdd(v, w);
1101 Py_DECREF(v);
1102 Py_DECREF(w);
1103 PUSH(x);
1104 if (x != NULL) continue;
1105 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001106
Thomas Wouters434d0822000-08-24 20:11:32 +00001107 case INPLACE_SUBTRACT:
1108 w = POP();
1109 v = POP();
1110 if (PyInt_Check(v) && PyInt_Check(w)) {
1111 /* INLINE: int - int */
1112 register long a, b, i;
1113 a = PyInt_AS_LONG(v);
1114 b = PyInt_AS_LONG(w);
1115 i = a - b;
1116 if ((i^a) < 0 && (i^~b) < 0) {
1117 PyErr_SetString(PyExc_OverflowError,
1118 "integer subtraction");
1119 x = NULL;
1120 }
1121 else
1122 x = PyInt_FromLong(i);
1123 }
1124 else
1125 x = PyNumber_InPlaceSubtract(v, w);
1126 Py_DECREF(v);
1127 Py_DECREF(w);
1128 PUSH(x);
1129 if (x != NULL) continue;
1130 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001131
Thomas Wouters434d0822000-08-24 20:11:32 +00001132 case INPLACE_LSHIFT:
1133 w = POP();
1134 v = POP();
1135 x = PyNumber_InPlaceLshift(v, w);
1136 Py_DECREF(v);
1137 Py_DECREF(w);
1138 PUSH(x);
1139 if (x != NULL) continue;
1140 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001141
Thomas Wouters434d0822000-08-24 20:11:32 +00001142 case INPLACE_RSHIFT:
1143 w = POP();
1144 v = POP();
1145 x = PyNumber_InPlaceRshift(v, w);
1146 Py_DECREF(v);
1147 Py_DECREF(w);
1148 PUSH(x);
1149 if (x != NULL) continue;
1150 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001151
Thomas Wouters434d0822000-08-24 20:11:32 +00001152 case INPLACE_AND:
1153 w = POP();
1154 v = POP();
1155 x = PyNumber_InPlaceAnd(v, w);
1156 Py_DECREF(v);
1157 Py_DECREF(w);
1158 PUSH(x);
1159 if (x != NULL) continue;
1160 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001161
Thomas Wouters434d0822000-08-24 20:11:32 +00001162 case INPLACE_XOR:
1163 w = POP();
1164 v = POP();
1165 x = PyNumber_InPlaceXor(v, w);
1166 Py_DECREF(v);
1167 Py_DECREF(w);
1168 PUSH(x);
1169 if (x != NULL) continue;
1170 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001171
Thomas Wouters434d0822000-08-24 20:11:32 +00001172 case INPLACE_OR:
1173 w = POP();
1174 v = POP();
1175 x = PyNumber_InPlaceOr(v, w);
1176 Py_DECREF(v);
1177 Py_DECREF(w);
1178 PUSH(x);
1179 if (x != NULL) continue;
1180 break;
1181
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 case SLICE+0:
1183 case SLICE+1:
1184 case SLICE+2:
1185 case SLICE+3:
1186 if ((opcode-SLICE) & 2)
1187 w = POP();
1188 else
1189 w = NULL;
1190 if ((opcode-SLICE) & 1)
1191 v = POP();
1192 else
1193 v = NULL;
1194 u = POP();
1195 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 Py_DECREF(u);
1197 Py_XDECREF(v);
1198 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001200 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001202
Guido van Rossum374a9221991-04-04 10:40:29 +00001203 case STORE_SLICE+0:
1204 case STORE_SLICE+1:
1205 case STORE_SLICE+2:
1206 case STORE_SLICE+3:
1207 if ((opcode-STORE_SLICE) & 2)
1208 w = POP();
1209 else
1210 w = NULL;
1211 if ((opcode-STORE_SLICE) & 1)
1212 v = POP();
1213 else
1214 v = NULL;
1215 u = POP();
1216 t = POP();
1217 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001218 Py_DECREF(t);
1219 Py_DECREF(u);
1220 Py_XDECREF(v);
1221 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001222 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001224
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 case DELETE_SLICE+0:
1226 case DELETE_SLICE+1:
1227 case DELETE_SLICE+2:
1228 case DELETE_SLICE+3:
1229 if ((opcode-DELETE_SLICE) & 2)
1230 w = POP();
1231 else
1232 w = NULL;
1233 if ((opcode-DELETE_SLICE) & 1)
1234 v = POP();
1235 else
1236 v = NULL;
1237 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001238 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001240 Py_DECREF(u);
1241 Py_XDECREF(v);
1242 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001243 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001245
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 case STORE_SUBSCR:
1247 w = POP();
1248 v = POP();
1249 u = POP();
1250 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001251 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001252 Py_DECREF(u);
1253 Py_DECREF(v);
1254 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001255 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001257
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 case DELETE_SUBSCR:
1259 w = POP();
1260 v = POP();
1261 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001262 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_DECREF(v);
1264 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001265 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001267
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 case PRINT_EXPR:
1269 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001270 w = PySys_GetObject("displayhook");
1271 if (w == NULL) {
1272 PyErr_SetString(PyExc_RuntimeError,
1273 "lost sys.displayhook");
1274 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001275 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001276 }
1277 if (err == 0) {
1278 x = Py_BuildValue("(O)", v);
1279 if (x == NULL)
1280 err = -1;
1281 }
1282 if (err == 0) {
1283 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001284 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001285 if (w == NULL)
1286 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001289 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001291
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001292 case PRINT_ITEM_TO:
1293 w = stream = POP();
1294 /* fall through to PRINT_ITEM */
1295
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 case PRINT_ITEM:
1297 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001298 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001299 w = PySys_GetObject("stdout");
1300 if (w == NULL) {
1301 PyErr_SetString(PyExc_RuntimeError,
1302 "lost sys.stdout");
1303 err = -1;
1304 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001305 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001306 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001307 err = PyFile_WriteString(" ", w);
1308 if (err == 0)
1309 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001311 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 char *s = PyString_AsString(v);
1313 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001314 if (len > 0 &&
1315 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001316 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001317 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001320 Py_XDECREF(stream);
1321 stream = NULL;
1322 if (err == 0)
1323 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001325
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001326 case PRINT_NEWLINE_TO:
1327 w = stream = POP();
1328 /* fall through to PRINT_NEWLINE */
1329
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001331 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001332 w = PySys_GetObject("stdout");
1333 if (w == NULL)
1334 PyErr_SetString(PyExc_RuntimeError,
1335 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001336 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001337 if (w != NULL) {
1338 err = PyFile_WriteString("\n", w);
1339 if (err == 0)
1340 PyFile_SoftSpace(w, 0);
1341 }
1342 Py_XDECREF(stream);
1343 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001345
Thomas Wouters434d0822000-08-24 20:11:32 +00001346
1347#ifdef CASE_TOO_BIG
1348 default: switch (opcode) {
1349#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 case BREAK_LOOP:
1351 why = WHY_BREAK;
1352 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001353
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001354 case CONTINUE_LOOP:
1355 retval = PyInt_FromLong(oparg);
1356 why = WHY_CONTINUE;
1357 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001358
Guido van Rossumf10570b1995-07-07 22:53:21 +00001359 case RAISE_VARARGS:
1360 u = v = w = NULL;
1361 switch (oparg) {
1362 case 3:
1363 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001364 /* Fallthrough */
1365 case 2:
1366 v = POP(); /* value */
1367 /* Fallthrough */
1368 case 1:
1369 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001370 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001371 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001372 break;
1373 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001374 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001375 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001376 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001377 break;
1378 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001380
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001382 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001383 PyErr_SetString(PyExc_SystemError,
1384 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001385 break;
1386 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001387 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001388 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001390
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 case RETURN_VALUE:
1392 retval = POP();
1393 why = WHY_RETURN;
1394 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001395
Tim Peters5ca576e2001-06-18 22:08:13 +00001396 case YIELD_VALUE:
1397 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001398 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001399 f->f_lasti = INSTR_OFFSET();
1400 why = WHY_YIELD;
1401 break;
1402
1403
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001404 case EXEC_STMT:
1405 w = POP();
1406 v = POP();
1407 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001408 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 Py_DECREF(u);
1410 Py_DECREF(v);
1411 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001412 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001413
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 case POP_BLOCK:
1415 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 while (STACK_LEVEL() > b->b_level) {
1418 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 }
1421 }
1422 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001423
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 case END_FINALLY:
1425 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 if (PyInt_Check(v)) {
1427 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001428 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001429 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001430 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 retval = POP();
1432 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001435 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001438 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 else if (v != Py_None) {
1441 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 "'finally' pops bad exception");
1443 why = WHY_EXCEPTION;
1444 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001447
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001449 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001451 w = POP();
1452 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001454 Py_DECREF(u);
1455 Py_DECREF(v);
1456 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001458
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 case STORE_NAME:
1460 w = GETNAMEV(oparg);
1461 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001462 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001463 PyErr_Format(PyExc_SystemError,
1464 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001465 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001466 break;
1467 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 err = PyDict_SetItem(x, w, v);
1469 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001471
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001473 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001474 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001475 PyErr_Format(PyExc_SystemError,
1476 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001477 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001478 break;
1479 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001481 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001482 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001484
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001485 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001487 if (PyTuple_Check(v)) {
1488 if (PyTuple_Size(v) != oparg) {
1489 PyErr_SetString(PyExc_ValueError,
1490 "unpack tuple of wrong size");
1491 why = WHY_EXCEPTION;
1492 }
1493 else {
1494 for (; --oparg >= 0; ) {
1495 w = PyTuple_GET_ITEM(v, oparg);
1496 Py_INCREF(w);
1497 PUSH(w);
1498 }
1499 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001501 else if (PyList_Check(v)) {
1502 if (PyList_Size(v) != oparg) {
1503 PyErr_SetString(PyExc_ValueError,
1504 "unpack list of wrong size");
1505 why = WHY_EXCEPTION;
1506 }
1507 else {
1508 for (; --oparg >= 0; ) {
1509 w = PyList_GET_ITEM(v, oparg);
1510 Py_INCREF(w);
1511 PUSH(w);
1512 }
1513 }
1514 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001515 else if (unpack_iterable(v, oparg,
1516 stack_pointer + oparg))
1517 stack_pointer += oparg;
1518 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001519 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001522
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001524 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 v = POP();
1526 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1528 Py_DECREF(v);
1529 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001531
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001533 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001535 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1536 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001539
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001540 case STORE_GLOBAL:
1541 w = GETNAMEV(oparg);
1542 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 err = PyDict_SetItem(f->f_globals, w, v);
1544 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001545 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001546
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001547 case DELETE_GLOBAL:
1548 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001550 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001551 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001552 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001553
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 case LOAD_CONST:
1555 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 PUSH(x);
1558 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001559
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001561 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001562 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001563 PyErr_Format(PyExc_SystemError,
1564 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001565 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001566 break;
1567 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001570 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001574 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001575 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001576 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
1578 }
1579 }
1580 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 PUSH(x);
1583 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001584
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001586 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001591 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001592 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001593 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 break;
1595 }
1596 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001597 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 PUSH(x);
1599 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600
Guido van Rossum9bfef441993-03-29 10:43:31 +00001601 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001602 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001603 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001604 format_exc_check_arg(
1605 PyExc_UnboundLocalError,
1606 UNBOUNDLOCAL_ERROR_MSG,
1607 PyTuple_GetItem(co->co_varnames, oparg)
1608 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001609 break;
1610 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001612 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001613 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001614 break;
1615
1616 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001617 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001619 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001620
1621 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001622 x = GETLOCAL(oparg);
1623 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001624 format_exc_check_arg(
1625 PyExc_UnboundLocalError,
1626 UNBOUNDLOCAL_ERROR_MSG,
1627 PyTuple_GetItem(co->co_varnames, oparg)
1628 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001629 break;
1630 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001631 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001632 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001633
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001634 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001635 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001636 Py_INCREF(x);
1637 PUSH(x);
1638 break;
1639
1640 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001641 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001642 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001643 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001644 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001645 v = PyTuple_GetItem(co->co_cellvars,
1646 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001647 format_exc_check_arg(
1648 PyExc_UnboundLocalError,
1649 UNBOUNDLOCAL_ERROR_MSG,
1650 v);
1651 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001652 v = PyTuple_GetItem(
1653 co->co_freevars,
1654 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001655 format_exc_check_arg(
1656 PyExc_NameError,
1657 UNBOUNDFREE_ERROR_MSG,
1658 v);
1659 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001660 err = -1;
1661 break;
1662 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001663 PUSH(w);
1664 break;
1665
1666 case STORE_DEREF:
1667 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001668 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001669 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001670 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001671 continue;
1672
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 if (x != NULL) {
1676 for (; --oparg >= 0;) {
1677 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 }
1680 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001681 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 }
1683 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001684
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001686 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 if (x != NULL) {
1688 for (; --oparg >= 0;) {
1689 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001690 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 }
1692 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001693 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 }
1695 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001696
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001700 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001702
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001704 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 x = PyObject_GetAttr(v, w);
1707 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001709 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001711
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 case COMPARE_OP:
1713 w = POP();
1714 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001715 if (PyInt_Check(v) && PyInt_Check(w)) {
1716 /* INLINE: cmp(int, int) */
1717 register long a, b;
1718 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001719 a = PyInt_AS_LONG(v);
1720 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001721 switch (oparg) {
1722 case LT: res = a < b; break;
1723 case LE: res = a <= b; break;
1724 case EQ: res = a == b; break;
1725 case NE: res = a != b; break;
1726 case GT: res = a > b; break;
1727 case GE: res = a >= b; break;
1728 case IS: res = v == w; break;
1729 case IS_NOT: res = v != w; break;
1730 default: goto slow_compare;
1731 }
1732 x = res ? Py_True : Py_False;
1733 Py_INCREF(x);
1734 }
1735 else {
1736 slow_compare:
1737 x = cmp_outcome(oparg, v, w);
1738 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 Py_DECREF(v);
1740 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001742 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001744
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001746 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001748 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001750 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001751 break;
1752 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001753 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001754 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001755 w,
1756 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001757 f->f_locals == NULL ?
1758 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001759 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001761 if (w == NULL) {
1762 x = NULL;
1763 break;
1764 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 x = PyEval_CallObject(x, w);
1766 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001767 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001768 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001770
Thomas Wouters52152252000-08-17 22:55:00 +00001771 case IMPORT_STAR:
1772 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001773 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001774 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001775 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001776 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001777 break;
1778 }
Thomas Wouters52152252000-08-17 22:55:00 +00001779 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001780 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001781 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001782 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001784
Thomas Wouters52152252000-08-17 22:55:00 +00001785 case IMPORT_FROM:
1786 w = GETNAMEV(oparg);
1787 v = TOP();
1788 x = import_from(v, w);
1789 PUSH(x);
1790 if (x != NULL) continue;
1791 break;
1792
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 case JUMP_FORWARD:
1794 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001795 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001796
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001798 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001799 if (err > 0)
1800 err = 0;
1801 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001803 else
1804 break;
1805 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001806
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001809 if (err > 0) {
1810 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001812 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001813 else if (err == 0)
1814 ;
1815 else
1816 break;
1817 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001818
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 case JUMP_ABSOLUTE:
1820 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001821 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001822
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001823 case GET_ITER:
1824 /* before: [obj]; after [getiter(obj)] */
1825 v = POP();
1826 x = PyObject_GetIter(v);
1827 Py_DECREF(v);
1828 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001829 PUSH(x);
1830 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001831 }
1832 break;
1833
1834 case FOR_ITER:
1835 /* before: [iter]; after: [iter, iter()] *or* [] */
1836 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001837 x = PyIter_Next(v);
1838 if (x != NULL) {
1839 PUSH(x);
1840 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001841 }
Tim Petersf4848da2001-05-05 00:14:56 +00001842 if (!PyErr_Occurred()) {
1843 /* iterator ended normally */
1844 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001845 Py_DECREF(v);
1846 JUMPBY(oparg);
1847 continue;
1848 }
1849 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001850
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 case FOR_LOOP:
1852 /* for v in s: ...
1853 On entry: stack contains s, i.
1854 On exit: stack contains s, i+1, s[i];
1855 but if loop exhausted:
1856 s, i are popped, and we jump */
1857 w = POP(); /* Loop index */
1858 v = POP(); /* Sequence object */
1859 u = loop_subscript(v, w);
1860 if (u != NULL) {
1861 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001862 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001866 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 }
1868 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001869 Py_DECREF(v);
1870 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 /* A NULL can mean "s exhausted"
1872 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001873 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001874 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001875 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001876 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001877 continue;
1878 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 }
1880 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001881
Guido van Rossum374a9221991-04-04 10:40:29 +00001882 case SETUP_LOOP:
1883 case SETUP_EXCEPT:
1884 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001885 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001886 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001887 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001888
Guido van Rossum374a9221991-04-04 10:40:29 +00001889 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001890#ifdef LLTRACE
1891 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001892 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001893#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001894 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001895 if (f->f_trace == NULL)
1896 continue;
1897 /* Trace each line of code reached */
1898 f->f_lasti = INSTR_OFFSET();
1899 err = call_trace(&f->f_trace, &f->f_trace,
Fred Draked0838392001-06-16 21:02:31 +00001900 f, str_line, Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001901 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001902
1903 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001904 {
1905 int na = oparg & 0xff;
1906 int nk = (oparg>>8) & 0xff;
1907 int n = na + 2 * nk;
1908 PyObject **pfunc = stack_pointer - n - 1;
1909 PyObject *func = *pfunc;
1910 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1911
1912 /* Always dispatch PyCFunction first, because
1913 these are presumed to be the most frequent
1914 callable object.
1915 */
1916 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001917 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001918 if (flags > 1 || nk != 0)
1919 x = do_call(func, &stack_pointer,
1920 na, nk);
1921 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001922 PyObject *callargs;
1923 callargs = load_args(&stack_pointer, na);
1924 x = call_cfunction(func, callargs, NULL);
1925 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001926 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001927 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001928 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001929 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001930 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001931 && PyMethod_GET_SELF(func) != NULL) {
1932 /* optimize access to bound methods */
1933 PyObject *self = PyMethod_GET_SELF(func);
1934 Py_INCREF(self);
1935 func = PyMethod_GET_FUNCTION(func);
1936 Py_INCREF(func);
1937 Py_DECREF(*pfunc);
1938 *pfunc = self;
1939 na++;
1940 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001941 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001942 Py_INCREF(func);
1943 if (PyFunction_Check(func)) {
1944 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001945 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001946 } else {
1947 x = do_call(func, &stack_pointer,
1948 na, nk);
1949 }
1950 Py_DECREF(func);
1951 }
1952
1953 while (stack_pointer > pfunc) {
1954 w = POP();
1955 Py_DECREF(w);
1956 }
1957 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001958 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001959 continue;
1960 break;
1961 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001962
Jeremy Hylton76901512000-03-28 23:49:17 +00001963 case CALL_FUNCTION_VAR:
1964 case CALL_FUNCTION_KW:
1965 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001966 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001967 int na = oparg & 0xff;
1968 int nk = (oparg>>8) & 0xff;
1969 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001970 int n = na + 2 * nk;
1971 PyObject **pfunc, *func;
1972 if (flags & CALL_FLAG_VAR)
1973 n++;
1974 if (flags & CALL_FLAG_KW)
1975 n++;
1976 pfunc = stack_pointer - n - 1;
1977 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001978 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001979
Guido van Rossumac7be682001-01-17 15:42:30 +00001980 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001981 && PyMethod_GET_SELF(func) != NULL) {
1982 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001983 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001984 func = PyMethod_GET_FUNCTION(func);
1985 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001986 Py_DECREF(*pfunc);
1987 *pfunc = self;
1988 na++;
1989 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001990 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001991 Py_INCREF(func);
1992 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001993 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001994
Jeremy Hylton76901512000-03-28 23:49:17 +00001995 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 w = POP();
1997 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001998 }
1999 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002000 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002001 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002002 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002003 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002004
Guido van Rossum681d79a1995-07-18 14:51:37 +00002005 case MAKE_FUNCTION:
2006 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 x = PyFunction_New(v, f->f_globals);
2008 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002009 /* XXX Maybe this should be a separate opcode? */
2010 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002011 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002012 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002013 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002014 x = NULL;
2015 break;
2016 }
2017 while (--oparg >= 0) {
2018 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002020 }
2021 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002022 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002023 }
2024 PUSH(x);
2025 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002026
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002027 case MAKE_CLOSURE:
2028 {
2029 int nfree;
2030 v = POP(); /* code object */
2031 x = PyFunction_New(v, f->f_globals);
2032 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2033 Py_DECREF(v);
2034 /* XXX Maybe this should be a separate opcode? */
2035 if (x != NULL && nfree > 0) {
2036 v = PyTuple_New(nfree);
2037 if (v == NULL) {
2038 Py_DECREF(x);
2039 x = NULL;
2040 break;
2041 }
2042 while (--nfree >= 0) {
2043 w = POP();
2044 PyTuple_SET_ITEM(v, nfree, w);
2045 }
2046 err = PyFunction_SetClosure(x, v);
2047 Py_DECREF(v);
2048 }
2049 if (x != NULL && oparg > 0) {
2050 v = PyTuple_New(oparg);
2051 if (v == NULL) {
2052 Py_DECREF(x);
2053 x = NULL;
2054 break;
2055 }
2056 while (--oparg >= 0) {
2057 w = POP();
2058 PyTuple_SET_ITEM(v, oparg, w);
2059 }
2060 err = PyFunction_SetDefaults(x, v);
2061 Py_DECREF(v);
2062 }
2063 PUSH(x);
2064 break;
2065 }
2066
Guido van Rossum8861b741996-07-30 16:49:37 +00002067 case BUILD_SLICE:
2068 if (oparg == 3)
2069 w = POP();
2070 else
2071 w = NULL;
2072 v = POP();
2073 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002074 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 Py_DECREF(u);
2076 Py_DECREF(v);
2077 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002078 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002079 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002080 break;
2081
Fred Drakeef8ace32000-08-24 00:32:09 +00002082 case EXTENDED_ARG:
2083 opcode = NEXTOP();
2084 oparg = oparg<<16 | NEXTARG();
2085 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002086
Guido van Rossum374a9221991-04-04 10:40:29 +00002087 default:
2088 fprintf(stderr,
2089 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002090 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002091 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002092 why = WHY_EXCEPTION;
2093 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002094
2095#ifdef CASE_TOO_BIG
2096 }
2097#endif
2098
Guido van Rossum374a9221991-04-04 10:40:29 +00002099 } /* switch */
2100
2101 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002102
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002104
Guido van Rossum374a9221991-04-04 10:40:29 +00002105 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002106 if (err == 0 && x != NULL) {
2107#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002108 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002109 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002110 fprintf(stderr,
2111 "XXX undetected error\n");
2112 else
2113#endif
2114 continue; /* Normal, fast path */
2115 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002117 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002118 err = 0;
2119 }
2120
Guido van Rossum374a9221991-04-04 10:40:29 +00002121 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002122
Guido van Rossum374a9221991-04-04 10:40:29 +00002123 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002125 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002126 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 why = WHY_EXCEPTION;
2128 }
2129 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002130#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002131 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002132 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002134 fprintf(stderr,
2135 "XXX undetected error (why=%d)\n",
2136 why);
2137 why = WHY_EXCEPTION;
2138 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 }
2140#endif
2141
2142 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002143
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002145 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002147 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002149
Guido van Rossume59214e1994-08-30 08:01:59 +00002150 if (f->f_trace)
2151 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002152 if (tstate->sys_profilefunc)
2153 call_exc_trace(&tstate->sys_profilefunc,
2154 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002155 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002156
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002158
Guido van Rossum374a9221991-04-04 10:40:29 +00002159 if (why == WHY_RERAISE)
2160 why = WHY_EXCEPTION;
2161
2162 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002163
Tim Peters5ca576e2001-06-18 22:08:13 +00002164 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002166
2167 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2168 /* For a continue inside a try block,
2169 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002170 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002171 b->b_handler);
2172 why = WHY_NOT;
2173 JUMPTO(PyInt_AS_LONG(retval));
2174 Py_DECREF(retval);
2175 break;
2176 }
2177
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 while (STACK_LEVEL() > b->b_level) {
2179 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 }
2182 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2183 why = WHY_NOT;
2184 JUMPTO(b->b_handler);
2185 break;
2186 }
2187 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002188 (b->b_type == SETUP_EXCEPT &&
2189 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 PyObject *exc, *val, *tb;
2192 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002193 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002194 val = Py_None;
2195 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 /* Make the raw exception data
2198 available to the handler,
2199 so a program can emulate the
2200 Python main loop. Don't do
2201 this for 'finally'. */
2202 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002203 PyErr_NormalizeException(
2204 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002205 set_exc_info(tstate,
2206 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002208 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002209 PUSH(val);
2210 PUSH(exc);
2211 }
2212 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002213 if (why == WHY_RETURN ||
2214 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002215 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002217 PUSH(v);
2218 }
2219 why = WHY_NOT;
2220 JUMPTO(b->b_handler);
2221 break;
2222 }
2223 } /* unwind stack */
2224
2225 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002226
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 if (why != WHY_NOT)
2228 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002229
Guido van Rossum374a9221991-04-04 10:40:29 +00002230 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002231
Tim Peters5ca576e2001-06-18 22:08:13 +00002232 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002233 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002234
Guido van Rossume59214e1994-08-30 08:01:59 +00002235 if (f->f_trace) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002236 if (why == WHY_RETURN || why == WHY_YIELD) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002237 if (call_trace(&f->f_trace, &f->f_trace, f,
Fred Draked0838392001-06-16 21:02:31 +00002238 str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002239 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002240 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002241 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002242 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002243 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002244 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002245
Tim Peters5ca576e2001-06-18 22:08:13 +00002246 if (tstate->sys_profilefunc &&
2247 (why == WHY_RETURN || why == WHY_YIELD)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002248 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Fred Draked0838392001-06-16 21:02:31 +00002249 f, str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002250 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002251 retval = NULL;
2252 why = WHY_EXCEPTION;
2253 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002254 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002255
Guido van Rossuma027efa1997-05-05 20:56:21 +00002256 reset_exc_info(tstate);
2257
Tim Peters5ca576e2001-06-18 22:08:13 +00002258 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002259 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002260 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002261
Guido van Rossum96a42c81992-01-12 02:29:51 +00002262 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002263}
2264
Tim Peters5ca576e2001-06-18 22:08:13 +00002265static PyObject *
2266eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2267 PyObject **args, int argcount, PyObject **kws, int kwcount,
2268 PyObject **defs, int defcount, PyObject *closure)
2269{
2270 register PyFrameObject *f;
2271 register PyObject *retval = NULL;
2272 register PyObject **fastlocals, **freevars;
2273 PyThreadState *tstate = PyThreadState_GET();
2274 PyObject *x, *u;
2275
2276 if (globals == NULL) {
2277 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2278 return NULL;
2279 }
2280
2281 f = PyFrame_New(tstate, /*back*/
2282 co, /*code*/
2283 globals, locals);
2284 if (f == NULL)
2285 return NULL;
2286
2287 fastlocals = f->f_localsplus;
2288 freevars = f->f_localsplus + f->f_nlocals;
2289
2290 if (co->co_argcount > 0 ||
2291 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2292 int i;
2293 int n = argcount;
2294 PyObject *kwdict = NULL;
2295 if (co->co_flags & CO_VARKEYWORDS) {
2296 kwdict = PyDict_New();
2297 if (kwdict == NULL)
2298 goto fail;
2299 i = co->co_argcount;
2300 if (co->co_flags & CO_VARARGS)
2301 i++;
2302 SETLOCAL(i, kwdict);
2303 }
2304 if (argcount > co->co_argcount) {
2305 if (!(co->co_flags & CO_VARARGS)) {
2306 PyErr_Format(PyExc_TypeError,
2307 "%.200s() takes %s %d "
2308 "%sargument%s (%d given)",
2309 PyString_AsString(co->co_name),
2310 defcount ? "at most" : "exactly",
2311 co->co_argcount,
2312 kwcount ? "non-keyword " : "",
2313 co->co_argcount == 1 ? "" : "s",
2314 argcount);
2315 goto fail;
2316 }
2317 n = co->co_argcount;
2318 }
2319 for (i = 0; i < n; i++) {
2320 x = args[i];
2321 Py_INCREF(x);
2322 SETLOCAL(i, x);
2323 }
2324 if (co->co_flags & CO_VARARGS) {
2325 u = PyTuple_New(argcount - n);
2326 if (u == NULL)
2327 goto fail;
2328 SETLOCAL(co->co_argcount, u);
2329 for (i = n; i < argcount; i++) {
2330 x = args[i];
2331 Py_INCREF(x);
2332 PyTuple_SET_ITEM(u, i-n, x);
2333 }
2334 }
2335 for (i = 0; i < kwcount; i++) {
2336 PyObject *keyword = kws[2*i];
2337 PyObject *value = kws[2*i + 1];
2338 int j;
2339 if (keyword == NULL || !PyString_Check(keyword)) {
2340 PyErr_Format(PyExc_TypeError,
2341 "%.200s() keywords must be strings",
2342 PyString_AsString(co->co_name));
2343 goto fail;
2344 }
2345 /* XXX slow -- speed up using dictionary? */
2346 for (j = 0; j < co->co_argcount; j++) {
2347 PyObject *nm = PyTuple_GET_ITEM(
2348 co->co_varnames, j);
2349 int cmp = PyObject_RichCompareBool(
2350 keyword, nm, Py_EQ);
2351 if (cmp > 0)
2352 break;
2353 else if (cmp < 0)
2354 goto fail;
2355 }
2356 /* Check errors from Compare */
2357 if (PyErr_Occurred())
2358 goto fail;
2359 if (j >= co->co_argcount) {
2360 if (kwdict == NULL) {
2361 PyErr_Format(PyExc_TypeError,
2362 "%.200s() got an unexpected "
2363 "keyword argument '%.400s'",
2364 PyString_AsString(co->co_name),
2365 PyString_AsString(keyword));
2366 goto fail;
2367 }
2368 PyDict_SetItem(kwdict, keyword, value);
2369 }
2370 else {
2371 if (GETLOCAL(j) != NULL) {
2372 PyErr_Format(PyExc_TypeError,
2373 "%.200s() got multiple "
2374 "values for keyword "
2375 "argument '%.400s'",
2376 PyString_AsString(co->co_name),
2377 PyString_AsString(keyword));
2378 goto fail;
2379 }
2380 Py_INCREF(value);
2381 SETLOCAL(j, value);
2382 }
2383 }
2384 if (argcount < co->co_argcount) {
2385 int m = co->co_argcount - defcount;
2386 for (i = argcount; i < m; i++) {
2387 if (GETLOCAL(i) == NULL) {
2388 PyErr_Format(PyExc_TypeError,
2389 "%.200s() takes %s %d "
2390 "%sargument%s (%d given)",
2391 PyString_AsString(co->co_name),
2392 ((co->co_flags & CO_VARARGS) ||
2393 defcount) ? "at least"
2394 : "exactly",
2395 m, kwcount ? "non-keyword " : "",
2396 m == 1 ? "" : "s", i);
2397 goto fail;
2398 }
2399 }
2400 if (n > m)
2401 i = n - m;
2402 else
2403 i = 0;
2404 for (; i < defcount; i++) {
2405 if (GETLOCAL(m+i) == NULL) {
2406 PyObject *def = defs[i];
2407 Py_INCREF(def);
2408 SETLOCAL(m+i, def);
2409 }
2410 }
2411 }
2412 }
2413 else {
2414 if (argcount > 0 || kwcount > 0) {
2415 PyErr_Format(PyExc_TypeError,
2416 "%.200s() takes no arguments (%d given)",
2417 PyString_AsString(co->co_name),
2418 argcount + kwcount);
2419 goto fail;
2420 }
2421 }
2422 /* Allocate and initialize storage for cell vars, and copy free
2423 vars into frame. This isn't too efficient right now. */
2424 if (f->f_ncells) {
2425 int i = 0, j = 0, nargs, found;
2426 char *cellname, *argname;
2427 PyObject *c;
2428
2429 nargs = co->co_argcount;
2430 if (co->co_flags & CO_VARARGS)
2431 nargs++;
2432 if (co->co_flags & CO_VARKEYWORDS)
2433 nargs++;
2434
2435 /* Check for cells that shadow args */
2436 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2437 cellname = PyString_AS_STRING(
2438 PyTuple_GET_ITEM(co->co_cellvars, i));
2439 found = 0;
2440 while (j < nargs) {
2441 argname = PyString_AS_STRING(
2442 PyTuple_GET_ITEM(co->co_varnames, j));
2443 if (strcmp(cellname, argname) == 0) {
2444 c = PyCell_New(GETLOCAL(j));
2445 if (c == NULL)
2446 goto fail;
2447 GETLOCAL(f->f_nlocals + i) = c;
2448 found = 1;
2449 break;
2450 }
2451 j++;
2452 }
2453 if (found == 0) {
2454 c = PyCell_New(NULL);
2455 if (c == NULL)
2456 goto fail;
2457 SETLOCAL(f->f_nlocals + i, c);
2458 }
2459 }
2460 /* Initialize any that are left */
2461 while (i < f->f_ncells) {
2462 c = PyCell_New(NULL);
2463 if (c == NULL)
2464 goto fail;
2465 SETLOCAL(f->f_nlocals + i, c);
2466 i++;
2467 }
2468 }
2469 if (f->f_nfreevars) {
2470 int i;
2471 for (i = 0; i < f->f_nfreevars; ++i) {
2472 PyObject *o = PyTuple_GET_ITEM(closure, i);
2473 Py_INCREF(o);
2474 freevars[f->f_ncells + i] = o;
2475 }
2476 }
2477
2478 if (tstate->sys_tracefunc != NULL) {
2479 /* tstate->sys_tracefunc, if defined, is a function that
2480 will be called on *every* entry to a code block.
2481 Its return value, if not None, is a function that
2482 will be called at the start of each executed line
2483 of code. (Actually, the function must return
2484 itself in order to continue tracing.)
2485 The trace functions are called with three arguments:
2486 a pointer to the current frame, a string indicating
2487 why the function is called, and an argument which
2488 depends on the situation. The global trace function
2489 (sys.trace) is also called whenever an exception
2490 is detected. */
2491 if (call_trace(&tstate->sys_tracefunc,
2492 &f->f_trace, f, str_call,
2493 Py_None/*XXX how to compute arguments now?*/)) {
2494 /* Trace function raised an error */
2495 goto fail;
2496 }
2497 }
2498
2499 if (tstate->sys_profilefunc != NULL) {
2500 /* Similar for sys_profilefunc, except it needn't return
2501 itself and isn't called for "line" events */
2502 if (call_trace(&tstate->sys_profilefunc,
2503 (PyObject**)0, f, str_call,
2504 Py_None/*XXX*/)) {
2505 goto fail;
2506 }
2507 }
2508
2509 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002510 /* Don't need to keep the reference to f_back, it will be set
2511 * when the generator is resumed. */
2512 Py_DECREF(f->f_back);
2513 f->f_back = NULL;
2514
2515 /* Create a new generator that owns the ready to run frame
2516 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002517 return gen_new(f);
2518 }
2519
2520 retval = eval_frame(f);
2521
2522 fail: /* Jump here from prelude on failure */
2523
2524 Py_DECREF(f);
2525 return retval;
2526}
2527
2528
Guido van Rossuma027efa1997-05-05 20:56:21 +00002529static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002530set_exc_info(PyThreadState *tstate,
2531 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002532{
2533 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002534 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002535
Guido van Rossuma027efa1997-05-05 20:56:21 +00002536 frame = tstate->frame;
2537 if (frame->f_exc_type == NULL) {
2538 /* This frame didn't catch an exception before */
2539 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002540 if (tstate->exc_type == NULL) {
2541 Py_INCREF(Py_None);
2542 tstate->exc_type = Py_None;
2543 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002544 tmp_type = frame->f_exc_type;
2545 tmp_value = frame->f_exc_value;
2546 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002547 Py_XINCREF(tstate->exc_type);
2548 Py_XINCREF(tstate->exc_value);
2549 Py_XINCREF(tstate->exc_traceback);
2550 frame->f_exc_type = tstate->exc_type;
2551 frame->f_exc_value = tstate->exc_value;
2552 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002553 Py_XDECREF(tmp_type);
2554 Py_XDECREF(tmp_value);
2555 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002556 }
2557 /* Set new exception for this thread */
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(type);
2562 Py_XINCREF(value);
2563 Py_XINCREF(tb);
2564 tstate->exc_type = type;
2565 tstate->exc_value = value;
2566 tstate->exc_traceback = tb;
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", type);
2572 PySys_SetObject("exc_value", value);
2573 PySys_SetObject("exc_traceback", tb);
2574}
2575
2576static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002577reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578{
2579 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002580 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002581 frame = tstate->frame;
2582 if (frame->f_exc_type != NULL) {
2583 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002584 tmp_type = tstate->exc_type;
2585 tmp_value = tstate->exc_value;
2586 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002587 Py_XINCREF(frame->f_exc_type);
2588 Py_XINCREF(frame->f_exc_value);
2589 Py_XINCREF(frame->f_exc_traceback);
2590 tstate->exc_type = frame->f_exc_type;
2591 tstate->exc_value = frame->f_exc_value;
2592 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002593 Py_XDECREF(tmp_type);
2594 Py_XDECREF(tmp_value);
2595 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002596 /* For b/w compatibility */
2597 PySys_SetObject("exc_type", frame->f_exc_type);
2598 PySys_SetObject("exc_value", frame->f_exc_value);
2599 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2600 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002601 tmp_type = frame->f_exc_type;
2602 tmp_value = frame->f_exc_value;
2603 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002604 frame->f_exc_type = NULL;
2605 frame->f_exc_value = NULL;
2606 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002607 Py_XDECREF(tmp_type);
2608 Py_XDECREF(tmp_value);
2609 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002610}
2611
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002612/* Logic for the raise statement (too complicated for inlining).
2613 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002614static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002615do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002616{
Guido van Rossumd295f121998-04-09 21:39:57 +00002617 if (type == NULL) {
2618 /* Reraise */
2619 PyThreadState *tstate = PyThreadState_Get();
2620 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2621 value = tstate->exc_value;
2622 tb = tstate->exc_traceback;
2623 Py_XINCREF(type);
2624 Py_XINCREF(value);
2625 Py_XINCREF(tb);
2626 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002627
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002628 /* We support the following forms of raise:
2629 raise <class>, <classinstance>
2630 raise <class>, <argument tuple>
2631 raise <class>, None
2632 raise <class>, <argument>
2633 raise <classinstance>, None
2634 raise <string>, <object>
2635 raise <string>, None
2636
2637 An omitted second argument is the same as None.
2638
2639 In addition, raise <tuple>, <anything> is the same as
2640 raising the tuple's first item (and it better have one!);
2641 this rule is applied recursively.
2642
2643 Finally, an optional third argument can be supplied, which
2644 gives the traceback to be substituted (useful when
2645 re-raising an exception after examining it). */
2646
2647 /* First, check the traceback argument, replacing None with
2648 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 if (tb == Py_None) {
2650 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002651 tb = NULL;
2652 }
2653 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002654 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002655 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002656 goto raise_error;
2657 }
2658
2659 /* Next, replace a missing value with None */
2660 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 value = Py_None;
2662 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002663 }
2664
2665 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2667 PyObject *tmp = type;
2668 type = PyTuple_GET_ITEM(type, 0);
2669 Py_INCREF(type);
2670 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002671 }
2672
Barry Warsaw4249f541997-08-22 21:26:19 +00002673 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002674 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002675
2676 else if (PyClass_Check(type))
2677 PyErr_NormalizeException(&type, &value, &tb);
2678
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002680 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 if (value != Py_None) {
2682 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002683 "instance exception may not have a separate value");
2684 goto raise_error;
2685 }
2686 else {
2687 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002688 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002689 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2691 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002692 }
2693 }
2694 else {
2695 /* Not something you can raise. You get an exception
2696 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002697 PyErr_Format(PyExc_TypeError,
2698 "exceptions must be strings, classes, or "
2699 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002700 goto raise_error;
2701 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002702 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002703 if (tb == NULL)
2704 return WHY_EXCEPTION;
2705 else
2706 return WHY_RERAISE;
2707 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 Py_XDECREF(value);
2709 Py_XDECREF(type);
2710 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002711 return WHY_EXCEPTION;
2712}
2713
Tim Petersd6d010b2001-06-21 02:49:55 +00002714/* Iterate v argcnt times and store the results on the stack (via decreasing
2715 sp). Return 1 for success, 0 if error. */
2716
Barry Warsawe42b18f1997-08-25 22:13:04 +00002717static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002718unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002719{
Tim Petersd6d010b2001-06-21 02:49:55 +00002720 int i = 0;
2721 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002722 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002723
Tim Petersd6d010b2001-06-21 02:49:55 +00002724 assert(v != NULL);
2725
2726 it = PyObject_GetIter(v);
2727 if (it == NULL)
2728 goto Error;
2729
2730 for (; i < argcnt; i++) {
2731 w = PyIter_Next(it);
2732 if (w == NULL) {
2733 /* Iterator done, via error or exhaustion. */
2734 if (!PyErr_Occurred()) {
2735 PyErr_Format(PyExc_ValueError,
2736 "need more than %d value%s to unpack",
2737 i, i == 1 ? "" : "s");
2738 }
2739 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002740 }
2741 *--sp = w;
2742 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002743
2744 /* We better have exhausted the iterator now. */
2745 w = PyIter_Next(it);
2746 if (w == NULL) {
2747 if (PyErr_Occurred())
2748 goto Error;
2749 Py_DECREF(it);
2750 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002751 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002752 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002753 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002754Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002755 for (; i > 0; i--, sp++)
2756 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002757 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002758 return 0;
2759}
2760
2761
Guido van Rossum96a42c81992-01-12 02:29:51 +00002762#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002763static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002764prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002766 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 if (PyObject_Print(v, stdout, 0) != 0)
2768 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002769 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002770 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002771}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002772#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002774static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002775call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002776{
Guido van Rossumb209a111997-04-29 18:18:01 +00002777 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002778 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002779 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002780 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 value = Py_None;
2782 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002783 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002784 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002785 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002786 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002787 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002788 }
Fred Draked0838392001-06-16 21:02:31 +00002789 err = call_trace(p_trace, p_newtrace, f, str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002791 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002792 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002793 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 Py_XDECREF(type);
2795 Py_XDECREF(value);
2796 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002797 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002798}
2799
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002800/* PyObject **p_trace: in/out; may not be NULL;
2801 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002802 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002803 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002804 may be same variable as p_newtrace
Fred Draked0838392001-06-16 21:02:31 +00002805 PyObject *msg: in; must not be NULL
Fred Drake904aa7b2001-06-08 04:33:09 +00002806*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002807
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002809call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Draked0838392001-06-16 21:02:31 +00002810 PyObject *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002811{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002812 PyThreadState *tstate = f->f_tstate;
Fred Draked0838392001-06-16 21:02:31 +00002813 PyObject *args;
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002815
Guido van Rossuma027efa1997-05-05 20:56:21 +00002816 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002817 /* Don't do recursive traces */
2818 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002819 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002820 *p_newtrace = NULL;
2821 }
2822 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002823 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002824
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002826 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002827 goto cleanup;
Fred Draked0838392001-06-16 21:02:31 +00002828 Py_INCREF(msg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 Py_INCREF(f);
2830 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
Fred Draked0838392001-06-16 21:02:31 +00002831 PyTuple_SET_ITEM(args, 1, msg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002832 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 arg = Py_None;
2834 Py_INCREF(arg);
2835 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002836 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002837 PyFrame_FastToLocals(f);
2838 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2839 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002840 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002841 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002843 if (res == NULL) {
2844 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002845 PyTraceBack_Here(f);
2846 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002847 *p_trace = NULL;
2848 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002849 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002850 *p_newtrace = NULL;
2851 }
Barry Warsawf6202631999-09-08 16:26:33 +00002852 /* to be extra double plus sure we don't get recursive
2853 * calls inf either tracefunc or profilefunc gets an
2854 * exception, zap the global variables.
2855 */
2856 Py_XDECREF(tstate->sys_tracefunc);
2857 tstate->sys_tracefunc = NULL;
2858 Py_XDECREF(tstate->sys_profilefunc);
2859 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002860 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002861 }
2862 else {
2863 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002864 Py_XDECREF(*p_newtrace);
2865 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002866 *p_newtrace = NULL;
2867 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002868 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002869 *p_newtrace = res;
2870 }
2871 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002872 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002873 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002874 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002875}
2876
Fred Draked0838392001-06-16 21:02:31 +00002877/* Initialize the strings that get passed to the profile and trace functions;
2878 * this avoids doing this while we're actually profiling/tracing.
2879 */
2880int
2881_PyTrace_Init(void)
2882{
2883 if (str_call == NULL) {
2884 str_call = PyString_InternFromString("call");
2885 if (str_call == NULL)
2886 return -1;
2887 }
2888 if (str_exception == NULL) {
2889 str_exception = PyString_InternFromString("exception");
2890 if (str_exception == NULL)
2891 return -1;
2892 }
2893 if (str_line == NULL) {
2894 str_line = PyString_InternFromString("line");
2895 if (str_line == NULL)
2896 return -1;
2897 }
2898 if (str_return == NULL) {
2899 str_return = PyString_InternFromString("return");
2900 if (str_return == NULL)
2901 return -1;
2902 }
2903 return 0;
2904}
2905
Guido van Rossumb209a111997-04-29 18:18:01 +00002906PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002907PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002908{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002909 PyThreadState *tstate = PyThreadState_Get();
2910 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002911 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002912 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002913 else
2914 return current_frame->f_builtins;
2915}
2916
Guido van Rossumb209a111997-04-29 18:18:01 +00002917PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002918PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002919{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002920 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002921 if (current_frame == NULL)
2922 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002923 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002924 return current_frame->f_locals;
2925}
2926
Guido van Rossumb209a111997-04-29 18:18:01 +00002927PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002928PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002929{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002930 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931 if (current_frame == NULL)
2932 return NULL;
2933 else
2934 return current_frame->f_globals;
2935}
2936
Guido van Rossumb209a111997-04-29 18:18:01 +00002937PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002938PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002939{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002940 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002941 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002942}
2943
Guido van Rossum6135a871995-01-09 17:53:26 +00002944int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002945PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002946{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002947 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002948 return current_frame == NULL ? 0 : current_frame->f_restricted;
2949}
2950
Guido van Rossumbe270261997-05-22 22:26:18 +00002951int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002952PyEval_GetNestedScopes(void)
2953{
2954 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2955 return current_frame == NULL ? 0 :
2956 current_frame->f_code->co_flags & CO_NESTED;
2957}
2958
2959int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002960Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961{
Guido van Rossumb209a111997-04-29 18:18:01 +00002962 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002963 if (f == NULL)
2964 return 0;
2965 if (!PyFile_SoftSpace(f, 0))
2966 return 0;
2967 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968}
2969
Guido van Rossum3f5da241990-12-20 15:06:42 +00002970
Guido van Rossum681d79a1995-07-18 14:51:37 +00002971/* External interface to call any callable object.
2972 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002973
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002974#undef PyEval_CallObject
2975/* for backward compatibility: export this interface */
2976
Guido van Rossumb209a111997-04-29 18:18:01 +00002977PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002978PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002979{
Guido van Rossumb209a111997-04-29 18:18:01 +00002980 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002981}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002982#define PyEval_CallObject(func,arg) \
2983 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002984
Guido van Rossumb209a111997-04-29 18:18:01 +00002985PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002986PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002987{
Jeremy Hylton52820442001-01-03 23:52:36 +00002988 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002989
2990 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002991 arg = PyTuple_New(0);
2992 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002993 PyErr_SetString(PyExc_TypeError,
2994 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002995 return NULL;
2996 }
2997 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002998 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002999
Guido van Rossumb209a111997-04-29 18:18:01 +00003000 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003001 PyErr_SetString(PyExc_TypeError,
3002 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003003 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003004 return NULL;
3005 }
3006
Jeremy Hylton52820442001-01-03 23:52:36 +00003007 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003008 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003009 return result;
3010}
3011
3012/* How often is each kind of object called? The answer depends on the
3013 program. An instrumented call_object() was used to run the Python
3014 regression test suite. The results were:
3015 4200000 PyCFunctions
3016 390000 fast_function() calls
3017 94000 other functions
3018 480000 all functions (sum of prev two)
3019 150000 methods
3020 100000 classes
3021
3022 Tests on other bodies of code show that PyCFunctions are still
3023 most common, but not by such a large margin.
3024*/
3025
Jeremy Hylton512a2372001-04-11 13:52:29 +00003026static char *
3027get_func_name(PyObject *func)
3028{
3029 if (PyMethod_Check(func))
3030 return get_func_name(PyMethod_GET_FUNCTION(func));
3031 else if (PyFunction_Check(func))
3032 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3033 else if (PyCFunction_Check(func))
3034 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3035 else if (PyClass_Check(func))
3036 return PyString_AsString(((PyClassObject*)func)->cl_name);
3037 else if (PyInstance_Check(func)) {
3038 return PyString_AsString(
3039 ((PyInstanceObject*)func)->in_class->cl_name);
3040 } else {
3041 return func->ob_type->tp_name;
3042 }
3043}
3044
3045static char *
3046get_func_desc(PyObject *func)
3047{
3048 if (PyMethod_Check(func))
3049 return "()";
3050 else if (PyFunction_Check(func))
3051 return "()";
3052 else if (PyCFunction_Check(func))
3053 return "()";
3054 else if (PyClass_Check(func))
3055 return " constructor";
3056 else if (PyInstance_Check(func)) {
3057 return " instance";
3058 } else {
3059 return " object";
3060 }
3061}
3062
Jeremy Hylton52820442001-01-03 23:52:36 +00003063static PyObject *
3064call_object(PyObject *func, PyObject *arg, PyObject *kw)
3065{
3066 ternaryfunc call;
3067 PyObject *result;
3068
3069 if (PyMethod_Check(func))
3070 result = call_method(func, arg, kw);
3071 else if (PyFunction_Check(func))
3072 result = call_eval_code2(func, arg, kw);
3073 else if (PyCFunction_Check(func))
3074 result = call_cfunction(func, arg, kw);
3075 else if (PyClass_Check(func))
3076 result = PyInstance_New(func, arg, kw);
3077 else if (PyInstance_Check(func))
3078 result = call_instance(func, arg, kw);
3079 else if ((call = func->ob_type->tp_call) != NULL)
3080 result = (*call)(func, arg, kw);
3081 else {
Tim Peters239508c2001-06-16 00:09:28 +00003082 PyErr_Format(PyExc_TypeError,
3083 "object of type '%.100s' is not callable",
3084 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003085 return NULL;
3086 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003087 if (result == NULL && !PyErr_Occurred())
3088 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003089 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003090
Guido van Rossume59214e1994-08-30 08:01:59 +00003091 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003092}
3093
Guido van Rossumb209a111997-04-29 18:18:01 +00003094static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003095call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003096{
Jeremy Hylton52820442001-01-03 23:52:36 +00003097 PyCFunctionObject* f = (PyCFunctionObject*)func;
3098 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3099 PyObject *self = PyCFunction_GET_SELF(func);
3100 int flags = PyCFunction_GET_FLAGS(func);
3101
Jeremy Hylton52820442001-01-03 23:52:36 +00003102 if (flags & METH_KEYWORDS) {
3103 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003105 if (kw != NULL && PyDict_Size(kw) != 0) {
3106 PyErr_Format(PyExc_TypeError,
3107 "%.200s() takes no keyword arguments",
3108 f->m_ml->ml_name);
3109 return NULL;
3110 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003111 if (flags & METH_VARARGS) {
3112 return (*meth)(self, arg);
3113 }
3114 if (!(flags & METH_VARARGS)) {
3115 /* the really old style */
3116 int size = PyTuple_GET_SIZE(arg);
3117 if (size == 1)
3118 arg = PyTuple_GET_ITEM(arg, 0);
3119 else if (size == 0)
3120 arg = NULL;
3121 return (*meth)(self, arg);
3122 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003123 /* should never get here ??? */
3124 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125 return NULL;
3126}
3127
Guido van Rossumb209a111997-04-29 18:18:01 +00003128static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003129call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003130{
Jeremy Hylton52820442001-01-03 23:52:36 +00003131 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3132 if (call == NULL) {
3133 PyInstanceObject *inst = (PyInstanceObject*) func;
3134 PyErr_Clear();
3135 PyErr_Format(PyExc_AttributeError,
3136 "%.200s instance has no __call__ method",
3137 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003138 return NULL;
3139 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003140 res = call_object(call, arg, kw);
3141 Py_DECREF(call);
3142 return res;
3143}
3144
3145static PyObject *
3146call_method(PyObject *func, PyObject *arg, PyObject *kw)
3147{
3148 PyObject *self = PyMethod_GET_SELF(func);
3149 PyObject *class = PyMethod_GET_CLASS(func);
3150 PyObject *result;
3151
3152 func = PyMethod_GET_FUNCTION(func);
3153 if (self == NULL) {
3154 /* Unbound methods must be called with an instance of
3155 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003156 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003157 if (PyTuple_Size(arg) >= 1)
3158 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003159 if (self == NULL)
3160 ok = 0;
3161 else {
3162 ok = PyObject_IsInstance(self, class);
3163 if (ok < 0)
3164 return NULL;
3165 }
3166 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003167 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003168 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003169 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003170 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171 return NULL;
3172 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003173 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003174 }
3175 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003176 int argcount = PyTuple_Size(arg);
3177 PyObject *newarg = PyTuple_New(argcount + 1);
3178 int i;
3179 if (newarg == NULL)
3180 return NULL;
3181 Py_INCREF(self);
3182 PyTuple_SET_ITEM(newarg, 0, self);
3183 for (i = 0; i < argcount; i++) {
3184 PyObject *v = PyTuple_GET_ITEM(arg, i);
3185 Py_XINCREF(v);
3186 PyTuple_SET_ITEM(newarg, i+1, v);
3187 }
3188 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003190 result = call_object(func, arg, kw);
3191 Py_DECREF(arg);
3192 return result;
3193}
3194
3195static PyObject *
3196call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3197{
3198 PyObject *result;
3199 PyObject *argdefs;
3200 PyObject **d, **k;
3201 int nk, nd;
3202
3203 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003204 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3205 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3206 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 }
3208 else {
3209 d = NULL;
3210 nd = 0;
3211 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003212
Guido van Rossum681d79a1995-07-18 14:51:37 +00003213 if (kw != NULL) {
3214 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003215 nk = PyDict_Size(kw);
3216 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003217 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003218 PyErr_NoMemory();
3219 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003221 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003222 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003223 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003224 i += 2;
3225 nk = i/2;
3226 /* XXX This is broken if the caller deletes dict items! */
3227 }
3228 else {
3229 k = NULL;
3230 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003231 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003232
Guido van Rossum681d79a1995-07-18 14:51:37 +00003233 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003234 (PyCodeObject *)PyFunction_GET_CODE(func),
3235 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003236 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003237 k, nk, d, nd,
3238 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003239
Guido van Rossumb18618d2000-05-03 23:44:39 +00003240 if (k != NULL)
3241 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003242
Guido van Rossum681d79a1995-07-18 14:51:37 +00003243 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244}
3245
Jeremy Hylton52820442001-01-03 23:52:36 +00003246#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3247
3248/* The two fast_xxx() functions optimize calls for which no argument
3249 tuple is necessary; the objects are passed directly from the stack.
3250 fast_cfunction() is called for METH_OLDARGS functions.
3251 fast_function() is for functions with no special argument handling.
3252*/
3253
3254static PyObject *
3255fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3256{
3257 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3258 PyObject *self = PyCFunction_GET_SELF(func);
3259
3260 if (na == 0)
3261 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003262 else if (na == 1) {
3263 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003264 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003265 Py_DECREF(arg);
3266 return result;
3267 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003268 PyObject *args = load_args(pp_stack, na);
3269 PyObject *result = (*meth)(self, args);
3270 Py_DECREF(args);
3271 return result;
3272 }
3273}
3274
3275static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003276fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003277{
3278 PyObject *co = PyFunction_GET_CODE(func);
3279 PyObject *globals = PyFunction_GET_GLOBALS(func);
3280 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003281 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003282 PyObject **d = NULL;
3283 int nd = 0;
3284
3285 if (argdefs != NULL) {
3286 d = &PyTuple_GET_ITEM(argdefs, 0);
3287 nd = ((PyTupleObject *)argdefs)->ob_size;
3288 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003289 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003290 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003291 (*pp_stack)-2*nk, nk, d, nd,
3292 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003293}
3294
3295static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003296update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3297 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003298{
3299 PyObject *kwdict = NULL;
3300 if (orig_kwdict == NULL)
3301 kwdict = PyDict_New();
3302 else {
3303 kwdict = PyDict_Copy(orig_kwdict);
3304 Py_DECREF(orig_kwdict);
3305 }
3306 if (kwdict == NULL)
3307 return NULL;
3308 while (--nk >= 0) {
3309 int err;
3310 PyObject *value = EXT_POP(*pp_stack);
3311 PyObject *key = EXT_POP(*pp_stack);
3312 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003313 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003314 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003315 "for keyword argument '%.200s'",
3316 get_func_name(func),
3317 get_func_desc(func),
3318 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003319 Py_DECREF(key);
3320 Py_DECREF(value);
3321 Py_DECREF(kwdict);
3322 return NULL;
3323 }
3324 err = PyDict_SetItem(kwdict, key, value);
3325 Py_DECREF(key);
3326 Py_DECREF(value);
3327 if (err) {
3328 Py_DECREF(kwdict);
3329 return NULL;
3330 }
3331 }
3332 return kwdict;
3333}
3334
3335static PyObject *
3336update_star_args(int nstack, int nstar, PyObject *stararg,
3337 PyObject ***pp_stack)
3338{
3339 PyObject *callargs, *w;
3340
3341 callargs = PyTuple_New(nstack + nstar);
3342 if (callargs == NULL) {
3343 return NULL;
3344 }
3345 if (nstar) {
3346 int i;
3347 for (i = 0; i < nstar; i++) {
3348 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3349 Py_INCREF(a);
3350 PyTuple_SET_ITEM(callargs, nstack + i, a);
3351 }
3352 }
3353 while (--nstack >= 0) {
3354 w = EXT_POP(*pp_stack);
3355 PyTuple_SET_ITEM(callargs, nstack, w);
3356 }
3357 return callargs;
3358}
3359
3360static PyObject *
3361load_args(PyObject ***pp_stack, int na)
3362{
3363 PyObject *args = PyTuple_New(na);
3364 PyObject *w;
3365
3366 if (args == NULL)
3367 return NULL;
3368 while (--na >= 0) {
3369 w = EXT_POP(*pp_stack);
3370 PyTuple_SET_ITEM(args, na, w);
3371 }
3372 return args;
3373}
3374
3375static PyObject *
3376do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3377{
3378 PyObject *callargs = NULL;
3379 PyObject *kwdict = NULL;
3380 PyObject *result = NULL;
3381
3382 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003383 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003384 if (kwdict == NULL)
3385 goto call_fail;
3386 }
3387 callargs = load_args(pp_stack, na);
3388 if (callargs == NULL)
3389 goto call_fail;
3390 result = call_object(func, callargs, kwdict);
3391 call_fail:
3392 Py_XDECREF(callargs);
3393 Py_XDECREF(kwdict);
3394 return result;
3395}
3396
3397static PyObject *
3398ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3399{
3400 int nstar = 0;
3401 PyObject *callargs = NULL;
3402 PyObject *stararg = NULL;
3403 PyObject *kwdict = NULL;
3404 PyObject *result = NULL;
3405
3406 if (flags & CALL_FLAG_KW) {
3407 kwdict = EXT_POP(*pp_stack);
3408 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003409 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003410 "%s%s argument after ** "
3411 "must be a dictionary",
3412 get_func_name(func),
3413 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003414 goto ext_call_fail;
3415 }
3416 }
3417 if (flags & CALL_FLAG_VAR) {
3418 stararg = EXT_POP(*pp_stack);
3419 if (!PyTuple_Check(stararg)) {
3420 PyObject *t = NULL;
3421 t = PySequence_Tuple(stararg);
3422 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003423 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3424 PyErr_Format(PyExc_TypeError,
3425 "%s%s argument after * "
3426 "must be a sequence",
3427 get_func_name(func),
3428 get_func_desc(func));
3429 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003430 goto ext_call_fail;
3431 }
3432 Py_DECREF(stararg);
3433 stararg = t;
3434 }
3435 nstar = PyTuple_GET_SIZE(stararg);
3436 }
3437 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003438 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003439 if (kwdict == NULL)
3440 goto ext_call_fail;
3441 }
3442 callargs = update_star_args(na, nstar, stararg, pp_stack);
3443 if (callargs == NULL)
3444 goto ext_call_fail;
3445 result = call_object(func, callargs, kwdict);
3446 ext_call_fail:
3447 Py_XDECREF(callargs);
3448 Py_XDECREF(kwdict);
3449 Py_XDECREF(stararg);
3450 return result;
3451}
3452
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003453#define SLICE_ERROR_MSG \
3454 "standard sequence type does not support step size other than one"
3455
Guido van Rossumb209a111997-04-29 18:18:01 +00003456static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003457loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458{
Guido van Rossumb209a111997-04-29 18:18:01 +00003459 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003460 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003461 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003462 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 return NULL;
3464 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003465 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003466 v = (*sq->sq_item)(v, i);
3467 if (v)
3468 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003469 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003470 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003471 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472}
3473
Guido van Rossum20c6add2000-05-08 14:06:50 +00003474/* Extract a slice index from a PyInt or PyLong, the index is bound to
3475 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3476 and error. Returns 1 on success.*/
3477
3478int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003479_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003480{
3481 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003482 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003483 if (PyInt_Check(v)) {
3484 x = PyInt_AsLong(v);
3485 } else if (PyLong_Check(v)) {
3486 x = PyLong_AsLong(v);
3487 if (x==-1 && PyErr_Occurred()) {
3488 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003489 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003490
Guido van Rossumac7be682001-01-17 15:42:30 +00003491 if (!PyErr_ExceptionMatches(
3492 PyExc_OverflowError)) {
3493 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003494 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003495 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003496 }
3497
Guido van Rossumac7be682001-01-17 15:42:30 +00003498 /* Clear the OverflowError */
3499 PyErr_Clear();
3500
3501 /* It's an overflow error, so we need to
3502 check the sign of the long integer,
3503 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003504 the error. */
3505
3506 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003507 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003508 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003509
3510 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003511 cmp = PyObject_RichCompareBool(v, long_zero,
3512 Py_GT);
3513 Py_DECREF(long_zero);
3514 if (cmp < 0)
3515 return 0;
3516 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003517 x = INT_MAX;
3518 else
3519 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003520 }
3521 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003522 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003523 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003524 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003526 /* Truncate -- very long indices are truncated anyway */
3527 if (x > INT_MAX)
3528 x = INT_MAX;
3529 else if (x < -INT_MAX)
3530 x = 0;
3531 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003533 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534}
3535
Guido van Rossumb209a111997-04-29 18:18:01 +00003536static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003537apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003539 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003540 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003541 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003542 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003543 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003544 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003545}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003546
3547static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003548assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3549 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003550{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003551 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003552 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003553 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003554 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003555 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003556 if (x == NULL)
3557 return PySequence_DelSlice(u, ilow, ihigh);
3558 else
3559 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003560}
3561
Guido van Rossumb209a111997-04-29 18:18:01 +00003562static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003563cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003564{
Guido van Rossumac7be682001-01-17 15:42:30 +00003565 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003567 case IS:
3568 case IS_NOT:
3569 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003570 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003571 res = !res;
3572 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003573 case IN:
3574 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003575 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003576 if (res < 0)
3577 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003578 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003579 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003580 break;
3581 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003582 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583 break;
3584 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003585 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003587 v = res ? Py_True : Py_False;
3588 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003589 return v;
3590}
3591
Thomas Wouters52152252000-08-17 22:55:00 +00003592static PyObject *
3593import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003594{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003595 PyObject *x;
3596
3597 x = PyObject_GetAttr(v, name);
3598 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003599 PyErr_Format(PyExc_ImportError,
3600 "cannot import name %.230s",
3601 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003602 }
Thomas Wouters52152252000-08-17 22:55:00 +00003603 return x;
3604}
Guido van Rossumac7be682001-01-17 15:42:30 +00003605
Thomas Wouters52152252000-08-17 22:55:00 +00003606static int
3607import_all_from(PyObject *locals, PyObject *v)
3608{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003609 PyObject *all = PyObject_GetAttrString(v, "__all__");
3610 PyObject *dict, *name, *value;
3611 int skip_leading_underscores = 0;
3612 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003613
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003614 if (all == NULL) {
3615 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3616 return -1; /* Unexpected error */
3617 PyErr_Clear();
3618 dict = PyObject_GetAttrString(v, "__dict__");
3619 if (dict == NULL) {
3620 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3621 return -1;
3622 PyErr_SetString(PyExc_ImportError,
3623 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003624 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003625 }
3626 all = PyMapping_Keys(dict);
3627 Py_DECREF(dict);
3628 if (all == NULL)
3629 return -1;
3630 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003631 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003632
3633 for (pos = 0, err = 0; ; pos++) {
3634 name = PySequence_GetItem(all, pos);
3635 if (name == NULL) {
3636 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3637 err = -1;
3638 else
3639 PyErr_Clear();
3640 break;
3641 }
3642 if (skip_leading_underscores &&
3643 PyString_Check(name) &&
3644 PyString_AS_STRING(name)[0] == '_')
3645 {
3646 Py_DECREF(name);
3647 continue;
3648 }
3649 value = PyObject_GetAttr(v, name);
3650 if (value == NULL)
3651 err = -1;
3652 else
3653 err = PyDict_SetItem(locals, name, value);
3654 Py_DECREF(name);
3655 Py_XDECREF(value);
3656 if (err != 0)
3657 break;
3658 }
3659 Py_DECREF(all);
3660 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003661}
3662
Guido van Rossumb209a111997-04-29 18:18:01 +00003663static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003664build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003665{
Guido van Rossumcd649651997-08-22 16:56:16 +00003666 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003667 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003668 PyErr_SetString(PyExc_SystemError,
3669 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003670 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003671 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003672 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003673 PyErr_SetString(PyExc_SystemError,
3674 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003675 return NULL;
3676 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003677 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003678 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003679 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003680 return NULL;
3681 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003682 n = PyTuple_Size(bases);
3683 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003684 PyObject *base = PyTuple_GET_ITEM(bases, i);
3685 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003686 /* Call the base's *type*, if it is callable.
3687 This code is a hook for Donald Beaudry's
3688 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003689 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003690 since its types are not callable.
3691 Ditto: call the bases's *class*, if it has
3692 one. This makes the same thing possible
3693 without writing C code. A true meta-object
3694 protocol! */
3695 PyObject *basetype = (PyObject *)base->ob_type;
3696 PyObject *callable = NULL;
3697 if (PyCallable_Check(basetype))
3698 callable = basetype;
3699 else
3700 callable = PyObject_GetAttrString(
3701 base, "__class__");
3702 if (callable) {
3703 PyObject *args;
3704 PyObject *newclass = NULL;
3705 args = Py_BuildValue(
3706 "(OOO)", name, bases, methods);
3707 if (args != NULL) {
3708 newclass = PyEval_CallObject(
3709 callable, args);
3710 Py_DECREF(args);
3711 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003712 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003713 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003714 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003715 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003716 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003717 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003718 "base is not a class object");
3719 return NULL;
3720 }
3721 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003722 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003723}
3724
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003725static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003726exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3727 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003728{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003729 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003730 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003731 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003732
Guido van Rossumb209a111997-04-29 18:18:01 +00003733 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3734 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003735 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003736 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003737 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003738 locals = PyTuple_GetItem(prog, 2);
3739 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003740 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003741 if (globals == Py_None) {
3742 globals = PyEval_GetGlobals();
3743 if (locals == Py_None) {
3744 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003745 plain = 1;
3746 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003748 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003749 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003750 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003751 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003752 !PyCode_Check(prog) &&
3753 !PyFile_Check(prog)) {
3754 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003755 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003756 return -1;
3757 }
Fred Drake661ea262000-10-24 19:57:45 +00003758 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003759 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003760 "exec: arg 2 must be a dictionary or None");
3761 return -1;
3762 }
3763 if (!PyDict_Check(locals)) {
3764 PyErr_SetString(PyExc_TypeError,
3765 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003766 return -1;
3767 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003768 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003769 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003770 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003771 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003772 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003773 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003774 FILE *fp = PyFile_AsFile(prog);
3775 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003776 if (PyEval_GetNestedScopes()) {
3777 PyCompilerFlags cf;
3778 cf.cf_nested_scopes = 1;
3779 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3780 locals, &cf);
3781 } else {
3782 v = PyRun_File(fp, name, Py_file_input, globals,
3783 locals);
3784 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003785 }
3786 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003787 char *str;
3788 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003789 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003790 if (PyEval_GetNestedScopes()) {
3791 PyCompilerFlags cf;
3792 cf.cf_nested_scopes = 1;
3793 v = PyRun_StringFlags(str, Py_file_input, globals,
3794 locals, &cf);
3795 } else
3796 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003797 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003798 if (plain)
3799 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003800 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003801 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003802 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003803 return 0;
3804}
Guido van Rossum24c13741995-02-14 09:42:43 +00003805
Guido van Rossumac7be682001-01-17 15:42:30 +00003806static void
Paul Prescode68140d2000-08-30 20:25:01 +00003807format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3808{
3809 char *obj_str;
3810
3811 if (!obj)
3812 return;
3813
3814 obj_str = PyString_AsString(obj);
3815 if (!obj_str)
3816 return;
3817
3818 PyErr_Format(exc, format_str, obj_str);
3819}
Guido van Rossum950361c1997-01-24 13:49:28 +00003820
3821#ifdef DYNAMIC_EXECUTION_PROFILE
3822
3823PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003824getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003825{
3826 int i;
3827 PyObject *l = PyList_New(256);
3828 if (l == NULL) return NULL;
3829 for (i = 0; i < 256; i++) {
3830 PyObject *x = PyInt_FromLong(a[i]);
3831 if (x == NULL) {
3832 Py_DECREF(l);
3833 return NULL;
3834 }
3835 PyList_SetItem(l, i, x);
3836 }
3837 for (i = 0; i < 256; i++)
3838 a[i] = 0;
3839 return l;
3840}
3841
3842PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003843_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003844{
3845#ifndef DXPAIRS
3846 return getarray(dxp);
3847#else
3848 int i;
3849 PyObject *l = PyList_New(257);
3850 if (l == NULL) return NULL;
3851 for (i = 0; i < 257; i++) {
3852 PyObject *x = getarray(dxpairs[i]);
3853 if (x == NULL) {
3854 Py_DECREF(l);
3855 return NULL;
3856 }
3857 PyList_SetItem(l, i, x);
3858 }
3859 return l;
3860#endif
3861}
3862
3863#endif