blob: e6da9ebe1c3c663976417b71d7272e7368a91d2b [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:
Fred Drake5755ce62001-06-27 19:19:46 +00005 XXX how to pass arguments to profile and trace functions?
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"
Tim Peters6d6c1a32001-08-02 04:15:00 +000016#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017
Jack Jansencbf630f2000-07-11 21:59:16 +000018#ifdef macintosh
19#include "macglue.h"
20#endif
21
Guido van Rossumc6004111993-11-05 10:22:19 +000022#include <ctype.h>
23
Guido van Rossum04691fc1992-08-12 15:35:34 +000024/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000025/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000026
Guido van Rossum408027e1996-12-30 16:17:54 +000027#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000028/* For debugging the interpreter: */
29#define LLTRACE 1 /* Low-level trace feature */
30#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#endif
32
Jeremy Hylton52820442001-01-03 23:52:36 +000033typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000034
Guido van Rossum374a9221991-04-04 10:40:29 +000035/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000036static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000037static PyObject *call_object(PyObject *, PyObject *, PyObject *);
38static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
39static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
40static PyObject *call_method(PyObject *, PyObject *, PyObject *);
41static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
42static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
43static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
44static PyObject *do_call(PyObject *, PyObject ***, int, int);
45static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000046static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000047static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000048static PyObject *load_args(PyObject ***, int);
49#define CALL_FLAG_VAR 1
50#define CALL_FLAG_KW 2
51
Guido van Rossum0a066c01992-03-27 17:29:15 +000052#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000053static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000054#endif
Fred Drake5755ce62001-06-27 19:19:46 +000055static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
56 int, PyObject *);
57static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000058static PyObject *loop_subscript(PyObject *, PyObject *);
59static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
60static int assign_slice(PyObject *, PyObject *,
61 PyObject *, PyObject *);
62static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000063static PyObject *import_from(PyObject *, PyObject *);
64static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000065static PyObject *build_class(PyObject *, PyObject *, PyObject *);
66static int exec_statement(PyFrameObject *,
67 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000068static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
69static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000070static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000071
Paul Prescode68140d2000-08-30 20:25:01 +000072#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000073 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000074#define GLOBAL_NAME_ERROR_MSG \
75 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000076#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000077 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000078#define UNBOUNDFREE_ERROR_MSG \
79 "free variable '%.200s' referenced before assignment" \
80 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000081
Guido van Rossum950361c1997-01-24 13:49:28 +000082/* Dynamic execution profile */
83#ifdef DYNAMIC_EXECUTION_PROFILE
84#ifdef DXPAIRS
85static long dxpairs[257][256];
86#define dxp dxpairs[256]
87#else
88static long dxp[256];
89#endif
90#endif
91
Tim Peters5ca576e2001-06-18 22:08:13 +000092staticforward PyTypeObject gentype;
93
94typedef struct {
95 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000096 /* The gi_ prefix is intended to remind of generator-iterator. */
97
98 PyFrameObject *gi_frame;
99
Tim Peterse77f2e22001-06-26 22:24:51 +0000100 /* True if generator is being executed. */
101 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +0000102} genobject;
103
104static PyObject *
105gen_new(PyFrameObject *f)
106{
107 genobject *gen = PyObject_New(genobject, &gentype);
108 if (gen == NULL) {
109 Py_DECREF(f);
110 return NULL;
111 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000112 gen->gi_frame = f;
113 gen->gi_running = 0;
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000114 PyObject_GC_Init(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000115 return (PyObject *)gen;
116}
117
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000118static int
119gen_traverse(genobject *gen, visitproc visit, void *arg)
120{
121 return visit((PyObject *)gen->gi_frame, arg);
122}
123
Tim Peters5ca576e2001-06-18 22:08:13 +0000124static void
125gen_dealloc(genobject *gen)
126{
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000127 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000128 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000129 PyObject_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000130}
131
132static PyObject *
133gen_iternext(genobject *gen)
134{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000135 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000136 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000137 PyObject *result;
138
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000139 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000140 PyErr_SetString(PyExc_ValueError,
141 "generator already executing");
142 return NULL;
143 }
Tim Peters8c963692001-06-23 05:26:56 +0000144 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000145 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000146
147 /* Generators always return to their most recent caller, not
148 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000149 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000150 assert(f->f_back == NULL);
151 f->f_back = tstate->frame;
152
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000153 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000154 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000155 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000156
157 /* Don't keep the reference to f_back any longer than necessary. It
158 * may keep a chain of frames alive or it could create a reference
159 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000160 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000161 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000162
Tim Petersad1a18b2001-06-23 06:19:16 +0000163 /* If the generator just returned (as opposed to yielding), signal
164 * that the generator is exhausted. */
165 if (result == Py_None && f->f_stacktop == NULL) {
166 Py_DECREF(result);
167 result = NULL;
168 }
169
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000170 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000171}
172
173static PyObject *
174gen_next(genobject *gen, PyObject *args)
175{
176 PyObject *result;
177
178 if (!PyArg_ParseTuple(args, ":next"))
179 return NULL;
180
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000181 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000182
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000183 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000184 PyErr_SetObject(PyExc_StopIteration, Py_None);
185 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000186 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000187
188 return result;
189}
190
191static PyObject *
192gen_getiter(PyObject *gen)
193{
194 Py_INCREF(gen);
195 return gen;
196}
197
198static struct PyMethodDef gen_methods[] = {
199 {"next", (PyCFunction)gen_next, METH_VARARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000200 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000201 {NULL, NULL} /* Sentinel */
202};
203
Tim Peters6d6c1a32001-08-02 04:15:00 +0000204static struct memberlist gen_memberlist[] = {
205 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
206 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
207 {NULL} /* Sentinel */
208};
Tim Peters5ca576e2001-06-18 22:08:13 +0000209
210statichere PyTypeObject gentype = {
211 PyObject_HEAD_INIT(&PyType_Type)
212 0, /* ob_size */
213 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000214 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000215 0, /* tp_itemsize */
216 /* methods */
217 (destructor)gen_dealloc, /* tp_dealloc */
218 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000219 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000220 0, /* tp_setattr */
221 0, /* tp_compare */
222 0, /* tp_repr */
223 0, /* tp_as_number */
224 0, /* tp_as_sequence */
225 0, /* tp_as_mapping */
226 0, /* tp_hash */
227 0, /* tp_call */
228 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000229 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000230 0, /* tp_setattro */
231 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000232 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000233 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000234 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000235 0, /* tp_clear */
236 0, /* tp_richcompare */
237 0, /* tp_weaklistoffset */
238 (getiterfunc)gen_getiter, /* tp_iter */
239 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000240 gen_methods, /* tp_methods */
241 gen_memberlist, /* tp_members */
242 0, /* tp_getset */
243 0, /* tp_base */
244 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000245};
246
247
Guido van Rossume59214e1994-08-30 08:01:59 +0000248#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000249
Guido van Rossum2571cc81999-04-07 16:07:23 +0000250#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000252#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000253#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000254
Guido van Rossuma027efa1997-05-05 20:56:21 +0000255extern int _PyThread_Started; /* Flag for Py_Exit */
256
Guido van Rossum65d5b571998-12-21 19:32:43 +0000257static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000258static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000259
260void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000261PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000262{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000263 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000264 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000265 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000266 interpreter_lock = PyThread_allocate_lock();
267 PyThread_acquire_lock(interpreter_lock, 1);
268 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000269}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000270
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000271void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000272PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000274 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000275}
276
277void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000278PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000279{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000280 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000281}
282
283void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000284PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000285{
286 if (tstate == NULL)
287 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000288 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289 if (PyThreadState_Swap(tstate) != NULL)
290 Py_FatalError(
291 "PyEval_AcquireThread: non-NULL old thread state");
292}
293
294void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000295PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000296{
297 if (tstate == NULL)
298 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
299 if (PyThreadState_Swap(NULL) != tstate)
300 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000301 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000302}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000303
304/* This function is called from PyOS_AfterFork to ensure that newly
305 created child processes don't hold locks referring to threads which
306 are not running in the child process. (This could also be done using
307 pthread_atfork mechanism, at least for the pthreads implementation.) */
308
309void
310PyEval_ReInitThreads(void)
311{
312 if (!interpreter_lock)
313 return;
314 /*XXX Can't use PyThread_free_lock here because it does too
315 much error-checking. Doing this cleanly would require
316 adding a new function to each thread_*.h. Instead, just
317 create a new lock and waste a little bit of memory */
318 interpreter_lock = PyThread_allocate_lock();
319 PyThread_acquire_lock(interpreter_lock, 1);
320 main_thread = PyThread_get_thread_ident();
321}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322#endif
323
Guido van Rossumff4949e1992-08-05 19:58:53 +0000324/* Functions save_thread and restore_thread are always defined so
325 dynamically loaded modules needn't be compiled separately for use
326 with and without threads: */
327
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000328PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000329PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000331 PyThreadState *tstate = PyThreadState_Swap(NULL);
332 if (tstate == NULL)
333 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000334#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000335 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000336 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000337#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000338 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000339}
340
341void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000342PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000344 if (tstate == NULL)
345 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000346#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000348 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000349 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000350 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000351 }
352#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000353 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000354}
355
356
Guido van Rossuma9672091994-09-14 13:31:22 +0000357/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
358 signal handlers or Mac I/O completion routines) can schedule calls
359 to a function to be called synchronously.
360 The synchronous function is called with one void* argument.
361 It should return 0 for success or -1 for failure -- failure should
362 be accompanied by an exception.
363
364 If registry succeeds, the registry function returns 0; if it fails
365 (e.g. due to too many pending calls) it returns -1 (without setting
366 an exception condition).
367
368 Note that because registry may occur from within signal handlers,
369 or other asynchronous events, calling malloc() is unsafe!
370
371#ifdef WITH_THREAD
372 Any thread can schedule pending calls, but only the main thread
373 will execute them.
374#endif
375
376 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
377 There are two possible race conditions:
378 (1) nested asynchronous registry calls;
379 (2) registry calls made while pending calls are being processed.
380 While (1) is very unlikely, (2) is a real possibility.
381 The current code is safe against (2), but not against (1).
382 The safety against (2) is derived from the fact that only one
383 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000384
Guido van Rossuma027efa1997-05-05 20:56:21 +0000385 XXX Darn! With the advent of thread state, we should have an array
386 of pending calls per thread in the thread state! Later...
387*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000388
Guido van Rossuma9672091994-09-14 13:31:22 +0000389#define NPENDINGCALLS 32
390static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000391 int (*func)(void *);
392 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000393} pendingcalls[NPENDINGCALLS];
394static volatile int pendingfirst = 0;
395static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000396static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000397
398int
Thomas Wouters334fb892000-07-25 12:56:38 +0000399Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000400{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 int i, j;
403 /* XXX Begin critical section */
404 /* XXX If you want this to be safe against nested
405 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000406 if (busy)
407 return -1;
408 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000409 i = pendinglast;
410 j = (i + 1) % NPENDINGCALLS;
411 if (j == pendingfirst)
412 return -1; /* Queue full */
413 pendingcalls[i].func = func;
414 pendingcalls[i].arg = arg;
415 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000416 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418 /* XXX End critical section */
419 return 0;
420}
421
Guido van Rossum180d7b41994-09-29 09:45:57 +0000422int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000423Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000424{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000425 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000426#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000427 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000428 return 0;
429#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000431 return 0;
432 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000433 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000434 for (;;) {
435 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000436 int (*func)(void *);
437 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000438 i = pendingfirst;
439 if (i == pendinglast)
440 break; /* Queue empty */
441 func = pendingcalls[i].func;
442 arg = pendingcalls[i].arg;
443 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000444 if (func(arg) < 0) {
445 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000446 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000447 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000448 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000449 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000450 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000451 return 0;
452}
453
454
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000455/* The interpreter's recursion limit */
456
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000457static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000458
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000459int
460Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000461{
462 return recursion_limit;
463}
464
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000465void
466Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000467{
468 recursion_limit = new_limit;
469}
470
Guido van Rossum374a9221991-04-04 10:40:29 +0000471/* Status code for main loop (reason for stack unwind) */
472
473enum why_code {
474 WHY_NOT, /* No error */
475 WHY_EXCEPTION, /* Exception occurred */
476 WHY_RERAISE, /* Exception re-raised by 'finally' */
477 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000478 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000479 WHY_CONTINUE, /* 'continue' statement */
480 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000481};
482
Tim Petersdbd9ba62000-07-09 03:09:57 +0000483static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000484static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000485
Guido van Rossum374a9221991-04-04 10:40:29 +0000486
Guido van Rossumb209a111997-04-29 18:18:01 +0000487PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000490 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000492 (PyObject **)NULL, 0,
493 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000494 (PyObject **)NULL, 0,
495 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496}
497
498
499/* Interpreter main loop */
500
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000502eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000503{
Guido van Rossum950361c1997-01-24 13:49:28 +0000504#ifdef DXPAIRS
505 int lastopcode = 0;
506#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000507 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000508 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000509 register int opcode=0; /* Current opcode */
510 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000511 register enum why_code why; /* Reason for block stack unwind */
512 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000513 register PyObject *x; /* Result object -- NULL if error */
514 register PyObject *v; /* Temporary objects popped off stack */
515 register PyObject *w;
516 register PyObject *u;
517 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000518 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000519 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000520 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000521 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000522 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000523 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000524#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000525 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000526#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000527#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000529 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000530#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000531
532/* Code access macros */
533
534#define GETCONST(i) Getconst(f, i)
535#define GETNAME(i) Getname(f, i)
536#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000537#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000538#define NEXTOP() (*next_instr++)
539#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000540#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000541#define JUMPBY(x) (next_instr += (x))
542
543/* Stack manipulation macros */
544
545#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
546#define EMPTY() (STACK_LEVEL() == 0)
547#define TOP() (stack_pointer[-1])
548#define BASIC_PUSH(v) (*stack_pointer++ = (v))
549#define BASIC_POP() (*--stack_pointer)
550
Guido van Rossum96a42c81992-01-12 02:29:51 +0000551#ifdef LLTRACE
552#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
553#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000554#else
555#define PUSH(v) BASIC_PUSH(v)
556#define POP() BASIC_POP()
557#endif
558
Guido van Rossum681d79a1995-07-18 14:51:37 +0000559/* Local variable macros */
560
561#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000562#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000563 GETLOCAL(i) = value; } while (0)
564
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565/* Start of code */
566
Tim Peters5ca576e2001-06-18 22:08:13 +0000567 if (f == NULL)
568 return NULL;
569
Guido van Rossum8861b741996-07-30 16:49:37 +0000570#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000571 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000572 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000573 return NULL;
574 }
575#endif
576
Tim Peters5ca576e2001-06-18 22:08:13 +0000577 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000578 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000579 --tstate->recursion_depth;
580 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000581 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000582 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000583 return NULL;
584 }
585
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000587 co = f->f_code;
588 fastlocals = f->f_localsplus;
589 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000590 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000591 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000592 stack_pointer = f->f_stacktop;
593 assert(stack_pointer != NULL);
594 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000595
596#ifdef LLTRACE
597 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
598#endif
599#if defined(Py_DEBUG) || defined(LLTRACE)
600 filename = PyString_AsString(co->co_filename);
601#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000602
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 why = WHY_NOT;
604 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000605 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000606 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000607
Guido van Rossum374a9221991-04-04 10:40:29 +0000608 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 /* Do periodic things. Doing this every time through
610 the loop would add too much overhead, so we do it
611 only every Nth instruction. We also do it if
612 ``things_to_do'' is set, i.e. when an asynchronous
613 event needs attention (e.g. a signal handler or
614 async I/O handler); see Py_AddPendingCall() and
615 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000616
Guido van Rossuma027efa1997-05-05 20:56:21 +0000617 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000618 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000619 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000620 if (Py_MakePendingCalls() < 0) {
621 why = WHY_EXCEPTION;
622 goto on_error;
623 }
624 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000625#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000626 /* If we have true signals, the signal handler
627 will call Py_AddPendingCall() so we don't
628 have to call sigcheck(). On the Mac and
629 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000630 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 goto on_error;
633 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000634#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000635
Guido van Rossume59214e1994-08-30 08:01:59 +0000636#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000637 if (interpreter_lock) {
638 /* Give another thread a chance */
639
Guido van Rossum25ce5661997-08-02 03:10:38 +0000640 if (PyThreadState_Swap(NULL) != tstate)
641 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000642 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000643
644 /* Other threads may run now */
645
Guido van Rossum65d5b571998-12-21 19:32:43 +0000646 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000647 if (PyThreadState_Swap(tstate) != NULL)
648 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000649 }
650#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000651 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000652
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000654
Guido van Rossum408027e1996-12-30 16:17:54 +0000655#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000656 f->f_lasti = INSTR_OFFSET();
657#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000658
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 opcode = NEXTOP();
660 if (HAS_ARG(opcode))
661 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000662 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000663#ifdef DYNAMIC_EXECUTION_PROFILE
664#ifdef DXPAIRS
665 dxpairs[lastopcode][opcode]++;
666 lastopcode = opcode;
667#endif
668 dxp[opcode]++;
669#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000670
Guido van Rossum96a42c81992-01-12 02:29:51 +0000671#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000672 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000673
Guido van Rossum96a42c81992-01-12 02:29:51 +0000674 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 if (HAS_ARG(opcode)) {
676 printf("%d: %d, %d\n",
677 (int) (INSTR_OFFSET() - 3),
678 opcode, oparg);
679 }
680 else {
681 printf("%d: %d\n",
682 (int) (INSTR_OFFSET() - 1), opcode);
683 }
684 }
685#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000686 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000687
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000689
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 /* BEWARE!
691 It is essential that any operation that fails sets either
692 x to NULL, err to nonzero, or why to anything but WHY_NOT,
693 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000694
Guido van Rossum374a9221991-04-04 10:40:29 +0000695 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000696
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 case POP_TOP:
698 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000699 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000700 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000701
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 case ROT_TWO:
703 v = POP();
704 w = POP();
705 PUSH(v);
706 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000707 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000708
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 case ROT_THREE:
710 v = POP();
711 w = POP();
712 x = POP();
713 PUSH(v);
714 PUSH(x);
715 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000716 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000717
Thomas Wouters434d0822000-08-24 20:11:32 +0000718 case ROT_FOUR:
719 u = POP();
720 v = POP();
721 w = POP();
722 x = POP();
723 PUSH(u);
724 PUSH(x);
725 PUSH(w);
726 PUSH(v);
727 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000728
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 case DUP_TOP:
730 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000731 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000733 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000734
Thomas Wouters434d0822000-08-24 20:11:32 +0000735 case DUP_TOPX:
736 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000737 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000738 x = TOP();
739 Py_INCREF(x);
740 PUSH(x);
741 continue;
742 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000743 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000744 Py_INCREF(x);
745 w = TOP();
746 Py_INCREF(w);
747 PUSH(x);
748 PUSH(w);
749 PUSH(x);
750 continue;
751 case 3:
752 x = POP();
753 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000754 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000755 Py_INCREF(w);
756 v = TOP();
757 Py_INCREF(v);
758 PUSH(w);
759 PUSH(x);
760 PUSH(v);
761 PUSH(w);
762 PUSH(x);
763 continue;
764 case 4:
765 x = POP();
766 Py_INCREF(x);
767 w = POP();
768 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000769 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000770 Py_INCREF(v);
771 u = TOP();
772 Py_INCREF(u);
773 PUSH(v);
774 PUSH(w);
775 PUSH(x);
776 PUSH(u);
777 PUSH(v);
778 PUSH(w);
779 PUSH(x);
780 continue;
781 case 5:
782 x = POP();
783 Py_INCREF(x);
784 w = POP();
785 Py_INCREF(w);
786 v = POP();
787 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000788 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000789 Py_INCREF(u);
790 t = TOP();
791 Py_INCREF(t);
792 PUSH(u);
793 PUSH(v);
794 PUSH(w);
795 PUSH(x);
796 PUSH(t);
797 PUSH(u);
798 PUSH(v);
799 PUSH(w);
800 PUSH(x);
801 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000802 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000803 Py_FatalError("invalid argument to DUP_TOPX"
804 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000805 }
Tim Peters35ba6892000-10-11 07:04:49 +0000806 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000807
Guido van Rossum374a9221991-04-04 10:40:29 +0000808 case UNARY_POSITIVE:
809 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000810 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000811 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000812 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000813 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000815
Guido van Rossum374a9221991-04-04 10:40:29 +0000816 case UNARY_NEGATIVE:
817 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000818 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000819 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000821 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000822 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000823
Guido van Rossum374a9221991-04-04 10:40:29 +0000824 case UNARY_NOT:
825 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000826 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000827 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000828 if (err == 0) {
829 Py_INCREF(Py_True);
830 PUSH(Py_True);
831 continue;
832 }
833 else if (err > 0) {
834 Py_INCREF(Py_False);
835 PUSH(Py_False);
836 err = 0;
837 continue;
838 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000840
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 case UNARY_CONVERT:
842 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000843 x = PyObject_Repr(v);
844 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000846 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000847 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000848
Guido van Rossum7928cd71991-10-24 14:59:31 +0000849 case UNARY_INVERT:
850 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000851 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000852 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000853 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000854 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000855 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000856
Guido van Rossum50564e81996-01-12 01:13:16 +0000857 case BINARY_POWER:
858 w = POP();
859 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000860 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000861 Py_DECREF(v);
862 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000863 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000864 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000866
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 case BINARY_MULTIPLY:
868 w = POP();
869 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000870 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000871 Py_DECREF(v);
872 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000874 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000876
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 case BINARY_DIVIDE:
878 w = POP();
879 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000880 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000881 Py_DECREF(v);
882 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000884 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000885 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000886
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 case BINARY_MODULO:
888 w = POP();
889 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000890 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
892 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000896
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 case BINARY_ADD:
898 w = POP();
899 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000900 if (PyInt_Check(v) && PyInt_Check(w)) {
901 /* INLINE: int + int */
902 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000903 a = PyInt_AS_LONG(v);
904 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000905 i = a + b;
906 if ((i^a) < 0 && (i^b) < 0) {
907 PyErr_SetString(PyExc_OverflowError,
908 "integer addition");
909 x = NULL;
910 }
911 else
912 x = PyInt_FromLong(i);
913 }
914 else
915 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000916 Py_DECREF(v);
917 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000919 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000921
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 case BINARY_SUBTRACT:
923 w = POP();
924 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000925 if (PyInt_Check(v) && PyInt_Check(w)) {
926 /* INLINE: int - int */
927 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000928 a = PyInt_AS_LONG(v);
929 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000930 i = a - b;
931 if ((i^a) < 0 && (i^~b) < 0) {
932 PyErr_SetString(PyExc_OverflowError,
933 "integer subtraction");
934 x = NULL;
935 }
936 else
937 x = PyInt_FromLong(i);
938 }
939 else
940 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000941 Py_DECREF(v);
942 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000944 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000946
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 case BINARY_SUBSCR:
948 w = POP();
949 v = POP();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000950 if (v->ob_type == &PyList_Type && PyInt_Check(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000951 /* INLINE: list[int] */
952 long i = PyInt_AsLong(w);
953 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000954 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000955 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000956 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000957 PyErr_SetString(PyExc_IndexError,
958 "list index out of range");
959 x = NULL;
960 }
961 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000962 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000963 Py_INCREF(x);
964 }
965 }
966 else
967 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000968 Py_DECREF(v);
969 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000971 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000973
Guido van Rossum7928cd71991-10-24 14:59:31 +0000974 case BINARY_LSHIFT:
975 w = POP();
976 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000977 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000978 Py_DECREF(v);
979 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000980 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000981 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000982 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000983
Guido van Rossum7928cd71991-10-24 14:59:31 +0000984 case BINARY_RSHIFT:
985 w = POP();
986 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000987 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(v);
989 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000990 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000991 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000992 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000993
Guido van Rossum7928cd71991-10-24 14:59:31 +0000994 case BINARY_AND:
995 w = POP();
996 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000997 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000998 Py_DECREF(v);
999 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001001 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001002 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001003
Guido van Rossum7928cd71991-10-24 14:59:31 +00001004 case BINARY_XOR:
1005 w = POP();
1006 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001007 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001008 Py_DECREF(v);
1009 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001010 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001011 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001012 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001013
Guido van Rossum7928cd71991-10-24 14:59:31 +00001014 case BINARY_OR:
1015 w = POP();
1016 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001017 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001018 Py_DECREF(v);
1019 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001020 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001021 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001022 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001023
1024 case INPLACE_POWER:
1025 w = POP();
1026 v = POP();
1027 x = PyNumber_InPlacePower(v, w, Py_None);
1028 Py_DECREF(v);
1029 Py_DECREF(w);
1030 PUSH(x);
1031 if (x != NULL) continue;
1032 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001033
Thomas Wouters434d0822000-08-24 20:11:32 +00001034 case INPLACE_MULTIPLY:
1035 w = POP();
1036 v = POP();
1037 x = PyNumber_InPlaceMultiply(v, w);
1038 Py_DECREF(v);
1039 Py_DECREF(w);
1040 PUSH(x);
1041 if (x != NULL) continue;
1042 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001043
Thomas Wouters434d0822000-08-24 20:11:32 +00001044 case INPLACE_DIVIDE:
1045 w = POP();
1046 v = POP();
1047 x = PyNumber_InPlaceDivide(v, w);
1048 Py_DECREF(v);
1049 Py_DECREF(w);
1050 PUSH(x);
1051 if (x != NULL) continue;
1052 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001053
Thomas Wouters434d0822000-08-24 20:11:32 +00001054 case INPLACE_MODULO:
1055 w = POP();
1056 v = POP();
1057 x = PyNumber_InPlaceRemainder(v, w);
1058 Py_DECREF(v);
1059 Py_DECREF(w);
1060 PUSH(x);
1061 if (x != NULL) continue;
1062 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001063
Thomas Wouters434d0822000-08-24 20:11:32 +00001064 case INPLACE_ADD:
1065 w = POP();
1066 v = POP();
1067 if (PyInt_Check(v) && PyInt_Check(w)) {
1068 /* INLINE: int + int */
1069 register long a, b, i;
1070 a = PyInt_AS_LONG(v);
1071 b = PyInt_AS_LONG(w);
1072 i = a + b;
1073 if ((i^a) < 0 && (i^b) < 0) {
1074 PyErr_SetString(PyExc_OverflowError,
1075 "integer addition");
1076 x = NULL;
1077 }
1078 else
1079 x = PyInt_FromLong(i);
1080 }
1081 else
1082 x = PyNumber_InPlaceAdd(v, w);
1083 Py_DECREF(v);
1084 Py_DECREF(w);
1085 PUSH(x);
1086 if (x != NULL) continue;
1087 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001088
Thomas Wouters434d0822000-08-24 20:11:32 +00001089 case INPLACE_SUBTRACT:
1090 w = POP();
1091 v = POP();
1092 if (PyInt_Check(v) && PyInt_Check(w)) {
1093 /* INLINE: int - int */
1094 register long a, b, i;
1095 a = PyInt_AS_LONG(v);
1096 b = PyInt_AS_LONG(w);
1097 i = a - b;
1098 if ((i^a) < 0 && (i^~b) < 0) {
1099 PyErr_SetString(PyExc_OverflowError,
1100 "integer subtraction");
1101 x = NULL;
1102 }
1103 else
1104 x = PyInt_FromLong(i);
1105 }
1106 else
1107 x = PyNumber_InPlaceSubtract(v, w);
1108 Py_DECREF(v);
1109 Py_DECREF(w);
1110 PUSH(x);
1111 if (x != NULL) continue;
1112 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001113
Thomas Wouters434d0822000-08-24 20:11:32 +00001114 case INPLACE_LSHIFT:
1115 w = POP();
1116 v = POP();
1117 x = PyNumber_InPlaceLshift(v, w);
1118 Py_DECREF(v);
1119 Py_DECREF(w);
1120 PUSH(x);
1121 if (x != NULL) continue;
1122 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001123
Thomas Wouters434d0822000-08-24 20:11:32 +00001124 case INPLACE_RSHIFT:
1125 w = POP();
1126 v = POP();
1127 x = PyNumber_InPlaceRshift(v, w);
1128 Py_DECREF(v);
1129 Py_DECREF(w);
1130 PUSH(x);
1131 if (x != NULL) continue;
1132 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001133
Thomas Wouters434d0822000-08-24 20:11:32 +00001134 case INPLACE_AND:
1135 w = POP();
1136 v = POP();
1137 x = PyNumber_InPlaceAnd(v, w);
1138 Py_DECREF(v);
1139 Py_DECREF(w);
1140 PUSH(x);
1141 if (x != NULL) continue;
1142 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001143
Thomas Wouters434d0822000-08-24 20:11:32 +00001144 case INPLACE_XOR:
1145 w = POP();
1146 v = POP();
1147 x = PyNumber_InPlaceXor(v, w);
1148 Py_DECREF(v);
1149 Py_DECREF(w);
1150 PUSH(x);
1151 if (x != NULL) continue;
1152 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001153
Thomas Wouters434d0822000-08-24 20:11:32 +00001154 case INPLACE_OR:
1155 w = POP();
1156 v = POP();
1157 x = PyNumber_InPlaceOr(v, w);
1158 Py_DECREF(v);
1159 Py_DECREF(w);
1160 PUSH(x);
1161 if (x != NULL) continue;
1162 break;
1163
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 case SLICE+0:
1165 case SLICE+1:
1166 case SLICE+2:
1167 case SLICE+3:
1168 if ((opcode-SLICE) & 2)
1169 w = POP();
1170 else
1171 w = NULL;
1172 if ((opcode-SLICE) & 1)
1173 v = POP();
1174 else
1175 v = NULL;
1176 u = POP();
1177 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001178 Py_DECREF(u);
1179 Py_XDECREF(v);
1180 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001182 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001184
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 case STORE_SLICE+0:
1186 case STORE_SLICE+1:
1187 case STORE_SLICE+2:
1188 case STORE_SLICE+3:
1189 if ((opcode-STORE_SLICE) & 2)
1190 w = POP();
1191 else
1192 w = NULL;
1193 if ((opcode-STORE_SLICE) & 1)
1194 v = POP();
1195 else
1196 v = NULL;
1197 u = POP();
1198 t = POP();
1199 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001200 Py_DECREF(t);
1201 Py_DECREF(u);
1202 Py_XDECREF(v);
1203 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001204 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001206
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 case DELETE_SLICE+0:
1208 case DELETE_SLICE+1:
1209 case DELETE_SLICE+2:
1210 case DELETE_SLICE+3:
1211 if ((opcode-DELETE_SLICE) & 2)
1212 w = POP();
1213 else
1214 w = NULL;
1215 if ((opcode-DELETE_SLICE) & 1)
1216 v = POP();
1217 else
1218 v = NULL;
1219 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001220 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001222 Py_DECREF(u);
1223 Py_XDECREF(v);
1224 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001225 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001227
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 case STORE_SUBSCR:
1229 w = POP();
1230 v = POP();
1231 u = POP();
1232 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001233 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001234 Py_DECREF(u);
1235 Py_DECREF(v);
1236 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001237 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001239
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 case DELETE_SUBSCR:
1241 w = POP();
1242 v = POP();
1243 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001244 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001245 Py_DECREF(v);
1246 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001247 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001249
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 case PRINT_EXPR:
1251 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001252 w = PySys_GetObject("displayhook");
1253 if (w == NULL) {
1254 PyErr_SetString(PyExc_RuntimeError,
1255 "lost sys.displayhook");
1256 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001257 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001258 }
1259 if (err == 0) {
1260 x = Py_BuildValue("(O)", v);
1261 if (x == NULL)
1262 err = -1;
1263 }
1264 if (err == 0) {
1265 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001266 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001267 if (w == NULL)
1268 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001270 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001271 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001273
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001274 case PRINT_ITEM_TO:
1275 w = stream = POP();
1276 /* fall through to PRINT_ITEM */
1277
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 case PRINT_ITEM:
1279 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001280 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001281 w = PySys_GetObject("stdout");
1282 if (w == NULL) {
1283 PyErr_SetString(PyExc_RuntimeError,
1284 "lost sys.stdout");
1285 err = -1;
1286 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001287 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001288 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001289 err = PyFile_WriteString(" ", w);
1290 if (err == 0)
1291 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001293 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 char *s = PyString_AsString(v);
1295 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001296 if (len > 0 &&
1297 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001298 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001302 Py_XDECREF(stream);
1303 stream = NULL;
1304 if (err == 0)
1305 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001306 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001307
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001308 case PRINT_NEWLINE_TO:
1309 w = stream = POP();
1310 /* fall through to PRINT_NEWLINE */
1311
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001313 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001314 w = PySys_GetObject("stdout");
1315 if (w == NULL)
1316 PyErr_SetString(PyExc_RuntimeError,
1317 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001318 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001319 if (w != NULL) {
1320 err = PyFile_WriteString("\n", w);
1321 if (err == 0)
1322 PyFile_SoftSpace(w, 0);
1323 }
1324 Py_XDECREF(stream);
1325 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001327
Thomas Wouters434d0822000-08-24 20:11:32 +00001328
1329#ifdef CASE_TOO_BIG
1330 default: switch (opcode) {
1331#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 case BREAK_LOOP:
1333 why = WHY_BREAK;
1334 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001335
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001336 case CONTINUE_LOOP:
1337 retval = PyInt_FromLong(oparg);
1338 why = WHY_CONTINUE;
1339 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001340
Guido van Rossumf10570b1995-07-07 22:53:21 +00001341 case RAISE_VARARGS:
1342 u = v = w = NULL;
1343 switch (oparg) {
1344 case 3:
1345 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001346 /* Fallthrough */
1347 case 2:
1348 v = POP(); /* value */
1349 /* Fallthrough */
1350 case 1:
1351 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001352 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001353 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001354 break;
1355 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001357 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001358 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001359 break;
1360 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001362
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001364 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001365 PyErr_SetString(PyExc_SystemError,
1366 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001367 break;
1368 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001369 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001370 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001372
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 case RETURN_VALUE:
1374 retval = POP();
1375 why = WHY_RETURN;
1376 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001377
Tim Peters5ca576e2001-06-18 22:08:13 +00001378 case YIELD_VALUE:
1379 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001380 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001381 f->f_lasti = INSTR_OFFSET();
1382 why = WHY_YIELD;
1383 break;
1384
1385
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001386 case EXEC_STMT:
1387 w = POP();
1388 v = POP();
1389 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001390 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001391 Py_DECREF(u);
1392 Py_DECREF(v);
1393 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001394 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001395
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 case POP_BLOCK:
1397 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001398 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 while (STACK_LEVEL() > b->b_level) {
1400 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001401 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 }
1403 }
1404 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001405
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 case END_FINALLY:
1407 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001408 if (PyInt_Check(v)) {
1409 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001410 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001411 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001412 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 retval = POP();
1414 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001415 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001417 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001419 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001420 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 else if (v != Py_None) {
1423 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 "'finally' pops bad exception");
1425 why = WHY_EXCEPTION;
1426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001429
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001431 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001432 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001433 w = POP();
1434 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 Py_DECREF(u);
1437 Py_DECREF(v);
1438 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001440
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 case STORE_NAME:
1442 w = GETNAMEV(oparg);
1443 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001444 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001445 PyErr_Format(PyExc_SystemError,
1446 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001447 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001448 break;
1449 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001450 err = PyDict_SetItem(x, w, v);
1451 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001453
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001455 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001456 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001457 PyErr_Format(PyExc_SystemError,
1458 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001459 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001460 break;
1461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001463 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001464 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001466
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001467 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001469 if (PyTuple_Check(v)) {
1470 if (PyTuple_Size(v) != oparg) {
1471 PyErr_SetString(PyExc_ValueError,
1472 "unpack tuple of wrong size");
1473 why = WHY_EXCEPTION;
1474 }
1475 else {
1476 for (; --oparg >= 0; ) {
1477 w = PyTuple_GET_ITEM(v, oparg);
1478 Py_INCREF(w);
1479 PUSH(w);
1480 }
1481 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001483 else if (PyList_Check(v)) {
1484 if (PyList_Size(v) != oparg) {
1485 PyErr_SetString(PyExc_ValueError,
1486 "unpack list of wrong size");
1487 why = WHY_EXCEPTION;
1488 }
1489 else {
1490 for (; --oparg >= 0; ) {
1491 w = PyList_GET_ITEM(v, oparg);
1492 Py_INCREF(w);
1493 PUSH(w);
1494 }
1495 }
1496 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001497 else if (unpack_iterable(v, oparg,
1498 stack_pointer + oparg))
1499 stack_pointer += oparg;
1500 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001501 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001504
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001506 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 v = POP();
1508 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1510 Py_DECREF(v);
1511 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001513
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001515 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001517 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1518 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001519 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001521
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001522 case STORE_GLOBAL:
1523 w = GETNAMEV(oparg);
1524 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 err = PyDict_SetItem(f->f_globals, w, v);
1526 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001529 case DELETE_GLOBAL:
1530 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001532 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001533 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001534 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001535
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 case LOAD_CONST:
1537 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 PUSH(x);
1540 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001541
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001543 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001544 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001545 PyErr_Format(PyExc_SystemError,
1546 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001547 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001548 break;
1549 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001556 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001557 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001558 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 break;
1560 }
1561 }
1562 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 PUSH(x);
1565 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001566
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001568 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001571 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001573 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001574 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001575 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 break;
1577 }
1578 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 PUSH(x);
1581 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001582
Guido van Rossum9bfef441993-03-29 10:43:31 +00001583 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001585 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001586 format_exc_check_arg(
1587 PyExc_UnboundLocalError,
1588 UNBOUNDLOCAL_ERROR_MSG,
1589 PyTuple_GetItem(co->co_varnames, oparg)
1590 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001591 break;
1592 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001594 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001595 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001596 break;
1597
1598 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001599 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001601 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001602
1603 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001604 x = GETLOCAL(oparg);
1605 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001606 format_exc_check_arg(
1607 PyExc_UnboundLocalError,
1608 UNBOUNDLOCAL_ERROR_MSG,
1609 PyTuple_GetItem(co->co_varnames, oparg)
1610 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001611 break;
1612 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001613 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001614 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001615
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001616 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001617 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001618 Py_INCREF(x);
1619 PUSH(x);
1620 break;
1621
1622 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001623 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001624 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001625 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001626 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001627 v = PyTuple_GetItem(co->co_cellvars,
1628 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001629 format_exc_check_arg(
1630 PyExc_UnboundLocalError,
1631 UNBOUNDLOCAL_ERROR_MSG,
1632 v);
1633 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001634 v = PyTuple_GetItem(
1635 co->co_freevars,
1636 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001637 format_exc_check_arg(
1638 PyExc_NameError,
1639 UNBOUNDFREE_ERROR_MSG,
1640 v);
1641 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001642 err = -1;
1643 break;
1644 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001645 PUSH(w);
1646 break;
1647
1648 case STORE_DEREF:
1649 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001650 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001651 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001652 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001653 continue;
1654
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 if (x != NULL) {
1658 for (; --oparg >= 0;) {
1659 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 }
1662 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001663 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 }
1665 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001666
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 if (x != NULL) {
1670 for (; --oparg >= 0;) {
1671 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001672 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 }
1674 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001675 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 }
1677 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001678
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001682 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001684
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001686 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 x = PyObject_GetAttr(v, w);
1689 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001691 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001693
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 case COMPARE_OP:
1695 w = POP();
1696 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001697 if (PyInt_Check(v) && PyInt_Check(w)) {
1698 /* INLINE: cmp(int, int) */
1699 register long a, b;
1700 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001701 a = PyInt_AS_LONG(v);
1702 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001703 switch (oparg) {
1704 case LT: res = a < b; break;
1705 case LE: res = a <= b; break;
1706 case EQ: res = a == b; break;
1707 case NE: res = a != b; break;
1708 case GT: res = a > b; break;
1709 case GE: res = a >= b; break;
1710 case IS: res = v == w; break;
1711 case IS_NOT: res = v != w; break;
1712 default: goto slow_compare;
1713 }
1714 x = res ? Py_True : Py_False;
1715 Py_INCREF(x);
1716 }
1717 else {
1718 slow_compare:
1719 x = cmp_outcome(oparg, v, w);
1720 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001721 Py_DECREF(v);
1722 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001724 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001726
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001728 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001729 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001730 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001732 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001733 break;
1734 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001735 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001737 w,
1738 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001739 f->f_locals == NULL ?
1740 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001741 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001743 if (w == NULL) {
1744 x = NULL;
1745 break;
1746 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 x = PyEval_CallObject(x, w);
1748 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001749 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001750 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001752
Thomas Wouters52152252000-08-17 22:55:00 +00001753 case IMPORT_STAR:
1754 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001755 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001756 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001757 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001758 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001759 break;
1760 }
Thomas Wouters52152252000-08-17 22:55:00 +00001761 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001763 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001764 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001766
Thomas Wouters52152252000-08-17 22:55:00 +00001767 case IMPORT_FROM:
1768 w = GETNAMEV(oparg);
1769 v = TOP();
1770 x = import_from(v, w);
1771 PUSH(x);
1772 if (x != NULL) continue;
1773 break;
1774
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 case JUMP_FORWARD:
1776 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001777 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001778
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001780 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001781 if (err > 0)
1782 err = 0;
1783 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001785 else
1786 break;
1787 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001788
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001791 if (err > 0) {
1792 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001794 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001795 else if (err == 0)
1796 ;
1797 else
1798 break;
1799 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001800
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 case JUMP_ABSOLUTE:
1802 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001803 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001804
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001805 case GET_ITER:
1806 /* before: [obj]; after [getiter(obj)] */
1807 v = POP();
1808 x = PyObject_GetIter(v);
1809 Py_DECREF(v);
1810 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001811 PUSH(x);
1812 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001813 }
1814 break;
1815
1816 case FOR_ITER:
1817 /* before: [iter]; after: [iter, iter()] *or* [] */
1818 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001819 x = PyIter_Next(v);
1820 if (x != NULL) {
1821 PUSH(x);
1822 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001823 }
Tim Petersf4848da2001-05-05 00:14:56 +00001824 if (!PyErr_Occurred()) {
1825 /* iterator ended normally */
1826 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001827 Py_DECREF(v);
1828 JUMPBY(oparg);
1829 continue;
1830 }
1831 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001832
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 case FOR_LOOP:
1834 /* for v in s: ...
1835 On entry: stack contains s, i.
1836 On exit: stack contains s, i+1, s[i];
1837 but if loop exhausted:
1838 s, i are popped, and we jump */
1839 w = POP(); /* Loop index */
1840 v = POP(); /* Sequence object */
1841 u = loop_subscript(v, w);
1842 if (u != NULL) {
1843 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001845 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001848 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 }
1850 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 Py_DECREF(v);
1852 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 /* A NULL can mean "s exhausted"
1854 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001857 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001859 continue;
1860 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001861 }
1862 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001863
Guido van Rossum374a9221991-04-04 10:40:29 +00001864 case SETUP_LOOP:
1865 case SETUP_EXCEPT:
1866 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001867 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001868 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001870
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001872#ifdef LLTRACE
1873 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001874 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001875#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001876 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001877 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001878 continue;
1879 /* Trace each line of code reached */
1880 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001881 /* Inline call_trace() for performance: */
1882 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001883 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001884 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1885 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001886 tstate->use_tracing = (tstate->c_tracefunc
1887 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001888 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001889 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001890
1891 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001892 {
1893 int na = oparg & 0xff;
1894 int nk = (oparg>>8) & 0xff;
1895 int n = na + 2 * nk;
1896 PyObject **pfunc = stack_pointer - n - 1;
1897 PyObject *func = *pfunc;
1898 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1899
1900 /* Always dispatch PyCFunction first, because
1901 these are presumed to be the most frequent
1902 callable object.
1903 */
1904 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001905 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001906 if (flags > 1 || nk != 0)
1907 x = do_call(func, &stack_pointer,
1908 na, nk);
1909 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001910 PyObject *callargs;
1911 callargs = load_args(&stack_pointer, na);
1912 x = call_cfunction(func, callargs, NULL);
1913 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001914 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001915 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001916 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001917 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001918 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001919 && PyMethod_GET_SELF(func) != NULL) {
1920 /* optimize access to bound methods */
1921 PyObject *self = PyMethod_GET_SELF(func);
1922 Py_INCREF(self);
1923 func = PyMethod_GET_FUNCTION(func);
1924 Py_INCREF(func);
1925 Py_DECREF(*pfunc);
1926 *pfunc = self;
1927 na++;
1928 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001929 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001930 Py_INCREF(func);
1931 if (PyFunction_Check(func)) {
1932 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001933 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001934 } else {
1935 x = do_call(func, &stack_pointer,
1936 na, nk);
1937 }
1938 Py_DECREF(func);
1939 }
1940
1941 while (stack_pointer > pfunc) {
1942 w = POP();
1943 Py_DECREF(w);
1944 }
1945 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001946 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001947 continue;
1948 break;
1949 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001950
Jeremy Hylton76901512000-03-28 23:49:17 +00001951 case CALL_FUNCTION_VAR:
1952 case CALL_FUNCTION_KW:
1953 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001954 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001955 int na = oparg & 0xff;
1956 int nk = (oparg>>8) & 0xff;
1957 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001958 int n = na + 2 * nk;
1959 PyObject **pfunc, *func;
1960 if (flags & CALL_FLAG_VAR)
1961 n++;
1962 if (flags & CALL_FLAG_KW)
1963 n++;
1964 pfunc = stack_pointer - n - 1;
1965 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001966 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001967
Guido van Rossumac7be682001-01-17 15:42:30 +00001968 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001969 && PyMethod_GET_SELF(func) != NULL) {
1970 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001971 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001972 func = PyMethod_GET_FUNCTION(func);
1973 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001974 Py_DECREF(*pfunc);
1975 *pfunc = self;
1976 na++;
1977 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001978 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 Py_INCREF(func);
1980 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001981 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001982
Jeremy Hylton76901512000-03-28 23:49:17 +00001983 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001984 w = POP();
1985 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001986 }
1987 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001988 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001989 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001990 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001991 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001992
Guido van Rossum681d79a1995-07-18 14:51:37 +00001993 case MAKE_FUNCTION:
1994 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001995 x = PyFunction_New(v, f->f_globals);
1996 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001997 /* XXX Maybe this should be a separate opcode? */
1998 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002000 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002001 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002002 x = NULL;
2003 break;
2004 }
2005 while (--oparg >= 0) {
2006 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002008 }
2009 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002010 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002011 }
2012 PUSH(x);
2013 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002014
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002015 case MAKE_CLOSURE:
2016 {
2017 int nfree;
2018 v = POP(); /* code object */
2019 x = PyFunction_New(v, f->f_globals);
2020 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2021 Py_DECREF(v);
2022 /* XXX Maybe this should be a separate opcode? */
2023 if (x != NULL && nfree > 0) {
2024 v = PyTuple_New(nfree);
2025 if (v == NULL) {
2026 Py_DECREF(x);
2027 x = NULL;
2028 break;
2029 }
2030 while (--nfree >= 0) {
2031 w = POP();
2032 PyTuple_SET_ITEM(v, nfree, w);
2033 }
2034 err = PyFunction_SetClosure(x, v);
2035 Py_DECREF(v);
2036 }
2037 if (x != NULL && oparg > 0) {
2038 v = PyTuple_New(oparg);
2039 if (v == NULL) {
2040 Py_DECREF(x);
2041 x = NULL;
2042 break;
2043 }
2044 while (--oparg >= 0) {
2045 w = POP();
2046 PyTuple_SET_ITEM(v, oparg, w);
2047 }
2048 err = PyFunction_SetDefaults(x, v);
2049 Py_DECREF(v);
2050 }
2051 PUSH(x);
2052 break;
2053 }
2054
Guido van Rossum8861b741996-07-30 16:49:37 +00002055 case BUILD_SLICE:
2056 if (oparg == 3)
2057 w = POP();
2058 else
2059 w = NULL;
2060 v = POP();
2061 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002062 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 Py_DECREF(u);
2064 Py_DECREF(v);
2065 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002066 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002067 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002068 break;
2069
Fred Drakeef8ace32000-08-24 00:32:09 +00002070 case EXTENDED_ARG:
2071 opcode = NEXTOP();
2072 oparg = oparg<<16 | NEXTARG();
2073 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002074
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 default:
2076 fprintf(stderr,
2077 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002078 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002079 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002080 why = WHY_EXCEPTION;
2081 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002082
2083#ifdef CASE_TOO_BIG
2084 }
2085#endif
2086
Guido van Rossum374a9221991-04-04 10:40:29 +00002087 } /* switch */
2088
2089 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002090
Guido van Rossum374a9221991-04-04 10:40:29 +00002091 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002092
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002094 if (err == 0 && x != NULL) {
2095#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002096 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002098 fprintf(stderr,
2099 "XXX undetected error\n");
2100 else
2101#endif
2102 continue; /* Normal, fast path */
2103 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002104 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002105 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002106 err = 0;
2107 }
2108
Guido van Rossum374a9221991-04-04 10:40:29 +00002109 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002110
Guido van Rossum374a9221991-04-04 10:40:29 +00002111 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002112 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002113 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002114 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002115 why = WHY_EXCEPTION;
2116 }
2117 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002118#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002120 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002121 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002122 fprintf(stderr,
2123 "XXX undetected error (why=%d)\n",
2124 why);
2125 why = WHY_EXCEPTION;
2126 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 }
2128#endif
2129
2130 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002131
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002133 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002135 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002137
Fred Drake9e3ad782001-07-03 23:39:52 +00002138 if (tstate->use_tracing) {
2139 if (tstate->c_tracefunc)
2140 call_exc_trace(tstate->c_tracefunc,
2141 tstate->c_traceobj, f);
2142 if (tstate->c_profilefunc)
2143 call_exc_trace(tstate->c_profilefunc,
2144 tstate->c_profileobj,f);
2145 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002146 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002147
Guido van Rossum374a9221991-04-04 10:40:29 +00002148 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002149
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 if (why == WHY_RERAISE)
2151 why = WHY_EXCEPTION;
2152
2153 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002154
Tim Peters5ca576e2001-06-18 22:08:13 +00002155 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002157
2158 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2159 /* For a continue inside a try block,
2160 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002161 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002162 b->b_handler);
2163 why = WHY_NOT;
2164 JUMPTO(PyInt_AS_LONG(retval));
2165 Py_DECREF(retval);
2166 break;
2167 }
2168
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 while (STACK_LEVEL() > b->b_level) {
2170 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 }
2173 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2174 why = WHY_NOT;
2175 JUMPTO(b->b_handler);
2176 break;
2177 }
2178 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002179 (b->b_type == SETUP_EXCEPT &&
2180 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002182 PyObject *exc, *val, *tb;
2183 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 val = Py_None;
2186 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 /* Make the raw exception data
2189 available to the handler,
2190 so a program can emulate the
2191 Python main loop. Don't do
2192 this for 'finally'. */
2193 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002194 PyErr_NormalizeException(
2195 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002196 set_exc_info(tstate,
2197 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002198 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002199 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002200 PUSH(val);
2201 PUSH(exc);
2202 }
2203 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002204 if (why == WHY_RETURN ||
2205 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 PUSH(v);
2209 }
2210 why = WHY_NOT;
2211 JUMPTO(b->b_handler);
2212 break;
2213 }
2214 } /* unwind stack */
2215
2216 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002217
Guido van Rossum374a9221991-04-04 10:40:29 +00002218 if (why != WHY_NOT)
2219 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002220
Guido van Rossum374a9221991-04-04 10:40:29 +00002221 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002222
Tim Peters5ca576e2001-06-18 22:08:13 +00002223 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002224 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002225
Fred Drake9e3ad782001-07-03 23:39:52 +00002226 if (tstate->use_tracing) {
2227 if (tstate->c_tracefunc
2228 && (why == WHY_RETURN || why == WHY_YIELD)) {
2229 if (call_trace(tstate->c_tracefunc,
2230 tstate->c_traceobj, f,
2231 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002232 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002233 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002234 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002235 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002236 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002237 if (tstate->c_profilefunc
2238 && (why == WHY_RETURN || why == WHY_YIELD)) {
2239 if (call_trace(tstate->c_profilefunc,
2240 tstate->c_profileobj, f,
2241 PyTrace_RETURN, retval)) {
2242 Py_XDECREF(retval);
2243 retval = NULL;
2244 why = WHY_EXCEPTION;
2245 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002246 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002247 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002248
Guido van Rossuma027efa1997-05-05 20:56:21 +00002249 reset_exc_info(tstate);
2250
Tim Peters5ca576e2001-06-18 22:08:13 +00002251 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002252 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002253 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002254
Guido van Rossum96a42c81992-01-12 02:29:51 +00002255 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002256}
2257
Tim Peters6d6c1a32001-08-02 04:15:00 +00002258PyObject *
2259PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002260 PyObject **args, int argcount, PyObject **kws, int kwcount,
2261 PyObject **defs, int defcount, PyObject *closure)
2262{
2263 register PyFrameObject *f;
2264 register PyObject *retval = NULL;
2265 register PyObject **fastlocals, **freevars;
2266 PyThreadState *tstate = PyThreadState_GET();
2267 PyObject *x, *u;
2268
2269 if (globals == NULL) {
2270 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2271 return NULL;
2272 }
2273
2274 f = PyFrame_New(tstate, /*back*/
2275 co, /*code*/
2276 globals, locals);
2277 if (f == NULL)
2278 return NULL;
2279
2280 fastlocals = f->f_localsplus;
2281 freevars = f->f_localsplus + f->f_nlocals;
2282
2283 if (co->co_argcount > 0 ||
2284 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2285 int i;
2286 int n = argcount;
2287 PyObject *kwdict = NULL;
2288 if (co->co_flags & CO_VARKEYWORDS) {
2289 kwdict = PyDict_New();
2290 if (kwdict == NULL)
2291 goto fail;
2292 i = co->co_argcount;
2293 if (co->co_flags & CO_VARARGS)
2294 i++;
2295 SETLOCAL(i, kwdict);
2296 }
2297 if (argcount > co->co_argcount) {
2298 if (!(co->co_flags & CO_VARARGS)) {
2299 PyErr_Format(PyExc_TypeError,
2300 "%.200s() takes %s %d "
2301 "%sargument%s (%d given)",
2302 PyString_AsString(co->co_name),
2303 defcount ? "at most" : "exactly",
2304 co->co_argcount,
2305 kwcount ? "non-keyword " : "",
2306 co->co_argcount == 1 ? "" : "s",
2307 argcount);
2308 goto fail;
2309 }
2310 n = co->co_argcount;
2311 }
2312 for (i = 0; i < n; i++) {
2313 x = args[i];
2314 Py_INCREF(x);
2315 SETLOCAL(i, x);
2316 }
2317 if (co->co_flags & CO_VARARGS) {
2318 u = PyTuple_New(argcount - n);
2319 if (u == NULL)
2320 goto fail;
2321 SETLOCAL(co->co_argcount, u);
2322 for (i = n; i < argcount; i++) {
2323 x = args[i];
2324 Py_INCREF(x);
2325 PyTuple_SET_ITEM(u, i-n, x);
2326 }
2327 }
2328 for (i = 0; i < kwcount; i++) {
2329 PyObject *keyword = kws[2*i];
2330 PyObject *value = kws[2*i + 1];
2331 int j;
2332 if (keyword == NULL || !PyString_Check(keyword)) {
2333 PyErr_Format(PyExc_TypeError,
2334 "%.200s() keywords must be strings",
2335 PyString_AsString(co->co_name));
2336 goto fail;
2337 }
2338 /* XXX slow -- speed up using dictionary? */
2339 for (j = 0; j < co->co_argcount; j++) {
2340 PyObject *nm = PyTuple_GET_ITEM(
2341 co->co_varnames, j);
2342 int cmp = PyObject_RichCompareBool(
2343 keyword, nm, Py_EQ);
2344 if (cmp > 0)
2345 break;
2346 else if (cmp < 0)
2347 goto fail;
2348 }
2349 /* Check errors from Compare */
2350 if (PyErr_Occurred())
2351 goto fail;
2352 if (j >= co->co_argcount) {
2353 if (kwdict == NULL) {
2354 PyErr_Format(PyExc_TypeError,
2355 "%.200s() got an unexpected "
2356 "keyword argument '%.400s'",
2357 PyString_AsString(co->co_name),
2358 PyString_AsString(keyword));
2359 goto fail;
2360 }
2361 PyDict_SetItem(kwdict, keyword, value);
2362 }
2363 else {
2364 if (GETLOCAL(j) != NULL) {
2365 PyErr_Format(PyExc_TypeError,
2366 "%.200s() got multiple "
2367 "values for keyword "
2368 "argument '%.400s'",
2369 PyString_AsString(co->co_name),
2370 PyString_AsString(keyword));
2371 goto fail;
2372 }
2373 Py_INCREF(value);
2374 SETLOCAL(j, value);
2375 }
2376 }
2377 if (argcount < co->co_argcount) {
2378 int m = co->co_argcount - defcount;
2379 for (i = argcount; i < m; i++) {
2380 if (GETLOCAL(i) == NULL) {
2381 PyErr_Format(PyExc_TypeError,
2382 "%.200s() takes %s %d "
2383 "%sargument%s (%d given)",
2384 PyString_AsString(co->co_name),
2385 ((co->co_flags & CO_VARARGS) ||
2386 defcount) ? "at least"
2387 : "exactly",
2388 m, kwcount ? "non-keyword " : "",
2389 m == 1 ? "" : "s", i);
2390 goto fail;
2391 }
2392 }
2393 if (n > m)
2394 i = n - m;
2395 else
2396 i = 0;
2397 for (; i < defcount; i++) {
2398 if (GETLOCAL(m+i) == NULL) {
2399 PyObject *def = defs[i];
2400 Py_INCREF(def);
2401 SETLOCAL(m+i, def);
2402 }
2403 }
2404 }
2405 }
2406 else {
2407 if (argcount > 0 || kwcount > 0) {
2408 PyErr_Format(PyExc_TypeError,
2409 "%.200s() takes no arguments (%d given)",
2410 PyString_AsString(co->co_name),
2411 argcount + kwcount);
2412 goto fail;
2413 }
2414 }
2415 /* Allocate and initialize storage for cell vars, and copy free
2416 vars into frame. This isn't too efficient right now. */
2417 if (f->f_ncells) {
2418 int i = 0, j = 0, nargs, found;
2419 char *cellname, *argname;
2420 PyObject *c;
2421
2422 nargs = co->co_argcount;
2423 if (co->co_flags & CO_VARARGS)
2424 nargs++;
2425 if (co->co_flags & CO_VARKEYWORDS)
2426 nargs++;
2427
2428 /* Check for cells that shadow args */
2429 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2430 cellname = PyString_AS_STRING(
2431 PyTuple_GET_ITEM(co->co_cellvars, i));
2432 found = 0;
2433 while (j < nargs) {
2434 argname = PyString_AS_STRING(
2435 PyTuple_GET_ITEM(co->co_varnames, j));
2436 if (strcmp(cellname, argname) == 0) {
2437 c = PyCell_New(GETLOCAL(j));
2438 if (c == NULL)
2439 goto fail;
2440 GETLOCAL(f->f_nlocals + i) = c;
2441 found = 1;
2442 break;
2443 }
2444 j++;
2445 }
2446 if (found == 0) {
2447 c = PyCell_New(NULL);
2448 if (c == NULL)
2449 goto fail;
2450 SETLOCAL(f->f_nlocals + i, c);
2451 }
2452 }
2453 /* Initialize any that are left */
2454 while (i < f->f_ncells) {
2455 c = PyCell_New(NULL);
2456 if (c == NULL)
2457 goto fail;
2458 SETLOCAL(f->f_nlocals + i, c);
2459 i++;
2460 }
2461 }
2462 if (f->f_nfreevars) {
2463 int i;
2464 for (i = 0; i < f->f_nfreevars; ++i) {
2465 PyObject *o = PyTuple_GET_ITEM(closure, i);
2466 Py_INCREF(o);
2467 freevars[f->f_ncells + i] = o;
2468 }
2469 }
2470
Fred Drake9e3ad782001-07-03 23:39:52 +00002471 if (tstate->use_tracing) {
2472 if (tstate->c_tracefunc != NULL) {
2473 /* tstate->c_tracefunc, if defined, is a
2474 function that will be called on *every* entry
2475 to a code block. Its return value, if not
2476 None, is a function that will be called at
2477 the start of each executed line of code.
2478 (Actually, the function must return itself
2479 in order to continue tracing.) The trace
2480 functions are called with three arguments:
2481 a pointer to the current frame, a string
2482 indicating why the function is called, and
2483 an argument which depends on the situation.
2484 The global trace function is also called
2485 whenever an exception is detected. */
2486 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2487 f, PyTrace_CALL, Py_None)) {
2488 /* XXX Need way to compute arguments?? */
2489 /* Trace function raised an error */
2490 goto fail;
2491 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002492 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002493 if (tstate->c_profilefunc != NULL) {
2494 /* Similar for c_profilefunc, except it needn't
2495 return itself and isn't called for "line" events */
2496 if (call_trace(tstate->c_profilefunc,
2497 tstate->c_profileobj,
2498 f, PyTrace_CALL, Py_None)) {
2499 /* XXX Need way to compute arguments?? */
2500 /* Profile function raised an error */
2501 goto fail;
2502 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002503 }
2504 }
2505
2506 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002507 /* Don't need to keep the reference to f_back, it will be set
2508 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002509 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002510 f->f_back = NULL;
2511
2512 /* Create a new generator that owns the ready to run frame
2513 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002514 return gen_new(f);
2515 }
2516
2517 retval = eval_frame(f);
2518
2519 fail: /* Jump here from prelude on failure */
2520
2521 Py_DECREF(f);
2522 return retval;
2523}
2524
2525
Guido van Rossuma027efa1997-05-05 20:56:21 +00002526static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002527set_exc_info(PyThreadState *tstate,
2528 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002529{
2530 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002531 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002532
Guido van Rossuma027efa1997-05-05 20:56:21 +00002533 frame = tstate->frame;
2534 if (frame->f_exc_type == NULL) {
2535 /* This frame didn't catch an exception before */
2536 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002537 if (tstate->exc_type == NULL) {
2538 Py_INCREF(Py_None);
2539 tstate->exc_type = Py_None;
2540 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002541 tmp_type = frame->f_exc_type;
2542 tmp_value = frame->f_exc_value;
2543 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002544 Py_XINCREF(tstate->exc_type);
2545 Py_XINCREF(tstate->exc_value);
2546 Py_XINCREF(tstate->exc_traceback);
2547 frame->f_exc_type = tstate->exc_type;
2548 frame->f_exc_value = tstate->exc_value;
2549 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002550 Py_XDECREF(tmp_type);
2551 Py_XDECREF(tmp_value);
2552 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553 }
2554 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002555 tmp_type = tstate->exc_type;
2556 tmp_value = tstate->exc_value;
2557 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002558 Py_XINCREF(type);
2559 Py_XINCREF(value);
2560 Py_XINCREF(tb);
2561 tstate->exc_type = type;
2562 tstate->exc_value = value;
2563 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002564 Py_XDECREF(tmp_type);
2565 Py_XDECREF(tmp_value);
2566 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002567 /* For b/w compatibility */
2568 PySys_SetObject("exc_type", type);
2569 PySys_SetObject("exc_value", value);
2570 PySys_SetObject("exc_traceback", tb);
2571}
2572
2573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002574reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002575{
2576 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002577 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578 frame = tstate->frame;
2579 if (frame->f_exc_type != NULL) {
2580 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002581 tmp_type = tstate->exc_type;
2582 tmp_value = tstate->exc_value;
2583 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584 Py_XINCREF(frame->f_exc_type);
2585 Py_XINCREF(frame->f_exc_value);
2586 Py_XINCREF(frame->f_exc_traceback);
2587 tstate->exc_type = frame->f_exc_type;
2588 tstate->exc_value = frame->f_exc_value;
2589 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002590 Py_XDECREF(tmp_type);
2591 Py_XDECREF(tmp_value);
2592 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002593 /* For b/w compatibility */
2594 PySys_SetObject("exc_type", frame->f_exc_type);
2595 PySys_SetObject("exc_value", frame->f_exc_value);
2596 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2597 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002598 tmp_type = frame->f_exc_type;
2599 tmp_value = frame->f_exc_value;
2600 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002601 frame->f_exc_type = NULL;
2602 frame->f_exc_value = NULL;
2603 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002604 Py_XDECREF(tmp_type);
2605 Py_XDECREF(tmp_value);
2606 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607}
2608
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002609/* Logic for the raise statement (too complicated for inlining).
2610 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002611static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002613{
Guido van Rossumd295f121998-04-09 21:39:57 +00002614 if (type == NULL) {
2615 /* Reraise */
2616 PyThreadState *tstate = PyThreadState_Get();
2617 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2618 value = tstate->exc_value;
2619 tb = tstate->exc_traceback;
2620 Py_XINCREF(type);
2621 Py_XINCREF(value);
2622 Py_XINCREF(tb);
2623 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002624
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002625 /* We support the following forms of raise:
2626 raise <class>, <classinstance>
2627 raise <class>, <argument tuple>
2628 raise <class>, None
2629 raise <class>, <argument>
2630 raise <classinstance>, None
2631 raise <string>, <object>
2632 raise <string>, None
2633
2634 An omitted second argument is the same as None.
2635
2636 In addition, raise <tuple>, <anything> is the same as
2637 raising the tuple's first item (and it better have one!);
2638 this rule is applied recursively.
2639
2640 Finally, an optional third argument can be supplied, which
2641 gives the traceback to be substituted (useful when
2642 re-raising an exception after examining it). */
2643
2644 /* First, check the traceback argument, replacing None with
2645 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002646 if (tb == Py_None) {
2647 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002648 tb = NULL;
2649 }
2650 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002651 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002652 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002653 goto raise_error;
2654 }
2655
2656 /* Next, replace a missing value with None */
2657 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 value = Py_None;
2659 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002660 }
2661
2662 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002663 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2664 PyObject *tmp = type;
2665 type = PyTuple_GET_ITEM(type, 0);
2666 Py_INCREF(type);
2667 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002668 }
2669
Barry Warsaw4249f541997-08-22 21:26:19 +00002670 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002671 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002672
2673 else if (PyClass_Check(type))
2674 PyErr_NormalizeException(&type, &value, &tb);
2675
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002677 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 if (value != Py_None) {
2679 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002680 "instance exception may not have a separate value");
2681 goto raise_error;
2682 }
2683 else {
2684 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2688 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002689 }
2690 }
2691 else {
2692 /* Not something you can raise. You get an exception
2693 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002694 PyErr_Format(PyExc_TypeError,
2695 "exceptions must be strings, classes, or "
2696 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002697 goto raise_error;
2698 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002700 if (tb == NULL)
2701 return WHY_EXCEPTION;
2702 else
2703 return WHY_RERAISE;
2704 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 Py_XDECREF(value);
2706 Py_XDECREF(type);
2707 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002708 return WHY_EXCEPTION;
2709}
2710
Tim Petersd6d010b2001-06-21 02:49:55 +00002711/* Iterate v argcnt times and store the results on the stack (via decreasing
2712 sp). Return 1 for success, 0 if error. */
2713
Barry Warsawe42b18f1997-08-25 22:13:04 +00002714static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002715unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002716{
Tim Petersd6d010b2001-06-21 02:49:55 +00002717 int i = 0;
2718 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002719 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002720
Tim Petersd6d010b2001-06-21 02:49:55 +00002721 assert(v != NULL);
2722
2723 it = PyObject_GetIter(v);
2724 if (it == NULL)
2725 goto Error;
2726
2727 for (; i < argcnt; i++) {
2728 w = PyIter_Next(it);
2729 if (w == NULL) {
2730 /* Iterator done, via error or exhaustion. */
2731 if (!PyErr_Occurred()) {
2732 PyErr_Format(PyExc_ValueError,
2733 "need more than %d value%s to unpack",
2734 i, i == 1 ? "" : "s");
2735 }
2736 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002737 }
2738 *--sp = w;
2739 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002740
2741 /* We better have exhausted the iterator now. */
2742 w = PyIter_Next(it);
2743 if (w == NULL) {
2744 if (PyErr_Occurred())
2745 goto Error;
2746 Py_DECREF(it);
2747 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002748 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002749 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002750 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002751Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002752 for (; i > 0; i--, sp++)
2753 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002754 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002755 return 0;
2756}
2757
2758
Guido van Rossum96a42c81992-01-12 02:29:51 +00002759#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002760static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002761prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002763 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 if (PyObject_Print(v, stdout, 0) != 0)
2765 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002766 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002767 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002769#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002771static void
Fred Drake5755ce62001-06-27 19:19:46 +00002772call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002773{
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002775 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002777 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002778 value = Py_None;
2779 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002780 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002782 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002784 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002785 }
Fred Drake5755ce62001-06-27 19:19:46 +00002786 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002787 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002788 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002790 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 Py_XDECREF(type);
2792 Py_XDECREF(value);
2793 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002794 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002795}
2796
2797static int
Fred Drake5755ce62001-06-27 19:19:46 +00002798call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2799 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002800{
Fred Drake5755ce62001-06-27 19:19:46 +00002801 register PyThreadState *tstate = frame->f_tstate;
2802 int result;
2803 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002805 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002806 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002807 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002808 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2809 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002810 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002811 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002812}
2813
Fred Drake5755ce62001-06-27 19:19:46 +00002814void
2815PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002816{
Fred Drake5755ce62001-06-27 19:19:46 +00002817 PyThreadState *tstate = PyThreadState_Get();
2818 PyObject *temp = tstate->c_profileobj;
2819 Py_XINCREF(arg);
2820 tstate->c_profilefunc = NULL;
2821 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002822 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002823 Py_XDECREF(temp);
2824 tstate->c_profilefunc = func;
2825 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002826 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002827}
2828
2829void
2830PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2831{
2832 PyThreadState *tstate = PyThreadState_Get();
2833 PyObject *temp = tstate->c_traceobj;
2834 Py_XINCREF(arg);
2835 tstate->c_tracefunc = NULL;
2836 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002837 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002838 Py_XDECREF(temp);
2839 tstate->c_tracefunc = func;
2840 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002841 tstate->use_tracing = ((func != NULL)
2842 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002843}
2844
Guido van Rossumb209a111997-04-29 18:18:01 +00002845PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002846PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002847{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002848 PyThreadState *tstate = PyThreadState_Get();
2849 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002850 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002851 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002852 else
2853 return current_frame->f_builtins;
2854}
2855
Guido van Rossumb209a111997-04-29 18:18:01 +00002856PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002857PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002858{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002859 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002860 if (current_frame == NULL)
2861 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002862 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002863 return current_frame->f_locals;
2864}
2865
Guido van Rossumb209a111997-04-29 18:18:01 +00002866PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002867PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002868{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002869 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002870 if (current_frame == NULL)
2871 return NULL;
2872 else
2873 return current_frame->f_globals;
2874}
2875
Guido van Rossumb209a111997-04-29 18:18:01 +00002876PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002877PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002878{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002879 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002880 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002881}
2882
Guido van Rossum6135a871995-01-09 17:53:26 +00002883int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002884PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002885{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002886 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002887 return current_frame == NULL ? 0 : current_frame->f_restricted;
2888}
2889
Guido van Rossumbe270261997-05-22 22:26:18 +00002890int
Tim Peters5ba58662001-07-16 02:29:45 +00002891PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002892{
2893 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002894 int result = 0;
2895
2896 if (current_frame != NULL) {
2897 const int codeflags = current_frame->f_code->co_flags;
2898 if (codeflags & CO_NESTED) {
2899 result = 1;
2900 cf->cf_flags |= PyCF_NESTED_SCOPES;
2901 }
2902 if (codeflags & CO_GENERATOR_ALLOWED) {
2903 result = 1;
2904 cf->cf_flags |= PyCF_GENERATORS;
2905 }
2906 }
2907 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002908}
2909
2910int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912{
Guido van Rossumb209a111997-04-29 18:18:01 +00002913 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002914 if (f == NULL)
2915 return 0;
2916 if (!PyFile_SoftSpace(f, 0))
2917 return 0;
2918 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919}
2920
Guido van Rossum3f5da241990-12-20 15:06:42 +00002921
Guido van Rossum681d79a1995-07-18 14:51:37 +00002922/* External interface to call any callable object.
2923 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002924
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002925#undef PyEval_CallObject
2926/* for backward compatibility: export this interface */
2927
Guido van Rossumb209a111997-04-29 18:18:01 +00002928PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002929PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002930{
Guido van Rossumb209a111997-04-29 18:18:01 +00002931 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002932}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002933#define PyEval_CallObject(func,arg) \
2934 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002935
Guido van Rossumb209a111997-04-29 18:18:01 +00002936PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002937PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002938{
Jeremy Hylton52820442001-01-03 23:52:36 +00002939 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002940
2941 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002942 arg = PyTuple_New(0);
2943 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002944 PyErr_SetString(PyExc_TypeError,
2945 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002946 return NULL;
2947 }
2948 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002949 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002950
Guido van Rossumb209a111997-04-29 18:18:01 +00002951 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002952 PyErr_SetString(PyExc_TypeError,
2953 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002954 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002955 return NULL;
2956 }
2957
Tim Peters6d6c1a32001-08-02 04:15:00 +00002958 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002959 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002960 return result;
2961}
2962
2963/* How often is each kind of object called? The answer depends on the
Tim Peters6d6c1a32001-08-02 04:15:00 +00002964 program. An instrumented PyObject_Call() was used to run the Python
Jeremy Hylton52820442001-01-03 23:52:36 +00002965 regression test suite. The results were:
2966 4200000 PyCFunctions
2967 390000 fast_function() calls
2968 94000 other functions
2969 480000 all functions (sum of prev two)
2970 150000 methods
2971 100000 classes
2972
2973 Tests on other bodies of code show that PyCFunctions are still
2974 most common, but not by such a large margin.
2975*/
2976
Tim Peters6d6c1a32001-08-02 04:15:00 +00002977char *
2978PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00002979{
2980 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00002981 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00002982 else if (PyFunction_Check(func))
2983 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2984 else if (PyCFunction_Check(func))
2985 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2986 else if (PyClass_Check(func))
2987 return PyString_AsString(((PyClassObject*)func)->cl_name);
2988 else if (PyInstance_Check(func)) {
2989 return PyString_AsString(
2990 ((PyInstanceObject*)func)->in_class->cl_name);
2991 } else {
2992 return func->ob_type->tp_name;
2993 }
2994}
2995
Tim Peters6d6c1a32001-08-02 04:15:00 +00002996char *
2997PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00002998{
2999 if (PyMethod_Check(func))
3000 return "()";
3001 else if (PyFunction_Check(func))
3002 return "()";
3003 else if (PyCFunction_Check(func))
3004 return "()";
3005 else if (PyClass_Check(func))
3006 return " constructor";
3007 else if (PyInstance_Check(func)) {
3008 return " instance";
3009 } else {
3010 return " object";
3011 }
3012}
3013
Jeremy Hylton52820442001-01-03 23:52:36 +00003014static PyObject *
3015call_object(PyObject *func, PyObject *arg, PyObject *kw)
3016{
3017 ternaryfunc call;
3018 PyObject *result;
3019
3020 if (PyMethod_Check(func))
3021 result = call_method(func, arg, kw);
3022 else if (PyFunction_Check(func))
3023 result = call_eval_code2(func, arg, kw);
3024 else if (PyCFunction_Check(func))
3025 result = call_cfunction(func, arg, kw);
3026 else if (PyClass_Check(func))
3027 result = PyInstance_New(func, arg, kw);
3028 else if (PyInstance_Check(func))
3029 result = call_instance(func, arg, kw);
3030 else if ((call = func->ob_type->tp_call) != NULL)
3031 result = (*call)(func, arg, kw);
3032 else {
Tim Peters239508c2001-06-16 00:09:28 +00003033 PyErr_Format(PyExc_TypeError,
3034 "object of type '%.100s' is not callable",
3035 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003036 return NULL;
3037 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003038 if (result == NULL && !PyErr_Occurred())
3039 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003040 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003041
Guido van Rossume59214e1994-08-30 08:01:59 +00003042 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003043}
3044
Guido van Rossumb209a111997-04-29 18:18:01 +00003045static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003046call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047{
Jeremy Hylton52820442001-01-03 23:52:36 +00003048 PyCFunctionObject* f = (PyCFunctionObject*)func;
3049 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3050 PyObject *self = PyCFunction_GET_SELF(func);
3051 int flags = PyCFunction_GET_FLAGS(func);
3052
Jeremy Hylton52820442001-01-03 23:52:36 +00003053 if (flags & METH_KEYWORDS) {
3054 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003055 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003056 if (kw != NULL && PyDict_Size(kw) != 0) {
3057 PyErr_Format(PyExc_TypeError,
3058 "%.200s() takes no keyword arguments",
3059 f->m_ml->ml_name);
3060 return NULL;
3061 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003062 if (flags & METH_VARARGS) {
3063 return (*meth)(self, arg);
3064 }
3065 if (!(flags & METH_VARARGS)) {
3066 /* the really old style */
3067 int size = PyTuple_GET_SIZE(arg);
3068 if (size == 1)
3069 arg = PyTuple_GET_ITEM(arg, 0);
3070 else if (size == 0)
3071 arg = NULL;
3072 return (*meth)(self, arg);
3073 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003074 /* should never get here ??? */
3075 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076 return NULL;
3077}
3078
Guido van Rossumb209a111997-04-29 18:18:01 +00003079static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003080call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081{
Jeremy Hylton52820442001-01-03 23:52:36 +00003082 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3083 if (call == NULL) {
3084 PyInstanceObject *inst = (PyInstanceObject*) func;
3085 PyErr_Clear();
3086 PyErr_Format(PyExc_AttributeError,
3087 "%.200s instance has no __call__ method",
3088 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003089 return NULL;
3090 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003091 res = call_object(call, arg, kw);
3092 Py_DECREF(call);
3093 return res;
3094}
3095
3096static PyObject *
3097call_method(PyObject *func, PyObject *arg, PyObject *kw)
3098{
3099 PyObject *self = PyMethod_GET_SELF(func);
3100 PyObject *class = PyMethod_GET_CLASS(func);
3101 PyObject *result;
3102
3103 func = PyMethod_GET_FUNCTION(func);
3104 if (self == NULL) {
3105 /* Unbound methods must be called with an instance of
3106 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003107 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003108 if (PyTuple_Size(arg) >= 1)
3109 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003110 if (self == NULL)
3111 ok = 0;
3112 else {
3113 ok = PyObject_IsInstance(self, class);
3114 if (ok < 0)
3115 return NULL;
3116 }
3117 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003118 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003119 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003120 "called with instance as first argument",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003121 PyEval_GetFuncName(func),
3122 PyEval_GetFuncDesc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 return NULL;
3124 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003125 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003126 }
3127 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003128 int argcount = PyTuple_Size(arg);
3129 PyObject *newarg = PyTuple_New(argcount + 1);
3130 int i;
3131 if (newarg == NULL)
3132 return NULL;
3133 Py_INCREF(self);
3134 PyTuple_SET_ITEM(newarg, 0, self);
3135 for (i = 0; i < argcount; i++) {
3136 PyObject *v = PyTuple_GET_ITEM(arg, i);
3137 Py_XINCREF(v);
3138 PyTuple_SET_ITEM(newarg, i+1, v);
3139 }
3140 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003142 result = call_object(func, arg, kw);
3143 Py_DECREF(arg);
3144 return result;
3145}
3146
3147static PyObject *
3148call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3149{
3150 PyObject *result;
3151 PyObject *argdefs;
3152 PyObject **d, **k;
3153 int nk, nd;
3154
3155 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003156 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3157 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3158 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003159 }
3160 else {
3161 d = NULL;
3162 nd = 0;
3163 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003164
Guido van Rossum681d79a1995-07-18 14:51:37 +00003165 if (kw != NULL) {
3166 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003167 nk = PyDict_Size(kw);
3168 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003169 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003170 PyErr_NoMemory();
3171 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003172 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003173 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003174 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003175 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003176 i += 2;
3177 nk = i/2;
3178 /* XXX This is broken if the caller deletes dict items! */
3179 }
3180 else {
3181 k = NULL;
3182 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003183 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003184
Tim Peters6d6c1a32001-08-02 04:15:00 +00003185 result = PyEval_EvalCodeEx(
Jeremy Hylton52820442001-01-03 23:52:36 +00003186 (PyCodeObject *)PyFunction_GET_CODE(func),
3187 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003188 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003189 k, nk, d, nd,
3190 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003191
Guido van Rossumb18618d2000-05-03 23:44:39 +00003192 if (k != NULL)
3193 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003194
Guido van Rossum681d79a1995-07-18 14:51:37 +00003195 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196}
3197
Jeremy Hylton52820442001-01-03 23:52:36 +00003198#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3199
3200/* The two fast_xxx() functions optimize calls for which no argument
3201 tuple is necessary; the objects are passed directly from the stack.
3202 fast_cfunction() is called for METH_OLDARGS functions.
3203 fast_function() is for functions with no special argument handling.
3204*/
3205
3206static PyObject *
3207fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3208{
3209 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3210 PyObject *self = PyCFunction_GET_SELF(func);
3211
3212 if (na == 0)
3213 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003214 else if (na == 1) {
3215 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003216 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003217 Py_DECREF(arg);
3218 return result;
3219 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003220 PyObject *args = load_args(pp_stack, na);
3221 PyObject *result = (*meth)(self, args);
3222 Py_DECREF(args);
3223 return result;
3224 }
3225}
3226
3227static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003228fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003229{
3230 PyObject *co = PyFunction_GET_CODE(func);
3231 PyObject *globals = PyFunction_GET_GLOBALS(func);
3232 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003233 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003234 PyObject **d = NULL;
3235 int nd = 0;
3236
3237 if (argdefs != NULL) {
3238 d = &PyTuple_GET_ITEM(argdefs, 0);
3239 nd = ((PyTupleObject *)argdefs)->ob_size;
3240 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003241 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003242 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003243 (*pp_stack)-2*nk, nk, d, nd,
3244 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003245}
3246
3247static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003248update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3249 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003250{
3251 PyObject *kwdict = NULL;
3252 if (orig_kwdict == NULL)
3253 kwdict = PyDict_New();
3254 else {
3255 kwdict = PyDict_Copy(orig_kwdict);
3256 Py_DECREF(orig_kwdict);
3257 }
3258 if (kwdict == NULL)
3259 return NULL;
3260 while (--nk >= 0) {
3261 int err;
3262 PyObject *value = EXT_POP(*pp_stack);
3263 PyObject *key = EXT_POP(*pp_stack);
3264 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003265 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003266 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003267 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003268 PyEval_GetFuncName(func),
3269 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003270 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003271 Py_DECREF(key);
3272 Py_DECREF(value);
3273 Py_DECREF(kwdict);
3274 return NULL;
3275 }
3276 err = PyDict_SetItem(kwdict, key, value);
3277 Py_DECREF(key);
3278 Py_DECREF(value);
3279 if (err) {
3280 Py_DECREF(kwdict);
3281 return NULL;
3282 }
3283 }
3284 return kwdict;
3285}
3286
3287static PyObject *
3288update_star_args(int nstack, int nstar, PyObject *stararg,
3289 PyObject ***pp_stack)
3290{
3291 PyObject *callargs, *w;
3292
3293 callargs = PyTuple_New(nstack + nstar);
3294 if (callargs == NULL) {
3295 return NULL;
3296 }
3297 if (nstar) {
3298 int i;
3299 for (i = 0; i < nstar; i++) {
3300 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3301 Py_INCREF(a);
3302 PyTuple_SET_ITEM(callargs, nstack + i, a);
3303 }
3304 }
3305 while (--nstack >= 0) {
3306 w = EXT_POP(*pp_stack);
3307 PyTuple_SET_ITEM(callargs, nstack, w);
3308 }
3309 return callargs;
3310}
3311
3312static PyObject *
3313load_args(PyObject ***pp_stack, int na)
3314{
3315 PyObject *args = PyTuple_New(na);
3316 PyObject *w;
3317
3318 if (args == NULL)
3319 return NULL;
3320 while (--na >= 0) {
3321 w = EXT_POP(*pp_stack);
3322 PyTuple_SET_ITEM(args, na, w);
3323 }
3324 return args;
3325}
3326
3327static PyObject *
3328do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3329{
3330 PyObject *callargs = NULL;
3331 PyObject *kwdict = NULL;
3332 PyObject *result = NULL;
3333
3334 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003335 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003336 if (kwdict == NULL)
3337 goto call_fail;
3338 }
3339 callargs = load_args(pp_stack, na);
3340 if (callargs == NULL)
3341 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003342 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003343 call_fail:
3344 Py_XDECREF(callargs);
3345 Py_XDECREF(kwdict);
3346 return result;
3347}
3348
3349static PyObject *
3350ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3351{
3352 int nstar = 0;
3353 PyObject *callargs = NULL;
3354 PyObject *stararg = NULL;
3355 PyObject *kwdict = NULL;
3356 PyObject *result = NULL;
3357
3358 if (flags & CALL_FLAG_KW) {
3359 kwdict = EXT_POP(*pp_stack);
3360 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003361 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003362 "%s%s argument after ** "
3363 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003364 PyEval_GetFuncName(func),
3365 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003366 goto ext_call_fail;
3367 }
3368 }
3369 if (flags & CALL_FLAG_VAR) {
3370 stararg = EXT_POP(*pp_stack);
3371 if (!PyTuple_Check(stararg)) {
3372 PyObject *t = NULL;
3373 t = PySequence_Tuple(stararg);
3374 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003375 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3376 PyErr_Format(PyExc_TypeError,
3377 "%s%s argument after * "
3378 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003379 PyEval_GetFuncName(func),
3380 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003381 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003382 goto ext_call_fail;
3383 }
3384 Py_DECREF(stararg);
3385 stararg = t;
3386 }
3387 nstar = PyTuple_GET_SIZE(stararg);
3388 }
3389 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003390 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003391 if (kwdict == NULL)
3392 goto ext_call_fail;
3393 }
3394 callargs = update_star_args(na, nstar, stararg, pp_stack);
3395 if (callargs == NULL)
3396 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003397 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003398 ext_call_fail:
3399 Py_XDECREF(callargs);
3400 Py_XDECREF(kwdict);
3401 Py_XDECREF(stararg);
3402 return result;
3403}
3404
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003405#define SLICE_ERROR_MSG \
3406 "standard sequence type does not support step size other than one"
3407
Guido van Rossumb209a111997-04-29 18:18:01 +00003408static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003409loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410{
Guido van Rossumb209a111997-04-29 18:18:01 +00003411 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003412 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003413 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003414 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415 return NULL;
3416 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003417 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003418 v = (*sq->sq_item)(v, i);
3419 if (v)
3420 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003421 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003422 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003423 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424}
3425
Guido van Rossum20c6add2000-05-08 14:06:50 +00003426/* Extract a slice index from a PyInt or PyLong, the index is bound to
3427 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3428 and error. Returns 1 on success.*/
3429
3430int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003431_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432{
3433 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003434 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003435 if (PyInt_Check(v)) {
3436 x = PyInt_AsLong(v);
3437 } else if (PyLong_Check(v)) {
3438 x = PyLong_AsLong(v);
3439 if (x==-1 && PyErr_Occurred()) {
3440 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003441 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003442
Guido van Rossumac7be682001-01-17 15:42:30 +00003443 if (!PyErr_ExceptionMatches(
3444 PyExc_OverflowError)) {
3445 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003446 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003447 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003448 }
3449
Guido van Rossumac7be682001-01-17 15:42:30 +00003450 /* Clear the OverflowError */
3451 PyErr_Clear();
3452
3453 /* It's an overflow error, so we need to
3454 check the sign of the long integer,
3455 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003456 the error. */
3457
3458 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003459 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003460 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003461
3462 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003463 cmp = PyObject_RichCompareBool(v, long_zero,
3464 Py_GT);
3465 Py_DECREF(long_zero);
3466 if (cmp < 0)
3467 return 0;
3468 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003469 x = INT_MAX;
3470 else
3471 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003472 }
3473 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003474 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003475 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003476 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003477 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003478 /* Truncate -- very long indices are truncated anyway */
3479 if (x > INT_MAX)
3480 x = INT_MAX;
3481 else if (x < -INT_MAX)
3482 x = 0;
3483 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003485 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486}
3487
Guido van Rossumb209a111997-04-29 18:18:01 +00003488static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003489apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003491 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003492 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003494 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003495 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003496 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003498
3499static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003500assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3501 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003503 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003504 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003505 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003506 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003507 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003508 if (x == NULL)
3509 return PySequence_DelSlice(u, ilow, ihigh);
3510 else
3511 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512}
3513
Guido van Rossumb209a111997-04-29 18:18:01 +00003514static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003515cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003516{
Guido van Rossumac7be682001-01-17 15:42:30 +00003517 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003519 case IS:
3520 case IS_NOT:
3521 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003522 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003523 res = !res;
3524 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525 case IN:
3526 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003527 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003528 if (res < 0)
3529 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003530 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003531 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 break;
3533 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003534 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003535 break;
3536 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003537 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003539 v = res ? Py_True : Py_False;
3540 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003541 return v;
3542}
3543
Thomas Wouters52152252000-08-17 22:55:00 +00003544static PyObject *
3545import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003546{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003547 PyObject *x;
3548
3549 x = PyObject_GetAttr(v, name);
3550 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003551 PyErr_Format(PyExc_ImportError,
3552 "cannot import name %.230s",
3553 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003554 }
Thomas Wouters52152252000-08-17 22:55:00 +00003555 return x;
3556}
Guido van Rossumac7be682001-01-17 15:42:30 +00003557
Thomas Wouters52152252000-08-17 22:55:00 +00003558static int
3559import_all_from(PyObject *locals, PyObject *v)
3560{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003561 PyObject *all = PyObject_GetAttrString(v, "__all__");
3562 PyObject *dict, *name, *value;
3563 int skip_leading_underscores = 0;
3564 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003565
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003566 if (all == NULL) {
3567 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3568 return -1; /* Unexpected error */
3569 PyErr_Clear();
3570 dict = PyObject_GetAttrString(v, "__dict__");
3571 if (dict == NULL) {
3572 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3573 return -1;
3574 PyErr_SetString(PyExc_ImportError,
3575 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003576 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003577 }
3578 all = PyMapping_Keys(dict);
3579 Py_DECREF(dict);
3580 if (all == NULL)
3581 return -1;
3582 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003583 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003584
3585 for (pos = 0, err = 0; ; pos++) {
3586 name = PySequence_GetItem(all, pos);
3587 if (name == NULL) {
3588 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3589 err = -1;
3590 else
3591 PyErr_Clear();
3592 break;
3593 }
3594 if (skip_leading_underscores &&
3595 PyString_Check(name) &&
3596 PyString_AS_STRING(name)[0] == '_')
3597 {
3598 Py_DECREF(name);
3599 continue;
3600 }
3601 value = PyObject_GetAttr(v, name);
3602 if (value == NULL)
3603 err = -1;
3604 else
3605 err = PyDict_SetItem(locals, name, value);
3606 Py_DECREF(name);
3607 Py_XDECREF(value);
3608 if (err != 0)
3609 break;
3610 }
3611 Py_DECREF(all);
3612 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003613}
3614
Guido van Rossumb209a111997-04-29 18:18:01 +00003615static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003616build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003617{
Tim Peters6d6c1a32001-08-02 04:15:00 +00003618 PyObject *metaclass = NULL;
3619
3620 if (PyDict_Check(methods))
3621 metaclass = PyDict_GetItemString(methods, "__metaclass__");
3622
3623 if (metaclass == NULL) {
3624 if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0)
3625 metaclass = (PyObject *)
3626 PyTuple_GET_ITEM(bases, 0)->ob_type;
3627 else {
3628 PyObject *g = PyEval_GetGlobals();
3629 if (g != NULL && PyDict_Check(g))
3630 metaclass = PyDict_GetItemString(
3631 g, "__metaclass__");
3632 if (metaclass == NULL)
3633 metaclass = (PyObject *) &PyClass_Type;
Guido van Rossum25831651993-05-19 14:50:45 +00003634 }
3635 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003636 return PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
Guido van Rossum25831651993-05-19 14:50:45 +00003637}
3638
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003639static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003640exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3641 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003642{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003643 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003644 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003645 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003646
Guido van Rossumb209a111997-04-29 18:18:01 +00003647 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3648 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003649 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003650 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003651 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003652 locals = PyTuple_GetItem(prog, 2);
3653 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003654 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003655 if (globals == Py_None) {
3656 globals = PyEval_GetGlobals();
3657 if (locals == Py_None) {
3658 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003659 plain = 1;
3660 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003661 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003662 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003663 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003664 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003665 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003666 !PyCode_Check(prog) &&
3667 !PyFile_Check(prog)) {
3668 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003669 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003670 return -1;
3671 }
Fred Drake661ea262000-10-24 19:57:45 +00003672 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003673 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003674 "exec: arg 2 must be a dictionary or None");
3675 return -1;
3676 }
3677 if (!PyDict_Check(locals)) {
3678 PyErr_SetString(PyExc_TypeError,
3679 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003680 return -1;
3681 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003682 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003683 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003684 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003685 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003686 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003687 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003688 FILE *fp = PyFile_AsFile(prog);
3689 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003690 PyCompilerFlags cf;
3691 cf.cf_flags = 0;
3692 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003693 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3694 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003695 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003696 v = PyRun_File(fp, name, Py_file_input, globals,
3697 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003698 }
3699 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003700 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003701 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003702 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003703 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003704 cf.cf_flags = 0;
3705 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003706 v = PyRun_StringFlags(str, Py_file_input, globals,
3707 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003708 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003709 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003710 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003711 if (plain)
3712 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003713 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003714 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003715 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003716 return 0;
3717}
Guido van Rossum24c13741995-02-14 09:42:43 +00003718
Guido van Rossumac7be682001-01-17 15:42:30 +00003719static void
Paul Prescode68140d2000-08-30 20:25:01 +00003720format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3721{
3722 char *obj_str;
3723
3724 if (!obj)
3725 return;
3726
3727 obj_str = PyString_AsString(obj);
3728 if (!obj_str)
3729 return;
3730
3731 PyErr_Format(exc, format_str, obj_str);
3732}
Guido van Rossum950361c1997-01-24 13:49:28 +00003733
3734#ifdef DYNAMIC_EXECUTION_PROFILE
3735
3736PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003737getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003738{
3739 int i;
3740 PyObject *l = PyList_New(256);
3741 if (l == NULL) return NULL;
3742 for (i = 0; i < 256; i++) {
3743 PyObject *x = PyInt_FromLong(a[i]);
3744 if (x == NULL) {
3745 Py_DECREF(l);
3746 return NULL;
3747 }
3748 PyList_SetItem(l, i, x);
3749 }
3750 for (i = 0; i < 256; i++)
3751 a[i] = 0;
3752 return l;
3753}
3754
3755PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003756_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003757{
3758#ifndef DXPAIRS
3759 return getarray(dxp);
3760#else
3761 int i;
3762 PyObject *l = PyList_New(257);
3763 if (l == NULL) return NULL;
3764 for (i = 0; i < 257; i++) {
3765 PyObject *x = getarray(dxpairs[i]);
3766 if (x == NULL) {
3767 Py_DECREF(l);
3768 return NULL;
3769 }
3770 PyList_SetItem(l, i, x);
3771 }
3772 return l;
3773#endif
3774}
3775
3776#endif