blob: 583d7e3dacc6d0186dc2f53674e5bcd63c7fea6a [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 Rossum4668b002001-08-08 05:00:18 +0000887 case BINARY_FLOOR_DIVIDE:
888 w = POP();
889 v = POP();
890 x = PyNumber_FloorDivide(v, w);
891 Py_DECREF(v);
892 Py_DECREF(w);
893 PUSH(x);
894 if (x != NULL) continue;
895 break;
896
897 case BINARY_TRUE_DIVIDE:
898 w = POP();
899 v = POP();
900 x = PyNumber_TrueDivide(v, w);
901 Py_DECREF(v);
902 Py_DECREF(w);
903 PUSH(x);
904 if (x != NULL) continue;
905 break;
906
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 case BINARY_MODULO:
908 w = POP();
909 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000910 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000911 Py_DECREF(v);
912 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000914 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000916
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 case BINARY_ADD:
918 w = POP();
919 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000920 if (PyInt_Check(v) && PyInt_Check(w)) {
921 /* INLINE: int + int */
922 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000923 a = PyInt_AS_LONG(v);
924 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000925 i = a + b;
926 if ((i^a) < 0 && (i^b) < 0) {
927 PyErr_SetString(PyExc_OverflowError,
928 "integer addition");
929 x = NULL;
930 }
931 else
932 x = PyInt_FromLong(i);
933 }
934 else
935 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000936 Py_DECREF(v);
937 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000939 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000941
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 case BINARY_SUBTRACT:
943 w = POP();
944 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000945 if (PyInt_Check(v) && PyInt_Check(w)) {
946 /* INLINE: int - int */
947 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000948 a = PyInt_AS_LONG(v);
949 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000950 i = a - b;
951 if ((i^a) < 0 && (i^~b) < 0) {
952 PyErr_SetString(PyExc_OverflowError,
953 "integer subtraction");
954 x = NULL;
955 }
956 else
957 x = PyInt_FromLong(i);
958 }
959 else
960 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000961 Py_DECREF(v);
962 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000964 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000966
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 case BINARY_SUBSCR:
968 w = POP();
969 v = POP();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000970 if (v->ob_type == &PyList_Type && PyInt_Check(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000971 /* INLINE: list[int] */
972 long i = PyInt_AsLong(w);
973 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000974 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000976 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000977 PyErr_SetString(PyExc_IndexError,
978 "list index out of range");
979 x = NULL;
980 }
981 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000982 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000983 Py_INCREF(x);
984 }
985 }
986 else
987 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(v);
989 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000991 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000993
Guido van Rossum7928cd71991-10-24 14:59:31 +0000994 case BINARY_LSHIFT:
995 w = POP();
996 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000997 x = PyNumber_Lshift(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_RSHIFT:
1005 w = POP();
1006 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001007 x = PyNumber_Rshift(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_AND:
1015 w = POP();
1016 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001017 x = PyNumber_And(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;
Guido van Rossumac7be682001-01-17 15:42:30 +00001023
Guido van Rossum7928cd71991-10-24 14:59:31 +00001024 case BINARY_XOR:
1025 w = POP();
1026 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001027 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001028 Py_DECREF(v);
1029 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001030 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001031 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001032 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001033
Guido van Rossum7928cd71991-10-24 14:59:31 +00001034 case BINARY_OR:
1035 w = POP();
1036 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001037 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001038 Py_DECREF(v);
1039 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001040 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001041 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001042 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001043
1044 case INPLACE_POWER:
1045 w = POP();
1046 v = POP();
1047 x = PyNumber_InPlacePower(v, w, Py_None);
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_MULTIPLY:
1055 w = POP();
1056 v = POP();
1057 x = PyNumber_InPlaceMultiply(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_DIVIDE:
1065 w = POP();
1066 v = POP();
1067 x = PyNumber_InPlaceDivide(v, w);
1068 Py_DECREF(v);
1069 Py_DECREF(w);
1070 PUSH(x);
1071 if (x != NULL) continue;
1072 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001073
Guido van Rossum4668b002001-08-08 05:00:18 +00001074 case INPLACE_FLOOR_DIVIDE:
1075 w = POP();
1076 v = POP();
1077 x = PyNumber_InPlaceFloorDivide(v, w);
1078 Py_DECREF(v);
1079 Py_DECREF(w);
1080 PUSH(x);
1081 if (x != NULL) continue;
1082 break;
1083
1084 case INPLACE_TRUE_DIVIDE:
1085 w = POP();
1086 v = POP();
1087 x = PyNumber_InPlaceTrueDivide(v, w);
1088 Py_DECREF(v);
1089 Py_DECREF(w);
1090 PUSH(x);
1091 if (x != NULL) continue;
1092 break;
1093
Thomas Wouters434d0822000-08-24 20:11:32 +00001094 case INPLACE_MODULO:
1095 w = POP();
1096 v = POP();
1097 x = PyNumber_InPlaceRemainder(v, w);
1098 Py_DECREF(v);
1099 Py_DECREF(w);
1100 PUSH(x);
1101 if (x != NULL) continue;
1102 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001103
Thomas Wouters434d0822000-08-24 20:11:32 +00001104 case INPLACE_ADD:
1105 w = POP();
1106 v = POP();
1107 if (PyInt_Check(v) && PyInt_Check(w)) {
1108 /* INLINE: int + int */
1109 register long a, b, i;
1110 a = PyInt_AS_LONG(v);
1111 b = PyInt_AS_LONG(w);
1112 i = a + b;
1113 if ((i^a) < 0 && (i^b) < 0) {
1114 PyErr_SetString(PyExc_OverflowError,
1115 "integer addition");
1116 x = NULL;
1117 }
1118 else
1119 x = PyInt_FromLong(i);
1120 }
1121 else
1122 x = PyNumber_InPlaceAdd(v, w);
1123 Py_DECREF(v);
1124 Py_DECREF(w);
1125 PUSH(x);
1126 if (x != NULL) continue;
1127 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001128
Thomas Wouters434d0822000-08-24 20:11:32 +00001129 case INPLACE_SUBTRACT:
1130 w = POP();
1131 v = POP();
1132 if (PyInt_Check(v) && PyInt_Check(w)) {
1133 /* INLINE: int - int */
1134 register long a, b, i;
1135 a = PyInt_AS_LONG(v);
1136 b = PyInt_AS_LONG(w);
1137 i = a - b;
1138 if ((i^a) < 0 && (i^~b) < 0) {
1139 PyErr_SetString(PyExc_OverflowError,
1140 "integer subtraction");
1141 x = NULL;
1142 }
1143 else
1144 x = PyInt_FromLong(i);
1145 }
1146 else
1147 x = PyNumber_InPlaceSubtract(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_LSHIFT:
1155 w = POP();
1156 v = POP();
1157 x = PyNumber_InPlaceLshift(v, w);
1158 Py_DECREF(v);
1159 Py_DECREF(w);
1160 PUSH(x);
1161 if (x != NULL) continue;
1162 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001163
Thomas Wouters434d0822000-08-24 20:11:32 +00001164 case INPLACE_RSHIFT:
1165 w = POP();
1166 v = POP();
1167 x = PyNumber_InPlaceRshift(v, w);
1168 Py_DECREF(v);
1169 Py_DECREF(w);
1170 PUSH(x);
1171 if (x != NULL) continue;
1172 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001173
Thomas Wouters434d0822000-08-24 20:11:32 +00001174 case INPLACE_AND:
1175 w = POP();
1176 v = POP();
1177 x = PyNumber_InPlaceAnd(v, w);
1178 Py_DECREF(v);
1179 Py_DECREF(w);
1180 PUSH(x);
1181 if (x != NULL) continue;
1182 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001183
Thomas Wouters434d0822000-08-24 20:11:32 +00001184 case INPLACE_XOR:
1185 w = POP();
1186 v = POP();
1187 x = PyNumber_InPlaceXor(v, w);
1188 Py_DECREF(v);
1189 Py_DECREF(w);
1190 PUSH(x);
1191 if (x != NULL) continue;
1192 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001193
Thomas Wouters434d0822000-08-24 20:11:32 +00001194 case INPLACE_OR:
1195 w = POP();
1196 v = POP();
1197 x = PyNumber_InPlaceOr(v, w);
1198 Py_DECREF(v);
1199 Py_DECREF(w);
1200 PUSH(x);
1201 if (x != NULL) continue;
1202 break;
1203
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 case SLICE+0:
1205 case SLICE+1:
1206 case SLICE+2:
1207 case SLICE+3:
1208 if ((opcode-SLICE) & 2)
1209 w = POP();
1210 else
1211 w = NULL;
1212 if ((opcode-SLICE) & 1)
1213 v = POP();
1214 else
1215 v = NULL;
1216 u = POP();
1217 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001218 Py_DECREF(u);
1219 Py_XDECREF(v);
1220 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001222 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001224
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 case STORE_SLICE+0:
1226 case STORE_SLICE+1:
1227 case STORE_SLICE+2:
1228 case STORE_SLICE+3:
1229 if ((opcode-STORE_SLICE) & 2)
1230 w = POP();
1231 else
1232 w = NULL;
1233 if ((opcode-STORE_SLICE) & 1)
1234 v = POP();
1235 else
1236 v = NULL;
1237 u = POP();
1238 t = POP();
1239 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001240 Py_DECREF(t);
1241 Py_DECREF(u);
1242 Py_XDECREF(v);
1243 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001244 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001246
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 case DELETE_SLICE+0:
1248 case DELETE_SLICE+1:
1249 case DELETE_SLICE+2:
1250 case DELETE_SLICE+3:
1251 if ((opcode-DELETE_SLICE) & 2)
1252 w = POP();
1253 else
1254 w = NULL;
1255 if ((opcode-DELETE_SLICE) & 1)
1256 v = POP();
1257 else
1258 v = NULL;
1259 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 Py_DECREF(u);
1263 Py_XDECREF(v);
1264 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001265 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001267
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 case STORE_SUBSCR:
1269 w = POP();
1270 v = POP();
1271 u = POP();
1272 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001273 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 Py_DECREF(u);
1275 Py_DECREF(v);
1276 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001277 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001279
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 case DELETE_SUBSCR:
1281 w = POP();
1282 v = POP();
1283 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001284 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 Py_DECREF(v);
1286 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001287 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001289
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 case PRINT_EXPR:
1291 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001292 w = PySys_GetObject("displayhook");
1293 if (w == NULL) {
1294 PyErr_SetString(PyExc_RuntimeError,
1295 "lost sys.displayhook");
1296 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001297 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001298 }
1299 if (err == 0) {
1300 x = Py_BuildValue("(O)", v);
1301 if (x == NULL)
1302 err = -1;
1303 }
1304 if (err == 0) {
1305 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001306 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001307 if (w == NULL)
1308 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001311 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001313
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001314 case PRINT_ITEM_TO:
1315 w = stream = POP();
1316 /* fall through to PRINT_ITEM */
1317
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 case PRINT_ITEM:
1319 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001320 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001321 w = PySys_GetObject("stdout");
1322 if (w == NULL) {
1323 PyErr_SetString(PyExc_RuntimeError,
1324 "lost sys.stdout");
1325 err = -1;
1326 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001327 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001328 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001329 err = PyFile_WriteString(" ", w);
1330 if (err == 0)
1331 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001333 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 char *s = PyString_AsString(v);
1335 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001336 if (len > 0 &&
1337 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001338 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001339 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001341 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001342 Py_XDECREF(stream);
1343 stream = NULL;
1344 if (err == 0)
1345 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001346 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001347
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001348 case PRINT_NEWLINE_TO:
1349 w = stream = POP();
1350 /* fall through to PRINT_NEWLINE */
1351
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001353 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001354 w = PySys_GetObject("stdout");
1355 if (w == NULL)
1356 PyErr_SetString(PyExc_RuntimeError,
1357 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001358 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001359 if (w != NULL) {
1360 err = PyFile_WriteString("\n", w);
1361 if (err == 0)
1362 PyFile_SoftSpace(w, 0);
1363 }
1364 Py_XDECREF(stream);
1365 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001367
Thomas Wouters434d0822000-08-24 20:11:32 +00001368
1369#ifdef CASE_TOO_BIG
1370 default: switch (opcode) {
1371#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 case BREAK_LOOP:
1373 why = WHY_BREAK;
1374 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001375
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001376 case CONTINUE_LOOP:
1377 retval = PyInt_FromLong(oparg);
1378 why = WHY_CONTINUE;
1379 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001380
Guido van Rossumf10570b1995-07-07 22:53:21 +00001381 case RAISE_VARARGS:
1382 u = v = w = NULL;
1383 switch (oparg) {
1384 case 3:
1385 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001386 /* Fallthrough */
1387 case 2:
1388 v = POP(); /* value */
1389 /* Fallthrough */
1390 case 1:
1391 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001392 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001393 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001394 break;
1395 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001397 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001398 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001399 break;
1400 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001402
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001404 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001405 PyErr_SetString(PyExc_SystemError,
1406 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001407 break;
1408 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001410 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001411 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001412
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 case RETURN_VALUE:
1414 retval = POP();
1415 why = WHY_RETURN;
1416 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001417
Tim Peters5ca576e2001-06-18 22:08:13 +00001418 case YIELD_VALUE:
1419 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001420 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001421 f->f_lasti = INSTR_OFFSET();
1422 why = WHY_YIELD;
1423 break;
1424
1425
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001426 case EXEC_STMT:
1427 w = POP();
1428 v = POP();
1429 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001430 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 Py_DECREF(u);
1432 Py_DECREF(v);
1433 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001434 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001435
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 case POP_BLOCK:
1437 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001438 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 while (STACK_LEVEL() > b->b_level) {
1440 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001441 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 }
1443 }
1444 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001445
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 case END_FINALLY:
1447 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001448 if (PyInt_Check(v)) {
1449 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001450 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001451 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001452 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 retval = POP();
1454 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001455 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001457 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001458 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001460 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 else if (v != Py_None) {
1463 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 "'finally' pops bad exception");
1465 why = WHY_EXCEPTION;
1466 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001469
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001471 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001473 w = POP();
1474 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001476 Py_DECREF(u);
1477 Py_DECREF(v);
1478 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001480
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 case STORE_NAME:
1482 w = GETNAMEV(oparg);
1483 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001484 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001485 PyErr_Format(PyExc_SystemError,
1486 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001487 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001488 break;
1489 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 err = PyDict_SetItem(x, w, v);
1491 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001493
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001495 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001496 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001497 PyErr_Format(PyExc_SystemError,
1498 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001499 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001500 break;
1501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001503 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001504 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001506
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001507 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001509 if (PyTuple_Check(v)) {
1510 if (PyTuple_Size(v) != oparg) {
1511 PyErr_SetString(PyExc_ValueError,
1512 "unpack tuple of wrong size");
1513 why = WHY_EXCEPTION;
1514 }
1515 else {
1516 for (; --oparg >= 0; ) {
1517 w = PyTuple_GET_ITEM(v, oparg);
1518 Py_INCREF(w);
1519 PUSH(w);
1520 }
1521 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001523 else if (PyList_Check(v)) {
1524 if (PyList_Size(v) != oparg) {
1525 PyErr_SetString(PyExc_ValueError,
1526 "unpack list of wrong size");
1527 why = WHY_EXCEPTION;
1528 }
1529 else {
1530 for (; --oparg >= 0; ) {
1531 w = PyList_GET_ITEM(v, oparg);
1532 Py_INCREF(w);
1533 PUSH(w);
1534 }
1535 }
1536 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001537 else if (unpack_iterable(v, oparg,
1538 stack_pointer + oparg))
1539 stack_pointer += oparg;
1540 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001541 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001544
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001546 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 v = POP();
1548 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1550 Py_DECREF(v);
1551 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001553
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001555 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001557 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1558 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001561
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001562 case STORE_GLOBAL:
1563 w = GETNAMEV(oparg);
1564 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 err = PyDict_SetItem(f->f_globals, w, v);
1566 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001567 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001568
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001569 case DELETE_GLOBAL:
1570 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001571 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001572 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001573 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001574 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001575
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 case LOAD_CONST:
1577 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 PUSH(x);
1580 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001581
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001583 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001585 PyErr_Format(PyExc_SystemError,
1586 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001587 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 break;
1589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001594 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001596 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001597 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001598 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 break;
1600 }
1601 }
1602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 PUSH(x);
1605 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001606
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001608 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001609 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001613 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001614 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001615 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 break;
1617 }
1618 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001619 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 PUSH(x);
1621 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001622
Guido van Rossum9bfef441993-03-29 10:43:31 +00001623 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001624 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001625 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001626 format_exc_check_arg(
1627 PyExc_UnboundLocalError,
1628 UNBOUNDLOCAL_ERROR_MSG,
1629 PyTuple_GetItem(co->co_varnames, oparg)
1630 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001631 break;
1632 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001634 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001635 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001636 break;
1637
1638 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001639 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001640 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001641 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001642
1643 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001644 x = GETLOCAL(oparg);
1645 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001646 format_exc_check_arg(
1647 PyExc_UnboundLocalError,
1648 UNBOUNDLOCAL_ERROR_MSG,
1649 PyTuple_GetItem(co->co_varnames, oparg)
1650 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001651 break;
1652 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001653 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001654 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001655
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001656 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001657 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001658 Py_INCREF(x);
1659 PUSH(x);
1660 break;
1661
1662 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001663 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001664 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001665 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001666 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001667 v = PyTuple_GetItem(co->co_cellvars,
1668 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001669 format_exc_check_arg(
1670 PyExc_UnboundLocalError,
1671 UNBOUNDLOCAL_ERROR_MSG,
1672 v);
1673 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001674 v = PyTuple_GetItem(
1675 co->co_freevars,
1676 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001677 format_exc_check_arg(
1678 PyExc_NameError,
1679 UNBOUNDFREE_ERROR_MSG,
1680 v);
1681 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001682 err = -1;
1683 break;
1684 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001685 PUSH(w);
1686 break;
1687
1688 case STORE_DEREF:
1689 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001690 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001691 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001692 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001693 continue;
1694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 if (x != NULL) {
1698 for (; --oparg >= 0;) {
1699 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 }
1702 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001703 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 }
1705 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001706
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001709 if (x != NULL) {
1710 for (; --oparg >= 0;) {
1711 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001712 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 }
1714 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001715 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 }
1717 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001718
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001722 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001724
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001726 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001728 x = PyObject_GetAttr(v, w);
1729 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001731 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001733
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 case COMPARE_OP:
1735 w = POP();
1736 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001737 if (PyInt_Check(v) && PyInt_Check(w)) {
1738 /* INLINE: cmp(int, int) */
1739 register long a, b;
1740 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001741 a = PyInt_AS_LONG(v);
1742 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001743 switch (oparg) {
1744 case LT: res = a < b; break;
1745 case LE: res = a <= b; break;
1746 case EQ: res = a == b; break;
1747 case NE: res = a != b; break;
1748 case GT: res = a > b; break;
1749 case GE: res = a >= b; break;
1750 case IS: res = v == w; break;
1751 case IS_NOT: res = v != w; break;
1752 default: goto slow_compare;
1753 }
1754 x = res ? Py_True : Py_False;
1755 Py_INCREF(x);
1756 }
1757 else {
1758 slow_compare:
1759 x = cmp_outcome(oparg, v, w);
1760 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001761 Py_DECREF(v);
1762 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001764 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001766
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001768 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001769 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001770 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001771 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001772 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001773 break;
1774 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001775 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001776 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001777 w,
1778 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001779 f->f_locals == NULL ?
1780 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001781 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783 if (w == NULL) {
1784 x = NULL;
1785 break;
1786 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001787 x = PyEval_CallObject(x, w);
1788 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001789 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001790 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001792
Thomas Wouters52152252000-08-17 22:55:00 +00001793 case IMPORT_STAR:
1794 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001795 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001796 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001797 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001798 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001799 break;
1800 }
Thomas Wouters52152252000-08-17 22:55:00 +00001801 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001803 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001804 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001806
Thomas Wouters52152252000-08-17 22:55:00 +00001807 case IMPORT_FROM:
1808 w = GETNAMEV(oparg);
1809 v = TOP();
1810 x = import_from(v, w);
1811 PUSH(x);
1812 if (x != NULL) continue;
1813 break;
1814
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 case JUMP_FORWARD:
1816 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001817 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001818
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001821 if (err > 0)
1822 err = 0;
1823 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001825 else
1826 break;
1827 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001828
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001830 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001831 if (err > 0) {
1832 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001834 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001835 else if (err == 0)
1836 ;
1837 else
1838 break;
1839 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001840
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 case JUMP_ABSOLUTE:
1842 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001843 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001844
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001845 case GET_ITER:
1846 /* before: [obj]; after [getiter(obj)] */
1847 v = POP();
1848 x = PyObject_GetIter(v);
1849 Py_DECREF(v);
1850 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001851 PUSH(x);
1852 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001853 }
1854 break;
1855
1856 case FOR_ITER:
1857 /* before: [iter]; after: [iter, iter()] *or* [] */
1858 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001859 x = PyIter_Next(v);
1860 if (x != NULL) {
1861 PUSH(x);
1862 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001863 }
Tim Petersf4848da2001-05-05 00:14:56 +00001864 if (!PyErr_Occurred()) {
1865 /* iterator ended normally */
1866 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001867 Py_DECREF(v);
1868 JUMPBY(oparg);
1869 continue;
1870 }
1871 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001872
Guido van Rossum374a9221991-04-04 10:40:29 +00001873 case FOR_LOOP:
1874 /* for v in s: ...
1875 On entry: stack contains s, i.
1876 On exit: stack contains s, i+1, s[i];
1877 but if loop exhausted:
1878 s, i are popped, and we jump */
1879 w = POP(); /* Loop index */
1880 v = POP(); /* Sequence object */
1881 u = loop_subscript(v, w);
1882 if (u != NULL) {
1883 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001884 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001885 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001886 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001887 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001888 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001889 }
1890 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001891 Py_DECREF(v);
1892 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001893 /* A NULL can mean "s exhausted"
1894 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001895 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001897 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001898 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001899 continue;
1900 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001901 }
1902 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001903
Guido van Rossum374a9221991-04-04 10:40:29 +00001904 case SETUP_LOOP:
1905 case SETUP_EXCEPT:
1906 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001907 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001908 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001909 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001910
Guido van Rossum374a9221991-04-04 10:40:29 +00001911 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001912#ifdef LLTRACE
1913 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001915#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001916 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001917 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001918 continue;
1919 /* Trace each line of code reached */
1920 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001921 /* Inline call_trace() for performance: */
1922 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001923 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001924 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1925 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001926 tstate->use_tracing = (tstate->c_tracefunc
1927 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001928 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001929 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001930
1931 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001932 {
1933 int na = oparg & 0xff;
1934 int nk = (oparg>>8) & 0xff;
1935 int n = na + 2 * nk;
1936 PyObject **pfunc = stack_pointer - n - 1;
1937 PyObject *func = *pfunc;
1938 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1939
1940 /* Always dispatch PyCFunction first, because
1941 these are presumed to be the most frequent
1942 callable object.
1943 */
1944 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001945 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001946 if (flags > 1 || nk != 0)
1947 x = do_call(func, &stack_pointer,
1948 na, nk);
1949 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001950 PyObject *callargs;
1951 callargs = load_args(&stack_pointer, na);
1952 x = call_cfunction(func, callargs, NULL);
1953 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001954 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001955 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001956 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001957 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001958 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001959 && PyMethod_GET_SELF(func) != NULL) {
1960 /* optimize access to bound methods */
1961 PyObject *self = PyMethod_GET_SELF(func);
1962 Py_INCREF(self);
1963 func = PyMethod_GET_FUNCTION(func);
1964 Py_INCREF(func);
1965 Py_DECREF(*pfunc);
1966 *pfunc = self;
1967 na++;
1968 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001969 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001970 Py_INCREF(func);
1971 if (PyFunction_Check(func)) {
1972 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001973 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001974 } else {
1975 x = do_call(func, &stack_pointer,
1976 na, nk);
1977 }
1978 Py_DECREF(func);
1979 }
1980
1981 while (stack_pointer > pfunc) {
1982 w = POP();
1983 Py_DECREF(w);
1984 }
1985 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001986 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001987 continue;
1988 break;
1989 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001990
Jeremy Hylton76901512000-03-28 23:49:17 +00001991 case CALL_FUNCTION_VAR:
1992 case CALL_FUNCTION_KW:
1993 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001994 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001995 int na = oparg & 0xff;
1996 int nk = (oparg>>8) & 0xff;
1997 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001998 int n = na + 2 * nk;
1999 PyObject **pfunc, *func;
2000 if (flags & CALL_FLAG_VAR)
2001 n++;
2002 if (flags & CALL_FLAG_KW)
2003 n++;
2004 pfunc = stack_pointer - n - 1;
2005 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002006 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002007
Guido van Rossumac7be682001-01-17 15:42:30 +00002008 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002009 && PyMethod_GET_SELF(func) != NULL) {
2010 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002011 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002012 func = PyMethod_GET_FUNCTION(func);
2013 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002014 Py_DECREF(*pfunc);
2015 *pfunc = self;
2016 na++;
2017 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002018 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002019 Py_INCREF(func);
2020 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002021 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002022
Jeremy Hylton76901512000-03-28 23:49:17 +00002023 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002024 w = POP();
2025 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002026 }
2027 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002028 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002029 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002030 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002031 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002032
Guido van Rossum681d79a1995-07-18 14:51:37 +00002033 case MAKE_FUNCTION:
2034 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002035 x = PyFunction_New(v, f->f_globals);
2036 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002037 /* XXX Maybe this should be a separate opcode? */
2038 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002039 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002040 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002041 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002042 x = NULL;
2043 break;
2044 }
2045 while (--oparg >= 0) {
2046 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002047 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002048 }
2049 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002051 }
2052 PUSH(x);
2053 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002054
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002055 case MAKE_CLOSURE:
2056 {
2057 int nfree;
2058 v = POP(); /* code object */
2059 x = PyFunction_New(v, f->f_globals);
2060 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2061 Py_DECREF(v);
2062 /* XXX Maybe this should be a separate opcode? */
2063 if (x != NULL && nfree > 0) {
2064 v = PyTuple_New(nfree);
2065 if (v == NULL) {
2066 Py_DECREF(x);
2067 x = NULL;
2068 break;
2069 }
2070 while (--nfree >= 0) {
2071 w = POP();
2072 PyTuple_SET_ITEM(v, nfree, w);
2073 }
2074 err = PyFunction_SetClosure(x, v);
2075 Py_DECREF(v);
2076 }
2077 if (x != NULL && oparg > 0) {
2078 v = PyTuple_New(oparg);
2079 if (v == NULL) {
2080 Py_DECREF(x);
2081 x = NULL;
2082 break;
2083 }
2084 while (--oparg >= 0) {
2085 w = POP();
2086 PyTuple_SET_ITEM(v, oparg, w);
2087 }
2088 err = PyFunction_SetDefaults(x, v);
2089 Py_DECREF(v);
2090 }
2091 PUSH(x);
2092 break;
2093 }
2094
Guido van Rossum8861b741996-07-30 16:49:37 +00002095 case BUILD_SLICE:
2096 if (oparg == 3)
2097 w = POP();
2098 else
2099 w = NULL;
2100 v = POP();
2101 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002102 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 Py_DECREF(u);
2104 Py_DECREF(v);
2105 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002106 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002107 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002108 break;
2109
Fred Drakeef8ace32000-08-24 00:32:09 +00002110 case EXTENDED_ARG:
2111 opcode = NEXTOP();
2112 oparg = oparg<<16 | NEXTARG();
2113 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002114
Guido van Rossum374a9221991-04-04 10:40:29 +00002115 default:
2116 fprintf(stderr,
2117 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002118 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002119 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002120 why = WHY_EXCEPTION;
2121 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002122
2123#ifdef CASE_TOO_BIG
2124 }
2125#endif
2126
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 } /* switch */
2128
2129 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002130
Guido van Rossum374a9221991-04-04 10:40:29 +00002131 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002132
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002134 if (err == 0 && x != NULL) {
2135#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002136 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002137 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002138 fprintf(stderr,
2139 "XXX undetected error\n");
2140 else
2141#endif
2142 continue; /* Normal, fast path */
2143 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 err = 0;
2147 }
2148
Guido van Rossum374a9221991-04-04 10:40:29 +00002149 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002150
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002153 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002154 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 why = WHY_EXCEPTION;
2156 }
2157 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002158#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002159 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002160 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002162 fprintf(stderr,
2163 "XXX undetected error (why=%d)\n",
2164 why);
2165 why = WHY_EXCEPTION;
2166 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 }
2168#endif
2169
2170 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002171
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002173 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002175 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002177
Fred Drake9e3ad782001-07-03 23:39:52 +00002178 if (tstate->use_tracing) {
2179 if (tstate->c_tracefunc)
2180 call_exc_trace(tstate->c_tracefunc,
2181 tstate->c_traceobj, f);
2182 if (tstate->c_profilefunc)
2183 call_exc_trace(tstate->c_profilefunc,
2184 tstate->c_profileobj,f);
2185 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002186 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002187
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002189
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 if (why == WHY_RERAISE)
2191 why = WHY_EXCEPTION;
2192
2193 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002194
Tim Peters5ca576e2001-06-18 22:08:13 +00002195 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002197
2198 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2199 /* For a continue inside a try block,
2200 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002201 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002202 b->b_handler);
2203 why = WHY_NOT;
2204 JUMPTO(PyInt_AS_LONG(retval));
2205 Py_DECREF(retval);
2206 break;
2207 }
2208
Guido van Rossum374a9221991-04-04 10:40:29 +00002209 while (STACK_LEVEL() > b->b_level) {
2210 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002211 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002212 }
2213 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2214 why = WHY_NOT;
2215 JUMPTO(b->b_handler);
2216 break;
2217 }
2218 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002219 (b->b_type == SETUP_EXCEPT &&
2220 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002221 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 PyObject *exc, *val, *tb;
2223 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002224 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 val = Py_None;
2226 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 /* Make the raw exception data
2229 available to the handler,
2230 so a program can emulate the
2231 Python main loop. Don't do
2232 this for 'finally'. */
2233 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002234 PyErr_NormalizeException(
2235 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002236 set_exc_info(tstate,
2237 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002239 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002240 PUSH(val);
2241 PUSH(exc);
2242 }
2243 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002244 if (why == WHY_RETURN ||
2245 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002247 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 PUSH(v);
2249 }
2250 why = WHY_NOT;
2251 JUMPTO(b->b_handler);
2252 break;
2253 }
2254 } /* unwind stack */
2255
2256 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002257
Guido van Rossum374a9221991-04-04 10:40:29 +00002258 if (why != WHY_NOT)
2259 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002260
Guido van Rossum374a9221991-04-04 10:40:29 +00002261 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002262
Tim Peters5ca576e2001-06-18 22:08:13 +00002263 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002264 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002265
Fred Drake9e3ad782001-07-03 23:39:52 +00002266 if (tstate->use_tracing) {
2267 if (tstate->c_tracefunc
2268 && (why == WHY_RETURN || why == WHY_YIELD)) {
2269 if (call_trace(tstate->c_tracefunc,
2270 tstate->c_traceobj, f,
2271 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002272 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002273 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002274 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002275 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002276 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002277 if (tstate->c_profilefunc
2278 && (why == WHY_RETURN || why == WHY_YIELD)) {
2279 if (call_trace(tstate->c_profilefunc,
2280 tstate->c_profileobj, f,
2281 PyTrace_RETURN, retval)) {
2282 Py_XDECREF(retval);
2283 retval = NULL;
2284 why = WHY_EXCEPTION;
2285 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002286 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002287 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002288
Guido van Rossuma027efa1997-05-05 20:56:21 +00002289 reset_exc_info(tstate);
2290
Tim Peters5ca576e2001-06-18 22:08:13 +00002291 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002292 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002293 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002294
Guido van Rossum96a42c81992-01-12 02:29:51 +00002295 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002296}
2297
Tim Peters6d6c1a32001-08-02 04:15:00 +00002298PyObject *
2299PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002300 PyObject **args, int argcount, PyObject **kws, int kwcount,
2301 PyObject **defs, int defcount, PyObject *closure)
2302{
2303 register PyFrameObject *f;
2304 register PyObject *retval = NULL;
2305 register PyObject **fastlocals, **freevars;
2306 PyThreadState *tstate = PyThreadState_GET();
2307 PyObject *x, *u;
2308
2309 if (globals == NULL) {
2310 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2311 return NULL;
2312 }
2313
2314 f = PyFrame_New(tstate, /*back*/
2315 co, /*code*/
2316 globals, locals);
2317 if (f == NULL)
2318 return NULL;
2319
2320 fastlocals = f->f_localsplus;
2321 freevars = f->f_localsplus + f->f_nlocals;
2322
2323 if (co->co_argcount > 0 ||
2324 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2325 int i;
2326 int n = argcount;
2327 PyObject *kwdict = NULL;
2328 if (co->co_flags & CO_VARKEYWORDS) {
2329 kwdict = PyDict_New();
2330 if (kwdict == NULL)
2331 goto fail;
2332 i = co->co_argcount;
2333 if (co->co_flags & CO_VARARGS)
2334 i++;
2335 SETLOCAL(i, kwdict);
2336 }
2337 if (argcount > co->co_argcount) {
2338 if (!(co->co_flags & CO_VARARGS)) {
2339 PyErr_Format(PyExc_TypeError,
2340 "%.200s() takes %s %d "
2341 "%sargument%s (%d given)",
2342 PyString_AsString(co->co_name),
2343 defcount ? "at most" : "exactly",
2344 co->co_argcount,
2345 kwcount ? "non-keyword " : "",
2346 co->co_argcount == 1 ? "" : "s",
2347 argcount);
2348 goto fail;
2349 }
2350 n = co->co_argcount;
2351 }
2352 for (i = 0; i < n; i++) {
2353 x = args[i];
2354 Py_INCREF(x);
2355 SETLOCAL(i, x);
2356 }
2357 if (co->co_flags & CO_VARARGS) {
2358 u = PyTuple_New(argcount - n);
2359 if (u == NULL)
2360 goto fail;
2361 SETLOCAL(co->co_argcount, u);
2362 for (i = n; i < argcount; i++) {
2363 x = args[i];
2364 Py_INCREF(x);
2365 PyTuple_SET_ITEM(u, i-n, x);
2366 }
2367 }
2368 for (i = 0; i < kwcount; i++) {
2369 PyObject *keyword = kws[2*i];
2370 PyObject *value = kws[2*i + 1];
2371 int j;
2372 if (keyword == NULL || !PyString_Check(keyword)) {
2373 PyErr_Format(PyExc_TypeError,
2374 "%.200s() keywords must be strings",
2375 PyString_AsString(co->co_name));
2376 goto fail;
2377 }
2378 /* XXX slow -- speed up using dictionary? */
2379 for (j = 0; j < co->co_argcount; j++) {
2380 PyObject *nm = PyTuple_GET_ITEM(
2381 co->co_varnames, j);
2382 int cmp = PyObject_RichCompareBool(
2383 keyword, nm, Py_EQ);
2384 if (cmp > 0)
2385 break;
2386 else if (cmp < 0)
2387 goto fail;
2388 }
2389 /* Check errors from Compare */
2390 if (PyErr_Occurred())
2391 goto fail;
2392 if (j >= co->co_argcount) {
2393 if (kwdict == NULL) {
2394 PyErr_Format(PyExc_TypeError,
2395 "%.200s() got an unexpected "
2396 "keyword argument '%.400s'",
2397 PyString_AsString(co->co_name),
2398 PyString_AsString(keyword));
2399 goto fail;
2400 }
2401 PyDict_SetItem(kwdict, keyword, value);
2402 }
2403 else {
2404 if (GETLOCAL(j) != NULL) {
2405 PyErr_Format(PyExc_TypeError,
2406 "%.200s() got multiple "
2407 "values for keyword "
2408 "argument '%.400s'",
2409 PyString_AsString(co->co_name),
2410 PyString_AsString(keyword));
2411 goto fail;
2412 }
2413 Py_INCREF(value);
2414 SETLOCAL(j, value);
2415 }
2416 }
2417 if (argcount < co->co_argcount) {
2418 int m = co->co_argcount - defcount;
2419 for (i = argcount; i < m; i++) {
2420 if (GETLOCAL(i) == NULL) {
2421 PyErr_Format(PyExc_TypeError,
2422 "%.200s() takes %s %d "
2423 "%sargument%s (%d given)",
2424 PyString_AsString(co->co_name),
2425 ((co->co_flags & CO_VARARGS) ||
2426 defcount) ? "at least"
2427 : "exactly",
2428 m, kwcount ? "non-keyword " : "",
2429 m == 1 ? "" : "s", i);
2430 goto fail;
2431 }
2432 }
2433 if (n > m)
2434 i = n - m;
2435 else
2436 i = 0;
2437 for (; i < defcount; i++) {
2438 if (GETLOCAL(m+i) == NULL) {
2439 PyObject *def = defs[i];
2440 Py_INCREF(def);
2441 SETLOCAL(m+i, def);
2442 }
2443 }
2444 }
2445 }
2446 else {
2447 if (argcount > 0 || kwcount > 0) {
2448 PyErr_Format(PyExc_TypeError,
2449 "%.200s() takes no arguments (%d given)",
2450 PyString_AsString(co->co_name),
2451 argcount + kwcount);
2452 goto fail;
2453 }
2454 }
2455 /* Allocate and initialize storage for cell vars, and copy free
2456 vars into frame. This isn't too efficient right now. */
2457 if (f->f_ncells) {
2458 int i = 0, j = 0, nargs, found;
2459 char *cellname, *argname;
2460 PyObject *c;
2461
2462 nargs = co->co_argcount;
2463 if (co->co_flags & CO_VARARGS)
2464 nargs++;
2465 if (co->co_flags & CO_VARKEYWORDS)
2466 nargs++;
2467
2468 /* Check for cells that shadow args */
2469 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2470 cellname = PyString_AS_STRING(
2471 PyTuple_GET_ITEM(co->co_cellvars, i));
2472 found = 0;
2473 while (j < nargs) {
2474 argname = PyString_AS_STRING(
2475 PyTuple_GET_ITEM(co->co_varnames, j));
2476 if (strcmp(cellname, argname) == 0) {
2477 c = PyCell_New(GETLOCAL(j));
2478 if (c == NULL)
2479 goto fail;
2480 GETLOCAL(f->f_nlocals + i) = c;
2481 found = 1;
2482 break;
2483 }
2484 j++;
2485 }
2486 if (found == 0) {
2487 c = PyCell_New(NULL);
2488 if (c == NULL)
2489 goto fail;
2490 SETLOCAL(f->f_nlocals + i, c);
2491 }
2492 }
2493 /* Initialize any that are left */
2494 while (i < f->f_ncells) {
2495 c = PyCell_New(NULL);
2496 if (c == NULL)
2497 goto fail;
2498 SETLOCAL(f->f_nlocals + i, c);
2499 i++;
2500 }
2501 }
2502 if (f->f_nfreevars) {
2503 int i;
2504 for (i = 0; i < f->f_nfreevars; ++i) {
2505 PyObject *o = PyTuple_GET_ITEM(closure, i);
2506 Py_INCREF(o);
2507 freevars[f->f_ncells + i] = o;
2508 }
2509 }
2510
Fred Drake9e3ad782001-07-03 23:39:52 +00002511 if (tstate->use_tracing) {
2512 if (tstate->c_tracefunc != NULL) {
2513 /* tstate->c_tracefunc, if defined, is a
2514 function that will be called on *every* entry
2515 to a code block. Its return value, if not
2516 None, is a function that will be called at
2517 the start of each executed line of code.
2518 (Actually, the function must return itself
2519 in order to continue tracing.) The trace
2520 functions are called with three arguments:
2521 a pointer to the current frame, a string
2522 indicating why the function is called, and
2523 an argument which depends on the situation.
2524 The global trace function is also called
2525 whenever an exception is detected. */
2526 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2527 f, PyTrace_CALL, Py_None)) {
2528 /* XXX Need way to compute arguments?? */
2529 /* Trace function raised an error */
2530 goto fail;
2531 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002532 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002533 if (tstate->c_profilefunc != NULL) {
2534 /* Similar for c_profilefunc, except it needn't
2535 return itself and isn't called for "line" events */
2536 if (call_trace(tstate->c_profilefunc,
2537 tstate->c_profileobj,
2538 f, PyTrace_CALL, Py_None)) {
2539 /* XXX Need way to compute arguments?? */
2540 /* Profile function raised an error */
2541 goto fail;
2542 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002543 }
2544 }
2545
2546 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002547 /* Don't need to keep the reference to f_back, it will be set
2548 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002549 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002550 f->f_back = NULL;
2551
2552 /* Create a new generator that owns the ready to run frame
2553 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002554 return gen_new(f);
2555 }
2556
2557 retval = eval_frame(f);
2558
2559 fail: /* Jump here from prelude on failure */
2560
2561 Py_DECREF(f);
2562 return retval;
2563}
2564
2565
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002567set_exc_info(PyThreadState *tstate,
2568 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002569{
2570 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002571 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002572
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573 frame = tstate->frame;
2574 if (frame->f_exc_type == NULL) {
2575 /* This frame didn't catch an exception before */
2576 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 if (tstate->exc_type == NULL) {
2578 Py_INCREF(Py_None);
2579 tstate->exc_type = Py_None;
2580 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002581 tmp_type = frame->f_exc_type;
2582 tmp_value = frame->f_exc_value;
2583 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584 Py_XINCREF(tstate->exc_type);
2585 Py_XINCREF(tstate->exc_value);
2586 Py_XINCREF(tstate->exc_traceback);
2587 frame->f_exc_type = tstate->exc_type;
2588 frame->f_exc_value = tstate->exc_value;
2589 frame->f_exc_traceback = tstate->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 }
2594 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002595 tmp_type = tstate->exc_type;
2596 tmp_value = tstate->exc_value;
2597 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002598 Py_XINCREF(type);
2599 Py_XINCREF(value);
2600 Py_XINCREF(tb);
2601 tstate->exc_type = type;
2602 tstate->exc_value = value;
2603 tstate->exc_traceback = tb;
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 /* For b/w compatibility */
2608 PySys_SetObject("exc_type", type);
2609 PySys_SetObject("exc_value", value);
2610 PySys_SetObject("exc_traceback", tb);
2611}
2612
2613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002614reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002615{
2616 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002617 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002618 frame = tstate->frame;
2619 if (frame->f_exc_type != NULL) {
2620 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002621 tmp_type = tstate->exc_type;
2622 tmp_value = tstate->exc_value;
2623 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002624 Py_XINCREF(frame->f_exc_type);
2625 Py_XINCREF(frame->f_exc_value);
2626 Py_XINCREF(frame->f_exc_traceback);
2627 tstate->exc_type = frame->f_exc_type;
2628 tstate->exc_value = frame->f_exc_value;
2629 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002630 Py_XDECREF(tmp_type);
2631 Py_XDECREF(tmp_value);
2632 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002633 /* For b/w compatibility */
2634 PySys_SetObject("exc_type", frame->f_exc_type);
2635 PySys_SetObject("exc_value", frame->f_exc_value);
2636 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2637 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002638 tmp_type = frame->f_exc_type;
2639 tmp_value = frame->f_exc_value;
2640 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002641 frame->f_exc_type = NULL;
2642 frame->f_exc_value = NULL;
2643 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002644 Py_XDECREF(tmp_type);
2645 Py_XDECREF(tmp_value);
2646 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002647}
2648
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002649/* Logic for the raise statement (too complicated for inlining).
2650 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002651static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002652do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002653{
Guido van Rossumd295f121998-04-09 21:39:57 +00002654 if (type == NULL) {
2655 /* Reraise */
2656 PyThreadState *tstate = PyThreadState_Get();
2657 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2658 value = tstate->exc_value;
2659 tb = tstate->exc_traceback;
2660 Py_XINCREF(type);
2661 Py_XINCREF(value);
2662 Py_XINCREF(tb);
2663 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002664
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002665 /* We support the following forms of raise:
2666 raise <class>, <classinstance>
2667 raise <class>, <argument tuple>
2668 raise <class>, None
2669 raise <class>, <argument>
2670 raise <classinstance>, None
2671 raise <string>, <object>
2672 raise <string>, None
2673
2674 An omitted second argument is the same as None.
2675
2676 In addition, raise <tuple>, <anything> is the same as
2677 raising the tuple's first item (and it better have one!);
2678 this rule is applied recursively.
2679
2680 Finally, an optional third argument can be supplied, which
2681 gives the traceback to be substituted (useful when
2682 re-raising an exception after examining it). */
2683
2684 /* First, check the traceback argument, replacing None with
2685 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 if (tb == Py_None) {
2687 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002688 tb = NULL;
2689 }
2690 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002692 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 goto raise_error;
2694 }
2695
2696 /* Next, replace a missing value with None */
2697 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002698 value = Py_None;
2699 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002700 }
2701
2702 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2704 PyObject *tmp = type;
2705 type = PyTuple_GET_ITEM(type, 0);
2706 Py_INCREF(type);
2707 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002708 }
2709
Barry Warsaw4249f541997-08-22 21:26:19 +00002710 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002711 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002712
2713 else if (PyClass_Check(type))
2714 PyErr_NormalizeException(&type, &value, &tb);
2715
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002717 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 if (value != Py_None) {
2719 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002720 "instance exception may not have a separate value");
2721 goto raise_error;
2722 }
2723 else {
2724 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002725 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002726 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2728 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002729 }
2730 }
2731 else {
2732 /* Not something you can raise. You get an exception
2733 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002734 PyErr_Format(PyExc_TypeError,
2735 "exceptions must be strings, classes, or "
2736 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002737 goto raise_error;
2738 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002740 if (tb == NULL)
2741 return WHY_EXCEPTION;
2742 else
2743 return WHY_RERAISE;
2744 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 Py_XDECREF(value);
2746 Py_XDECREF(type);
2747 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002748 return WHY_EXCEPTION;
2749}
2750
Tim Petersd6d010b2001-06-21 02:49:55 +00002751/* Iterate v argcnt times and store the results on the stack (via decreasing
2752 sp). Return 1 for success, 0 if error. */
2753
Barry Warsawe42b18f1997-08-25 22:13:04 +00002754static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002755unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002756{
Tim Petersd6d010b2001-06-21 02:49:55 +00002757 int i = 0;
2758 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002759 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002760
Tim Petersd6d010b2001-06-21 02:49:55 +00002761 assert(v != NULL);
2762
2763 it = PyObject_GetIter(v);
2764 if (it == NULL)
2765 goto Error;
2766
2767 for (; i < argcnt; i++) {
2768 w = PyIter_Next(it);
2769 if (w == NULL) {
2770 /* Iterator done, via error or exhaustion. */
2771 if (!PyErr_Occurred()) {
2772 PyErr_Format(PyExc_ValueError,
2773 "need more than %d value%s to unpack",
2774 i, i == 1 ? "" : "s");
2775 }
2776 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002777 }
2778 *--sp = w;
2779 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002780
2781 /* We better have exhausted the iterator now. */
2782 w = PyIter_Next(it);
2783 if (w == NULL) {
2784 if (PyErr_Occurred())
2785 goto Error;
2786 Py_DECREF(it);
2787 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002788 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002789 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002790 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002791Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002792 for (; i > 0; i--, sp++)
2793 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002794 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002795 return 0;
2796}
2797
2798
Guido van Rossum96a42c81992-01-12 02:29:51 +00002799#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002800static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002801prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002803 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002804 if (PyObject_Print(v, stdout, 0) != 0)
2805 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002806 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002807 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002809#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002811static void
Fred Drake5755ce62001-06-27 19:19:46 +00002812call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002813{
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002815 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002817 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 value = Py_None;
2819 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002820 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002822 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002824 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002825 }
Fred Drake5755ce62001-06-27 19:19:46 +00002826 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002828 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002830 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 Py_XDECREF(type);
2832 Py_XDECREF(value);
2833 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002834 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002835}
2836
2837static int
Fred Drake5755ce62001-06-27 19:19:46 +00002838call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2839 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002840{
Fred Drake5755ce62001-06-27 19:19:46 +00002841 register PyThreadState *tstate = frame->f_tstate;
2842 int result;
2843 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002844 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002845 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002846 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002847 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002848 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2849 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002850 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002851 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002852}
2853
Fred Drake5755ce62001-06-27 19:19:46 +00002854void
2855PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002856{
Fred Drake5755ce62001-06-27 19:19:46 +00002857 PyThreadState *tstate = PyThreadState_Get();
2858 PyObject *temp = tstate->c_profileobj;
2859 Py_XINCREF(arg);
2860 tstate->c_profilefunc = NULL;
2861 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002862 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002863 Py_XDECREF(temp);
2864 tstate->c_profilefunc = func;
2865 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002866 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002867}
2868
2869void
2870PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2871{
2872 PyThreadState *tstate = PyThreadState_Get();
2873 PyObject *temp = tstate->c_traceobj;
2874 Py_XINCREF(arg);
2875 tstate->c_tracefunc = NULL;
2876 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002877 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002878 Py_XDECREF(temp);
2879 tstate->c_tracefunc = func;
2880 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002881 tstate->use_tracing = ((func != NULL)
2882 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002883}
2884
Guido van Rossumb209a111997-04-29 18:18:01 +00002885PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002886PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002887{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002888 PyThreadState *tstate = PyThreadState_Get();
2889 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002890 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002891 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002892 else
2893 return current_frame->f_builtins;
2894}
2895
Guido van Rossumb209a111997-04-29 18:18:01 +00002896PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002897PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002898{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002899 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002900 if (current_frame == NULL)
2901 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002902 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002903 return current_frame->f_locals;
2904}
2905
Guido van Rossumb209a111997-04-29 18:18:01 +00002906PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002907PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002908{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002909 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002910 if (current_frame == NULL)
2911 return NULL;
2912 else
2913 return current_frame->f_globals;
2914}
2915
Guido van Rossumb209a111997-04-29 18:18:01 +00002916PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002917PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002918{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002919 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002920 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002921}
2922
Guido van Rossum6135a871995-01-09 17:53:26 +00002923int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002924PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002925{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002926 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002927 return current_frame == NULL ? 0 : current_frame->f_restricted;
2928}
2929
Guido van Rossumbe270261997-05-22 22:26:18 +00002930int
Tim Peters5ba58662001-07-16 02:29:45 +00002931PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002932{
2933 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002934 int result = 0;
2935
2936 if (current_frame != NULL) {
2937 const int codeflags = current_frame->f_code->co_flags;
2938 if (codeflags & CO_NESTED) {
2939 result = 1;
2940 cf->cf_flags |= PyCF_NESTED_SCOPES;
2941 }
2942 if (codeflags & CO_GENERATOR_ALLOWED) {
2943 result = 1;
2944 cf->cf_flags |= PyCF_GENERATORS;
2945 }
2946 }
2947 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002948}
2949
2950int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002951Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952{
Guido van Rossumb209a111997-04-29 18:18:01 +00002953 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002954 if (f == NULL)
2955 return 0;
2956 if (!PyFile_SoftSpace(f, 0))
2957 return 0;
2958 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959}
2960
Guido van Rossum3f5da241990-12-20 15:06:42 +00002961
Guido van Rossum681d79a1995-07-18 14:51:37 +00002962/* External interface to call any callable object.
2963 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002964
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002965#undef PyEval_CallObject
2966/* for backward compatibility: export this interface */
2967
Guido van Rossumb209a111997-04-29 18:18:01 +00002968PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002969PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002970{
Guido van Rossumb209a111997-04-29 18:18:01 +00002971 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002972}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002973#define PyEval_CallObject(func,arg) \
2974 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002975
Guido van Rossumb209a111997-04-29 18:18:01 +00002976PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002977PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002978{
Jeremy Hylton52820442001-01-03 23:52:36 +00002979 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002980
2981 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002982 arg = PyTuple_New(0);
2983 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002984 PyErr_SetString(PyExc_TypeError,
2985 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002986 return NULL;
2987 }
2988 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002989 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002990
Guido van Rossumb209a111997-04-29 18:18:01 +00002991 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002992 PyErr_SetString(PyExc_TypeError,
2993 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002994 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002995 return NULL;
2996 }
2997
Tim Peters6d6c1a32001-08-02 04:15:00 +00002998 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002999 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003000 return result;
3001}
3002
3003/* How often is each kind of object called? The answer depends on the
Tim Peters6d6c1a32001-08-02 04:15:00 +00003004 program. An instrumented PyObject_Call() was used to run the Python
Jeremy Hylton52820442001-01-03 23:52:36 +00003005 regression test suite. The results were:
3006 4200000 PyCFunctions
3007 390000 fast_function() calls
3008 94000 other functions
3009 480000 all functions (sum of prev two)
3010 150000 methods
3011 100000 classes
3012
3013 Tests on other bodies of code show that PyCFunctions are still
3014 most common, but not by such a large margin.
3015*/
3016
Tim Peters6d6c1a32001-08-02 04:15:00 +00003017char *
3018PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003019{
3020 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003021 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003022 else if (PyFunction_Check(func))
3023 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3024 else if (PyCFunction_Check(func))
3025 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3026 else if (PyClass_Check(func))
3027 return PyString_AsString(((PyClassObject*)func)->cl_name);
3028 else if (PyInstance_Check(func)) {
3029 return PyString_AsString(
3030 ((PyInstanceObject*)func)->in_class->cl_name);
3031 } else {
3032 return func->ob_type->tp_name;
3033 }
3034}
3035
Tim Peters6d6c1a32001-08-02 04:15:00 +00003036char *
3037PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003038{
3039 if (PyMethod_Check(func))
3040 return "()";
3041 else if (PyFunction_Check(func))
3042 return "()";
3043 else if (PyCFunction_Check(func))
3044 return "()";
3045 else if (PyClass_Check(func))
3046 return " constructor";
3047 else if (PyInstance_Check(func)) {
3048 return " instance";
3049 } else {
3050 return " object";
3051 }
3052}
3053
Jeremy Hylton52820442001-01-03 23:52:36 +00003054static PyObject *
3055call_object(PyObject *func, PyObject *arg, PyObject *kw)
3056{
3057 ternaryfunc call;
3058 PyObject *result;
3059
3060 if (PyMethod_Check(func))
3061 result = call_method(func, arg, kw);
3062 else if (PyFunction_Check(func))
3063 result = call_eval_code2(func, arg, kw);
3064 else if (PyCFunction_Check(func))
3065 result = call_cfunction(func, arg, kw);
3066 else if (PyClass_Check(func))
3067 result = PyInstance_New(func, arg, kw);
3068 else if (PyInstance_Check(func))
3069 result = call_instance(func, arg, kw);
3070 else if ((call = func->ob_type->tp_call) != NULL)
3071 result = (*call)(func, arg, kw);
3072 else {
Tim Peters239508c2001-06-16 00:09:28 +00003073 PyErr_Format(PyExc_TypeError,
3074 "object of type '%.100s' is not callable",
3075 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003076 return NULL;
3077 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003078 if (result == NULL && !PyErr_Occurred())
3079 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003080 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003081
Guido van Rossume59214e1994-08-30 08:01:59 +00003082 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003083}
3084
Guido van Rossumb209a111997-04-29 18:18:01 +00003085static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003086call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087{
Jeremy Hylton52820442001-01-03 23:52:36 +00003088 PyCFunctionObject* f = (PyCFunctionObject*)func;
3089 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3090 PyObject *self = PyCFunction_GET_SELF(func);
3091 int flags = PyCFunction_GET_FLAGS(func);
3092
Jeremy Hylton52820442001-01-03 23:52:36 +00003093 if (flags & METH_KEYWORDS) {
3094 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003096 if (kw != NULL && PyDict_Size(kw) != 0) {
3097 PyErr_Format(PyExc_TypeError,
3098 "%.200s() takes no keyword arguments",
3099 f->m_ml->ml_name);
3100 return NULL;
3101 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003102 if (flags & METH_VARARGS) {
3103 return (*meth)(self, arg);
3104 }
3105 if (!(flags & METH_VARARGS)) {
3106 /* the really old style */
3107 int size = PyTuple_GET_SIZE(arg);
3108 if (size == 1)
3109 arg = PyTuple_GET_ITEM(arg, 0);
3110 else if (size == 0)
3111 arg = NULL;
3112 return (*meth)(self, arg);
3113 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003114 /* should never get here ??? */
3115 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003116 return NULL;
3117}
3118
Guido van Rossumb209a111997-04-29 18:18:01 +00003119static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003120call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003121{
Jeremy Hylton52820442001-01-03 23:52:36 +00003122 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3123 if (call == NULL) {
3124 PyInstanceObject *inst = (PyInstanceObject*) func;
3125 PyErr_Clear();
3126 PyErr_Format(PyExc_AttributeError,
3127 "%.200s instance has no __call__ method",
3128 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003129 return NULL;
3130 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003131 res = call_object(call, arg, kw);
3132 Py_DECREF(call);
3133 return res;
3134}
3135
3136static PyObject *
3137call_method(PyObject *func, PyObject *arg, PyObject *kw)
3138{
3139 PyObject *self = PyMethod_GET_SELF(func);
3140 PyObject *class = PyMethod_GET_CLASS(func);
3141 PyObject *result;
3142
3143 func = PyMethod_GET_FUNCTION(func);
3144 if (self == NULL) {
3145 /* Unbound methods must be called with an instance of
3146 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003147 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003148 if (PyTuple_Size(arg) >= 1)
3149 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003150 if (self == NULL)
3151 ok = 0;
3152 else {
3153 ok = PyObject_IsInstance(self, class);
3154 if (ok < 0)
3155 return NULL;
3156 }
3157 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003158 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003159 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003160 "called with instance as first argument",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003161 PyEval_GetFuncName(func),
3162 PyEval_GetFuncDesc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163 return NULL;
3164 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003165 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003166 }
3167 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003168 int argcount = PyTuple_Size(arg);
3169 PyObject *newarg = PyTuple_New(argcount + 1);
3170 int i;
3171 if (newarg == NULL)
3172 return NULL;
3173 Py_INCREF(self);
3174 PyTuple_SET_ITEM(newarg, 0, self);
3175 for (i = 0; i < argcount; i++) {
3176 PyObject *v = PyTuple_GET_ITEM(arg, i);
3177 Py_XINCREF(v);
3178 PyTuple_SET_ITEM(newarg, i+1, v);
3179 }
3180 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003181 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003182 result = call_object(func, arg, kw);
3183 Py_DECREF(arg);
3184 return result;
3185}
3186
3187static PyObject *
3188call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3189{
3190 PyObject *result;
3191 PyObject *argdefs;
3192 PyObject **d, **k;
3193 int nk, nd;
3194
3195 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003196 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3197 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3198 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003199 }
3200 else {
3201 d = NULL;
3202 nd = 0;
3203 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003204
Guido van Rossum681d79a1995-07-18 14:51:37 +00003205 if (kw != NULL) {
3206 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003207 nk = PyDict_Size(kw);
3208 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003209 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003210 PyErr_NoMemory();
3211 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003212 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003213 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003214 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003215 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003216 i += 2;
3217 nk = i/2;
3218 /* XXX This is broken if the caller deletes dict items! */
3219 }
3220 else {
3221 k = NULL;
3222 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003223 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003224
Tim Peters6d6c1a32001-08-02 04:15:00 +00003225 result = PyEval_EvalCodeEx(
Jeremy Hylton52820442001-01-03 23:52:36 +00003226 (PyCodeObject *)PyFunction_GET_CODE(func),
3227 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003228 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003229 k, nk, d, nd,
3230 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003231
Guido van Rossumb18618d2000-05-03 23:44:39 +00003232 if (k != NULL)
3233 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003234
Guido van Rossum681d79a1995-07-18 14:51:37 +00003235 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236}
3237
Jeremy Hylton52820442001-01-03 23:52:36 +00003238#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3239
3240/* The two fast_xxx() functions optimize calls for which no argument
3241 tuple is necessary; the objects are passed directly from the stack.
3242 fast_cfunction() is called for METH_OLDARGS functions.
3243 fast_function() is for functions with no special argument handling.
3244*/
3245
3246static PyObject *
3247fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3248{
3249 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3250 PyObject *self = PyCFunction_GET_SELF(func);
3251
3252 if (na == 0)
3253 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003254 else if (na == 1) {
3255 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003256 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003257 Py_DECREF(arg);
3258 return result;
3259 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003260 PyObject *args = load_args(pp_stack, na);
3261 PyObject *result = (*meth)(self, args);
3262 Py_DECREF(args);
3263 return result;
3264 }
3265}
3266
3267static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003268fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003269{
3270 PyObject *co = PyFunction_GET_CODE(func);
3271 PyObject *globals = PyFunction_GET_GLOBALS(func);
3272 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003273 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003274 PyObject **d = NULL;
3275 int nd = 0;
3276
3277 if (argdefs != NULL) {
3278 d = &PyTuple_GET_ITEM(argdefs, 0);
3279 nd = ((PyTupleObject *)argdefs)->ob_size;
3280 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003281 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003282 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003283 (*pp_stack)-2*nk, nk, d, nd,
3284 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003285}
3286
3287static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003288update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3289 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003290{
3291 PyObject *kwdict = NULL;
3292 if (orig_kwdict == NULL)
3293 kwdict = PyDict_New();
3294 else {
3295 kwdict = PyDict_Copy(orig_kwdict);
3296 Py_DECREF(orig_kwdict);
3297 }
3298 if (kwdict == NULL)
3299 return NULL;
3300 while (--nk >= 0) {
3301 int err;
3302 PyObject *value = EXT_POP(*pp_stack);
3303 PyObject *key = EXT_POP(*pp_stack);
3304 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003305 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003306 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003307 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003308 PyEval_GetFuncName(func),
3309 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003310 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003311 Py_DECREF(key);
3312 Py_DECREF(value);
3313 Py_DECREF(kwdict);
3314 return NULL;
3315 }
3316 err = PyDict_SetItem(kwdict, key, value);
3317 Py_DECREF(key);
3318 Py_DECREF(value);
3319 if (err) {
3320 Py_DECREF(kwdict);
3321 return NULL;
3322 }
3323 }
3324 return kwdict;
3325}
3326
3327static PyObject *
3328update_star_args(int nstack, int nstar, PyObject *stararg,
3329 PyObject ***pp_stack)
3330{
3331 PyObject *callargs, *w;
3332
3333 callargs = PyTuple_New(nstack + nstar);
3334 if (callargs == NULL) {
3335 return NULL;
3336 }
3337 if (nstar) {
3338 int i;
3339 for (i = 0; i < nstar; i++) {
3340 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3341 Py_INCREF(a);
3342 PyTuple_SET_ITEM(callargs, nstack + i, a);
3343 }
3344 }
3345 while (--nstack >= 0) {
3346 w = EXT_POP(*pp_stack);
3347 PyTuple_SET_ITEM(callargs, nstack, w);
3348 }
3349 return callargs;
3350}
3351
3352static PyObject *
3353load_args(PyObject ***pp_stack, int na)
3354{
3355 PyObject *args = PyTuple_New(na);
3356 PyObject *w;
3357
3358 if (args == NULL)
3359 return NULL;
3360 while (--na >= 0) {
3361 w = EXT_POP(*pp_stack);
3362 PyTuple_SET_ITEM(args, na, w);
3363 }
3364 return args;
3365}
3366
3367static PyObject *
3368do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3369{
3370 PyObject *callargs = NULL;
3371 PyObject *kwdict = NULL;
3372 PyObject *result = NULL;
3373
3374 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003375 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003376 if (kwdict == NULL)
3377 goto call_fail;
3378 }
3379 callargs = load_args(pp_stack, na);
3380 if (callargs == NULL)
3381 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003382 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003383 call_fail:
3384 Py_XDECREF(callargs);
3385 Py_XDECREF(kwdict);
3386 return result;
3387}
3388
3389static PyObject *
3390ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3391{
3392 int nstar = 0;
3393 PyObject *callargs = NULL;
3394 PyObject *stararg = NULL;
3395 PyObject *kwdict = NULL;
3396 PyObject *result = NULL;
3397
3398 if (flags & CALL_FLAG_KW) {
3399 kwdict = EXT_POP(*pp_stack);
3400 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003401 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003402 "%s%s argument after ** "
3403 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003404 PyEval_GetFuncName(func),
3405 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003406 goto ext_call_fail;
3407 }
3408 }
3409 if (flags & CALL_FLAG_VAR) {
3410 stararg = EXT_POP(*pp_stack);
3411 if (!PyTuple_Check(stararg)) {
3412 PyObject *t = NULL;
3413 t = PySequence_Tuple(stararg);
3414 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003415 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3416 PyErr_Format(PyExc_TypeError,
3417 "%s%s argument after * "
3418 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003419 PyEval_GetFuncName(func),
3420 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003421 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003422 goto ext_call_fail;
3423 }
3424 Py_DECREF(stararg);
3425 stararg = t;
3426 }
3427 nstar = PyTuple_GET_SIZE(stararg);
3428 }
3429 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003430 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003431 if (kwdict == NULL)
3432 goto ext_call_fail;
3433 }
3434 callargs = update_star_args(na, nstar, stararg, pp_stack);
3435 if (callargs == NULL)
3436 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003437 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003438 ext_call_fail:
3439 Py_XDECREF(callargs);
3440 Py_XDECREF(kwdict);
3441 Py_XDECREF(stararg);
3442 return result;
3443}
3444
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003445#define SLICE_ERROR_MSG \
3446 "standard sequence type does not support step size other than one"
3447
Guido van Rossumb209a111997-04-29 18:18:01 +00003448static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003449loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450{
Guido van Rossumb209a111997-04-29 18:18:01 +00003451 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003452 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003453 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003454 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 return NULL;
3456 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003457 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003458 v = (*sq->sq_item)(v, i);
3459 if (v)
3460 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003461 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003462 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003463 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464}
3465
Guido van Rossum20c6add2000-05-08 14:06:50 +00003466/* Extract a slice index from a PyInt or PyLong, the index is bound to
3467 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3468 and error. Returns 1 on success.*/
3469
3470int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003471_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472{
3473 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003474 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003475 if (PyInt_Check(v)) {
3476 x = PyInt_AsLong(v);
3477 } else if (PyLong_Check(v)) {
3478 x = PyLong_AsLong(v);
3479 if (x==-1 && PyErr_Occurred()) {
3480 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003481 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003482
Guido van Rossumac7be682001-01-17 15:42:30 +00003483 if (!PyErr_ExceptionMatches(
3484 PyExc_OverflowError)) {
3485 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003486 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003487 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003488 }
3489
Guido van Rossumac7be682001-01-17 15:42:30 +00003490 /* Clear the OverflowError */
3491 PyErr_Clear();
3492
3493 /* It's an overflow error, so we need to
3494 check the sign of the long integer,
3495 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003496 the error. */
3497
3498 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003499 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003500 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003501
3502 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003503 cmp = PyObject_RichCompareBool(v, long_zero,
3504 Py_GT);
3505 Py_DECREF(long_zero);
3506 if (cmp < 0)
3507 return 0;
3508 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003509 x = INT_MAX;
3510 else
3511 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003512 }
3513 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003514 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003515 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003516 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003518 /* Truncate -- very long indices are truncated anyway */
3519 if (x > INT_MAX)
3520 x = INT_MAX;
3521 else if (x < -INT_MAX)
3522 x = 0;
3523 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003525 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526}
3527
Guido van Rossumb209a111997-04-29 18:18:01 +00003528static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003529apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003531 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003532 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003534 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003535 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003536 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003537}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003538
3539static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003540assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3541 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003543 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003544 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003545 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003546 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003547 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003548 if (x == NULL)
3549 return PySequence_DelSlice(u, ilow, ihigh);
3550 else
3551 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003552}
3553
Guido van Rossumb209a111997-04-29 18:18:01 +00003554static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003555cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003556{
Guido van Rossumac7be682001-01-17 15:42:30 +00003557 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003559 case IS:
3560 case IS_NOT:
3561 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003562 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003563 res = !res;
3564 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003565 case IN:
3566 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003567 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003568 if (res < 0)
3569 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003570 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003571 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572 break;
3573 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003574 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575 break;
3576 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003577 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003578 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003579 v = res ? Py_True : Py_False;
3580 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581 return v;
3582}
3583
Thomas Wouters52152252000-08-17 22:55:00 +00003584static PyObject *
3585import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003586{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003587 PyObject *x;
3588
3589 x = PyObject_GetAttr(v, name);
3590 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003591 PyErr_Format(PyExc_ImportError,
3592 "cannot import name %.230s",
3593 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003594 }
Thomas Wouters52152252000-08-17 22:55:00 +00003595 return x;
3596}
Guido van Rossumac7be682001-01-17 15:42:30 +00003597
Thomas Wouters52152252000-08-17 22:55:00 +00003598static int
3599import_all_from(PyObject *locals, PyObject *v)
3600{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003601 PyObject *all = PyObject_GetAttrString(v, "__all__");
3602 PyObject *dict, *name, *value;
3603 int skip_leading_underscores = 0;
3604 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003605
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003606 if (all == NULL) {
3607 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3608 return -1; /* Unexpected error */
3609 PyErr_Clear();
3610 dict = PyObject_GetAttrString(v, "__dict__");
3611 if (dict == NULL) {
3612 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3613 return -1;
3614 PyErr_SetString(PyExc_ImportError,
3615 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003616 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003617 }
3618 all = PyMapping_Keys(dict);
3619 Py_DECREF(dict);
3620 if (all == NULL)
3621 return -1;
3622 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003623 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003624
3625 for (pos = 0, err = 0; ; pos++) {
3626 name = PySequence_GetItem(all, pos);
3627 if (name == NULL) {
3628 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3629 err = -1;
3630 else
3631 PyErr_Clear();
3632 break;
3633 }
3634 if (skip_leading_underscores &&
3635 PyString_Check(name) &&
3636 PyString_AS_STRING(name)[0] == '_')
3637 {
3638 Py_DECREF(name);
3639 continue;
3640 }
3641 value = PyObject_GetAttr(v, name);
3642 if (value == NULL)
3643 err = -1;
3644 else
3645 err = PyDict_SetItem(locals, name, value);
3646 Py_DECREF(name);
3647 Py_XDECREF(value);
3648 if (err != 0)
3649 break;
3650 }
3651 Py_DECREF(all);
3652 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003653}
3654
Guido van Rossumb209a111997-04-29 18:18:01 +00003655static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003656build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003657{
Tim Peters6d6c1a32001-08-02 04:15:00 +00003658 PyObject *metaclass = NULL;
3659
3660 if (PyDict_Check(methods))
3661 metaclass = PyDict_GetItemString(methods, "__metaclass__");
3662
3663 if (metaclass == NULL) {
3664 if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0)
3665 metaclass = (PyObject *)
3666 PyTuple_GET_ITEM(bases, 0)->ob_type;
3667 else {
3668 PyObject *g = PyEval_GetGlobals();
3669 if (g != NULL && PyDict_Check(g))
3670 metaclass = PyDict_GetItemString(
3671 g, "__metaclass__");
3672 if (metaclass == NULL)
3673 metaclass = (PyObject *) &PyClass_Type;
Guido van Rossum25831651993-05-19 14:50:45 +00003674 }
3675 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003676 return PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
Guido van Rossum25831651993-05-19 14:50:45 +00003677}
3678
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003679static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003680exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3681 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003682{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003683 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003684 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003685 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003686
Guido van Rossumb209a111997-04-29 18:18:01 +00003687 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3688 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003689 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003690 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003691 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003692 locals = PyTuple_GetItem(prog, 2);
3693 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003694 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003695 if (globals == Py_None) {
3696 globals = PyEval_GetGlobals();
3697 if (locals == Py_None) {
3698 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003699 plain = 1;
3700 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003701 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003702 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003703 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003704 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003705 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003706 !PyCode_Check(prog) &&
3707 !PyFile_Check(prog)) {
3708 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003709 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003710 return -1;
3711 }
Fred Drake661ea262000-10-24 19:57:45 +00003712 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003713 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003714 "exec: arg 2 must be a dictionary or None");
3715 return -1;
3716 }
3717 if (!PyDict_Check(locals)) {
3718 PyErr_SetString(PyExc_TypeError,
3719 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003720 return -1;
3721 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003722 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003723 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003724 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003725 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003726 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003727 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003728 FILE *fp = PyFile_AsFile(prog);
3729 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003730 PyCompilerFlags cf;
3731 cf.cf_flags = 0;
3732 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003733 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3734 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003735 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003736 v = PyRun_File(fp, name, Py_file_input, globals,
3737 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003738 }
3739 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003740 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003741 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003742 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003743 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003744 cf.cf_flags = 0;
3745 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003746 v = PyRun_StringFlags(str, Py_file_input, globals,
3747 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003748 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003749 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003750 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003751 if (plain)
3752 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003753 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003754 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003755 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003756 return 0;
3757}
Guido van Rossum24c13741995-02-14 09:42:43 +00003758
Guido van Rossumac7be682001-01-17 15:42:30 +00003759static void
Paul Prescode68140d2000-08-30 20:25:01 +00003760format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3761{
3762 char *obj_str;
3763
3764 if (!obj)
3765 return;
3766
3767 obj_str = PyString_AsString(obj);
3768 if (!obj_str)
3769 return;
3770
3771 PyErr_Format(exc, format_str, obj_str);
3772}
Guido van Rossum950361c1997-01-24 13:49:28 +00003773
3774#ifdef DYNAMIC_EXECUTION_PROFILE
3775
3776PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003777getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003778{
3779 int i;
3780 PyObject *l = PyList_New(256);
3781 if (l == NULL) return NULL;
3782 for (i = 0; i < 256; i++) {
3783 PyObject *x = PyInt_FromLong(a[i]);
3784 if (x == NULL) {
3785 Py_DECREF(l);
3786 return NULL;
3787 }
3788 PyList_SetItem(l, i, x);
3789 }
3790 for (i = 0; i < 256; i++)
3791 a[i] = 0;
3792 return l;
3793}
3794
3795PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003796_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003797{
3798#ifndef DXPAIRS
3799 return getarray(dxp);
3800#else
3801 int i;
3802 PyObject *l = PyList_New(257);
3803 if (l == NULL) return NULL;
3804 for (i = 0; i < 257; i++) {
3805 PyObject *x = getarray(dxpairs[i]);
3806 if (x == NULL) {
3807 Py_DECREF(l);
3808 return NULL;
3809 }
3810 PyList_SetItem(l, i, x);
3811 }
3812 return l;
3813#endif
3814}
3815
3816#endif