blob: 5e67b297f8d2162ca50e25aa85dfcd3f2a04e0db [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:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static PyObject *loop_subscript(PyObject *, PyObject *);
55static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
56static int assign_slice(PyObject *, PyObject *,
57 PyObject *, PyObject *);
58static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000059static PyObject *import_from(PyObject *, PyObject *);
60static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static PyObject *build_class(PyObject *, PyObject *, PyObject *);
62static int exec_statement(PyFrameObject *,
63 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
65static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000066static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Paul Prescode68140d2000-08-30 20:25:01 +000068#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000069 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000070#define GLOBAL_NAME_ERROR_MSG \
71 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000072#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000073 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000074#define UNBOUNDFREE_ERROR_MSG \
75 "free variable '%.200s' referenced before assignment" \
76 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Guido van Rossum950361c1997-01-24 13:49:28 +000078/* Dynamic execution profile */
79#ifdef DYNAMIC_EXECUTION_PROFILE
80#ifdef DXPAIRS
81static long dxpairs[257][256];
82#define dxp dxpairs[256]
83#else
84static long dxp[256];
85#endif
86#endif
87
Tim Peters5ca576e2001-06-18 22:08:13 +000088staticforward PyTypeObject gentype;
89
90typedef struct {
91 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000092 /* The gi_ prefix is intended to remind of generator-iterator. */
93
94 PyFrameObject *gi_frame;
95
Tim Peterse77f2e22001-06-26 22:24:51 +000096 /* True if generator is being executed. */
97 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000098} genobject;
99
100static PyObject *
101gen_new(PyFrameObject *f)
102{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000103 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000104 if (gen == NULL) {
105 Py_DECREF(f);
106 return NULL;
107 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000108 gen->gi_frame = f;
109 gen->gi_running = 0;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000110 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000111 return (PyObject *)gen;
112}
113
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000114static int
115gen_traverse(genobject *gen, visitproc visit, void *arg)
116{
117 return visit((PyObject *)gen->gi_frame, arg);
118}
119
Tim Peters5ca576e2001-06-18 22:08:13 +0000120static void
121gen_dealloc(genobject *gen)
122{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000123 _PyObject_GC_UNTRACK(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000124 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000125 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000126}
127
128static PyObject *
129gen_iternext(genobject *gen)
130{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000131 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000133 PyObject *result;
134
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000135 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000136 PyErr_SetString(PyExc_ValueError,
137 "generator already executing");
138 return NULL;
139 }
Tim Peters8c963692001-06-23 05:26:56 +0000140 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000142
143 /* Generators always return to their most recent caller, not
144 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000145 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000146 assert(f->f_back == NULL);
147 f->f_back = tstate->frame;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000151 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000152
153 /* Don't keep the reference to f_back any longer than necessary. It
154 * may keep a chain of frames alive or it could create a reference
155 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000156 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000157 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000158
Tim Petersad1a18b2001-06-23 06:19:16 +0000159 /* If the generator just returned (as opposed to yielding), signal
160 * that the generator is exhausted. */
161 if (result == Py_None && f->f_stacktop == NULL) {
162 Py_DECREF(result);
163 result = NULL;
164 }
165
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000167}
168
169static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000170gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000171{
172 PyObject *result;
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000175
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000176 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000177 PyErr_SetObject(PyExc_StopIteration, Py_None);
178 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000179 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000180
181 return result;
182}
183
184static PyObject *
185gen_getiter(PyObject *gen)
186{
187 Py_INCREF(gen);
188 return gen;
189}
190
191static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000192 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000193 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 {NULL, NULL} /* Sentinel */
195};
196
Guido van Rossum6f799372001-09-20 20:46:19 +0000197static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000198 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
199 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
200 {NULL} /* Sentinel */
201};
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
203statichere PyTypeObject gentype = {
204 PyObject_HEAD_INIT(&PyType_Type)
205 0, /* ob_size */
206 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000207 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000208 0, /* tp_itemsize */
209 /* methods */
210 (destructor)gen_dealloc, /* tp_dealloc */
211 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_setattr */
214 0, /* tp_compare */
215 0, /* tp_repr */
216 0, /* tp_as_number */
217 0, /* tp_as_sequence */
218 0, /* tp_as_mapping */
219 0, /* tp_hash */
220 0, /* tp_call */
221 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000223 0, /* tp_setattro */
224 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000226 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000227 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000228 0, /* tp_clear */
229 0, /* tp_richcompare */
230 0, /* tp_weaklistoffset */
231 (getiterfunc)gen_getiter, /* tp_iter */
232 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000233 gen_methods, /* tp_methods */
234 gen_memberlist, /* tp_members */
235 0, /* tp_getset */
236 0, /* tp_base */
237 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000238};
239
240
Guido van Rossume59214e1994-08-30 08:01:59 +0000241#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000242
Guido van Rossum2571cc81999-04-07 16:07:23 +0000243#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000245#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000246#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248extern int _PyThread_Started; /* Flag for Py_Exit */
249
Guido van Rossum65d5b571998-12-21 19:32:43 +0000250static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252
253void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000257 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000259 interpreter_lock = PyThread_allocate_lock();
260 PyThread_acquire_lock(interpreter_lock, 1);
261 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000262}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000263
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000264void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268}
269
270void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274}
275
276void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000278{
279 if (tstate == NULL)
280 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282 if (PyThreadState_Swap(tstate) != NULL)
283 Py_FatalError(
284 "PyEval_AcquireThread: non-NULL old thread state");
285}
286
287void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000288PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289{
290 if (tstate == NULL)
291 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
292 if (PyThreadState_Swap(NULL) != tstate)
293 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000294 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000295}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000296
297/* This function is called from PyOS_AfterFork to ensure that newly
298 created child processes don't hold locks referring to threads which
299 are not running in the child process. (This could also be done using
300 pthread_atfork mechanism, at least for the pthreads implementation.) */
301
302void
303PyEval_ReInitThreads(void)
304{
305 if (!interpreter_lock)
306 return;
307 /*XXX Can't use PyThread_free_lock here because it does too
308 much error-checking. Doing this cleanly would require
309 adding a new function to each thread_*.h. Instead, just
310 create a new lock and waste a little bit of memory */
311 interpreter_lock = PyThread_allocate_lock();
312 PyThread_acquire_lock(interpreter_lock, 1);
313 main_thread = PyThread_get_thread_ident();
314}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315#endif
316
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317/* Functions save_thread and restore_thread are always defined so
318 dynamically loaded modules needn't be compiled separately for use
319 with and without threads: */
320
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000321PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 PyThreadState *tstate = PyThreadState_Swap(NULL);
325 if (tstate == NULL)
326 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000327#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000331 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332}
333
334void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000335PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000337 if (tstate == NULL)
338 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000339#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000341 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000342 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 }
345#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000346 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347}
348
349
Guido van Rossuma9672091994-09-14 13:31:22 +0000350/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
351 signal handlers or Mac I/O completion routines) can schedule calls
352 to a function to be called synchronously.
353 The synchronous function is called with one void* argument.
354 It should return 0 for success or -1 for failure -- failure should
355 be accompanied by an exception.
356
357 If registry succeeds, the registry function returns 0; if it fails
358 (e.g. due to too many pending calls) it returns -1 (without setting
359 an exception condition).
360
361 Note that because registry may occur from within signal handlers,
362 or other asynchronous events, calling malloc() is unsafe!
363
364#ifdef WITH_THREAD
365 Any thread can schedule pending calls, but only the main thread
366 will execute them.
367#endif
368
369 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
370 There are two possible race conditions:
371 (1) nested asynchronous registry calls;
372 (2) registry calls made while pending calls are being processed.
373 While (1) is very unlikely, (2) is a real possibility.
374 The current code is safe against (2), but not against (1).
375 The safety against (2) is derived from the fact that only one
376 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378 XXX Darn! With the advent of thread state, we should have an array
379 of pending calls per thread in the thread state! Later...
380*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000381
Guido van Rossuma9672091994-09-14 13:31:22 +0000382#define NPENDINGCALLS 32
383static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000384 int (*func)(void *);
385 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000386} pendingcalls[NPENDINGCALLS];
387static volatile int pendingfirst = 0;
388static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390
391int
Thomas Wouters334fb892000-07-25 12:56:38 +0000392Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000393{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000394 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 int i, j;
396 /* XXX Begin critical section */
397 /* XXX If you want this to be safe against nested
398 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000399 if (busy)
400 return -1;
401 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendinglast;
403 j = (i + 1) % NPENDINGCALLS;
404 if (j == pendingfirst)
405 return -1; /* Queue full */
406 pendingcalls[i].func = func;
407 pendingcalls[i].arg = arg;
408 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000409 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000410 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 /* XXX End critical section */
412 return 0;
413}
414
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000417{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000418 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000420 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000421 return 0;
422#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000423 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 return 0;
425 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 for (;;) {
428 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000429 int (*func)(void *);
430 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 i = pendingfirst;
432 if (i == pendinglast)
433 break; /* Queue empty */
434 func = pendingcalls[i].func;
435 arg = pendingcalls[i].arg;
436 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000437 if (func(arg) < 0) {
438 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000439 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000440 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000441 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 return 0;
445}
446
447
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000448/* The interpreter's recursion limit */
449
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000450static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000452int
453Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000454{
455 return recursion_limit;
456}
457
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000458void
459Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000460{
461 recursion_limit = new_limit;
462}
463
Guido van Rossum374a9221991-04-04 10:40:29 +0000464/* Status code for main loop (reason for stack unwind) */
465
466enum why_code {
467 WHY_NOT, /* No error */
468 WHY_EXCEPTION, /* Exception occurred */
469 WHY_RERAISE, /* Exception re-raised by 'finally' */
470 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000471 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000472 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000473 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000474};
475
Tim Petersdbd9ba62000-07-09 03:09:57 +0000476static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000477static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000478
Guido van Rossum374a9221991-04-04 10:40:29 +0000479
Guido van Rossumb209a111997-04-29 18:18:01 +0000480PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000481PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 (PyObject **)NULL, 0,
486 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000487 (PyObject **)NULL, 0,
488 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489}
490
491
492/* Interpreter main loop */
493
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000495eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000496{
Guido van Rossum950361c1997-01-24 13:49:28 +0000497#ifdef DXPAIRS
498 int lastopcode = 0;
499#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000500 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000501 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000502 register int opcode=0; /* Current opcode */
503 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000504 register enum why_code why; /* Reason for block stack unwind */
505 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000506 register PyObject *x; /* Result object -- NULL if error */
507 register PyObject *v; /* Temporary objects popped off stack */
508 register PyObject *w;
509 register PyObject *u;
510 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000511 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000512 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000513 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000514 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000515 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000518 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000520#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000522 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000523#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000524
525/* Code access macros */
526
527#define GETCONST(i) Getconst(f, i)
528#define GETNAME(i) Getname(f, i)
529#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000530#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000531#define NEXTOP() (*next_instr++)
532#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000533#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#define JUMPBY(x) (next_instr += (x))
535
536/* Stack manipulation macros */
537
538#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
539#define EMPTY() (STACK_LEVEL() == 0)
540#define TOP() (stack_pointer[-1])
541#define BASIC_PUSH(v) (*stack_pointer++ = (v))
542#define BASIC_POP() (*--stack_pointer)
543
Guido van Rossum96a42c81992-01-12 02:29:51 +0000544#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000545#define PUSH(v) { (void)(BASIC_PUSH(v), \
546 lltrace && prtrace(TOP(), "push")); \
547 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000548#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000549#else
550#define PUSH(v) BASIC_PUSH(v)
551#define POP() BASIC_POP()
552#endif
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000557#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 GETLOCAL(i) = value; } while (0)
559
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560/* Start of code */
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 if (f == NULL)
563 return NULL;
564
Guido van Rossum8861b741996-07-30 16:49:37 +0000565#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000567 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570#endif
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000573 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000576 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000577 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 co = f->f_code;
583 fastlocals = f->f_localsplus;
584 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000585 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000587 stack_pointer = f->f_stacktop;
588 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000589 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000590
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000591 if (tstate->use_tracing) {
592 if (tstate->c_tracefunc != NULL) {
593 /* tstate->c_tracefunc, if defined, is a
594 function that will be called on *every* entry
595 to a code block. Its return value, if not
596 None, is a function that will be called at
597 the start of each executed line of code.
598 (Actually, the function must return itself
599 in order to continue tracing.) The trace
600 functions are called with three arguments:
601 a pointer to the current frame, a string
602 indicating why the function is called, and
603 an argument which depends on the situation.
604 The global trace function is also called
605 whenever an exception is detected. */
606 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
607 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000608 /* Trace function raised an error */
609 return NULL;
610 }
611 }
612 if (tstate->c_profilefunc != NULL) {
613 /* Similar for c_profilefunc, except it needn't
614 return itself and isn't called for "line" events */
615 if (call_trace(tstate->c_profilefunc,
616 tstate->c_profileobj,
617 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000618 /* Profile function raised an error */
619 return NULL;
620 }
621 }
622 }
623
Tim Peters5ca576e2001-06-18 22:08:13 +0000624#ifdef LLTRACE
625 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
626#endif
627#if defined(Py_DEBUG) || defined(LLTRACE)
628 filename = PyString_AsString(co->co_filename);
629#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000630
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 why = WHY_NOT;
632 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000633 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000634 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000637 assert(stack_pointer >= f->f_valuestack); /* else underflow */
638 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000639 /* Do periodic things. Doing this every time through
640 the loop would add too much overhead, so we do it
641 only every Nth instruction. We also do it if
642 ``things_to_do'' is set, i.e. when an asynchronous
643 event needs attention (e.g. a signal handler or
644 async I/O handler); see Py_AddPendingCall() and
645 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000646
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000648 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000649 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000650 if (Py_MakePendingCalls() < 0) {
651 why = WHY_EXCEPTION;
652 goto on_error;
653 }
654 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000655#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000656 /* If we have true signals, the signal handler
657 will call Py_AddPendingCall() so we don't
658 have to call sigcheck(). On the Mac and
659 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000660 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 goto on_error;
663 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000664#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665
Guido van Rossume59214e1994-08-30 08:01:59 +0000666#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 if (interpreter_lock) {
668 /* Give another thread a chance */
669
Guido van Rossum25ce5661997-08-02 03:10:38 +0000670 if (PyThreadState_Swap(NULL) != tstate)
671 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000672 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673
674 /* Other threads may run now */
675
Guido van Rossum65d5b571998-12-21 19:32:43 +0000676 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000677 if (PyThreadState_Swap(tstate) != NULL)
678 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 }
680#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682
Neil Schemenauer63543862002-02-17 19:10:14 +0000683 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000685
Guido van Rossum408027e1996-12-30 16:17:54 +0000686#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000687 f->f_lasti = INSTR_OFFSET();
688#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000689
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 opcode = NEXTOP();
691 if (HAS_ARG(opcode))
692 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000693 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000694#ifdef DYNAMIC_EXECUTION_PROFILE
695#ifdef DXPAIRS
696 dxpairs[lastopcode][opcode]++;
697 lastopcode = opcode;
698#endif
699 dxp[opcode]++;
700#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000701
Guido van Rossum96a42c81992-01-12 02:29:51 +0000702#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000704
Guido van Rossum96a42c81992-01-12 02:29:51 +0000705 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 if (HAS_ARG(opcode)) {
707 printf("%d: %d, %d\n",
708 (int) (INSTR_OFFSET() - 3),
709 opcode, oparg);
710 }
711 else {
712 printf("%d: %d\n",
713 (int) (INSTR_OFFSET() - 1), opcode);
714 }
715 }
716#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000720
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 /* BEWARE!
722 It is essential that any operation that fails sets either
723 x to NULL, err to nonzero, or why to anything but WHY_NOT,
724 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000727
Neil Schemenauer63543862002-02-17 19:10:14 +0000728 case SET_LINENO:
729#ifdef LLTRACE
730 if (lltrace)
731 printf("--- %s:%d \n", filename, oparg);
732#endif
733 f->f_lineno = oparg;
734 if (tstate->c_tracefunc == NULL || tstate->tracing)
735 goto fast_next_opcode;
736 /* Trace each line of code reached */
737 f->f_lasti = INSTR_OFFSET();
738 /* Inline call_trace() for performance: */
739 tstate->tracing++;
740 tstate->use_tracing = 0;
741 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
742 PyTrace_LINE, Py_None);
743 tstate->use_tracing = (tstate->c_tracefunc
744 || tstate->c_profilefunc);
745 tstate->tracing--;
746 break;
747
748 case LOAD_FAST:
749 x = GETLOCAL(oparg);
750 if (x != NULL) {
751 Py_INCREF(x);
752 PUSH(x);
753 goto fast_next_opcode;
754 }
755 format_exc_check_arg(PyExc_UnboundLocalError,
756 UNBOUNDLOCAL_ERROR_MSG,
757 PyTuple_GetItem(co->co_varnames, oparg));
758 break;
759
760 case LOAD_CONST:
761 x = GETCONST(oparg);
762 Py_INCREF(x);
763 PUSH(x);
764 goto fast_next_opcode;
765
766 case STORE_FAST:
767 v = POP();
768 SETLOCAL(oparg, v);
769 goto fast_next_opcode;
770
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 case POP_TOP:
772 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000773 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000774 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000775
Guido van Rossum374a9221991-04-04 10:40:29 +0000776 case ROT_TWO:
777 v = POP();
778 w = POP();
779 PUSH(v);
780 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000781 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000782
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 case ROT_THREE:
784 v = POP();
785 w = POP();
786 x = POP();
787 PUSH(v);
788 PUSH(x);
789 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000790 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000791
Thomas Wouters434d0822000-08-24 20:11:32 +0000792 case ROT_FOUR:
793 u = POP();
794 v = POP();
795 w = POP();
796 x = POP();
797 PUSH(u);
798 PUSH(x);
799 PUSH(w);
800 PUSH(v);
801 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000802
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 case DUP_TOP:
804 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000805 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000806 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000807 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000808
Thomas Wouters434d0822000-08-24 20:11:32 +0000809 case DUP_TOPX:
810 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000811 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000812 x = TOP();
813 Py_INCREF(x);
814 PUSH(x);
815 continue;
816 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000817 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000818 Py_INCREF(x);
819 w = TOP();
820 Py_INCREF(w);
821 PUSH(x);
822 PUSH(w);
823 PUSH(x);
824 continue;
825 case 3:
826 x = POP();
827 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000828 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000829 Py_INCREF(w);
830 v = TOP();
831 Py_INCREF(v);
832 PUSH(w);
833 PUSH(x);
834 PUSH(v);
835 PUSH(w);
836 PUSH(x);
837 continue;
838 case 4:
839 x = POP();
840 Py_INCREF(x);
841 w = POP();
842 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000843 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000844 Py_INCREF(v);
845 u = TOP();
846 Py_INCREF(u);
847 PUSH(v);
848 PUSH(w);
849 PUSH(x);
850 PUSH(u);
851 PUSH(v);
852 PUSH(w);
853 PUSH(x);
854 continue;
855 case 5:
856 x = POP();
857 Py_INCREF(x);
858 w = POP();
859 Py_INCREF(w);
860 v = POP();
861 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000862 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000863 Py_INCREF(u);
864 t = TOP();
865 Py_INCREF(t);
866 PUSH(u);
867 PUSH(v);
868 PUSH(w);
869 PUSH(x);
870 PUSH(t);
871 PUSH(u);
872 PUSH(v);
873 PUSH(w);
874 PUSH(x);
875 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000876 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000877 Py_FatalError("invalid argument to DUP_TOPX"
878 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000879 }
Tim Peters35ba6892000-10-11 07:04:49 +0000880 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000881
Guido van Rossum374a9221991-04-04 10:40:29 +0000882 case UNARY_POSITIVE:
883 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000884 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000885 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000887 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000889
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 case UNARY_NEGATIVE:
891 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000892 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000893 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000895 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000897
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 case UNARY_NOT:
899 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000902 if (err == 0) {
903 Py_INCREF(Py_True);
904 PUSH(Py_True);
905 continue;
906 }
907 else if (err > 0) {
908 Py_INCREF(Py_False);
909 PUSH(Py_False);
910 err = 0;
911 continue;
912 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000914
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 case UNARY_CONVERT:
916 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 x = PyObject_Repr(v);
918 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000920 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000922
Guido van Rossum7928cd71991-10-24 14:59:31 +0000923 case UNARY_INVERT:
924 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000925 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000926 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000927 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000928 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000929 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000930
Guido van Rossum50564e81996-01-12 01:13:16 +0000931 case BINARY_POWER:
932 w = POP();
933 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000934 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 Py_DECREF(v);
936 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000937 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000938 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000939 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000940
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 case BINARY_MULTIPLY:
942 w = POP();
943 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000944 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 Py_DECREF(v);
946 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000950
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000952 if (!_Py_QnewFlag) {
953 w = POP();
954 v = POP();
955 x = PyNumber_Divide(v, w);
956 Py_DECREF(v);
957 Py_DECREF(w);
958 PUSH(x);
959 if (x != NULL) continue;
960 break;
961 }
962 /* -Qnew is in effect: fall through to
963 BINARY_TRUE_DIVIDE */
964 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 w = POP();
966 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000967 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000968 Py_DECREF(v);
969 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000971 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000973
Guido van Rossum4668b002001-08-08 05:00:18 +0000974 case BINARY_FLOOR_DIVIDE:
975 w = POP();
976 v = POP();
977 x = PyNumber_FloorDivide(v, w);
978 Py_DECREF(v);
979 Py_DECREF(w);
980 PUSH(x);
981 if (x != NULL) continue;
982 break;
983
Guido van Rossum374a9221991-04-04 10:40:29 +0000984 case BINARY_MODULO:
985 w = POP();
986 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000987 x = PyNumber_Remainder(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 Rossum374a9221991-04-04 10:40:29 +0000994 case BINARY_ADD:
995 w = POP();
996 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000997 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000998 /* INLINE: int + int */
999 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001000 a = PyInt_AS_LONG(v);
1001 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001002 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001003 if ((i^a) < 0 && (i^b) < 0)
1004 goto slow_add;
1005 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001007 else {
1008 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001010 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001011 Py_DECREF(v);
1012 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001014 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001016
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 case BINARY_SUBTRACT:
1018 w = POP();
1019 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001020 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001021 /* INLINE: int - int */
1022 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001023 a = PyInt_AS_LONG(v);
1024 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001025 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001026 if ((i^a) < 0 && (i^~b) < 0)
1027 goto slow_sub;
1028 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001029 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001030 else {
1031 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001032 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001033 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 Py_DECREF(v);
1035 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001037 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001039
Guido van Rossum374a9221991-04-04 10:40:29 +00001040 case BINARY_SUBSCR:
1041 w = POP();
1042 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001043 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001044 /* INLINE: list[int] */
1045 long i = PyInt_AsLong(w);
1046 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001047 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001048 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001049 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001050 PyErr_SetString(PyExc_IndexError,
1051 "list index out of range");
1052 x = NULL;
1053 }
1054 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001055 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001056 Py_INCREF(x);
1057 }
1058 }
1059 else
1060 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001061 Py_DECREF(v);
1062 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001064 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001065 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001066
Guido van Rossum7928cd71991-10-24 14:59:31 +00001067 case BINARY_LSHIFT:
1068 w = POP();
1069 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001070 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001071 Py_DECREF(v);
1072 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001073 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001074 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001075 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001076
Guido van Rossum7928cd71991-10-24 14:59:31 +00001077 case BINARY_RSHIFT:
1078 w = POP();
1079 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001080 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001081 Py_DECREF(v);
1082 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001083 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001084 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001085 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001086
Guido van Rossum7928cd71991-10-24 14:59:31 +00001087 case BINARY_AND:
1088 w = POP();
1089 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001090 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001091 Py_DECREF(v);
1092 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001093 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001094 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001096
Guido van Rossum7928cd71991-10-24 14:59:31 +00001097 case BINARY_XOR:
1098 w = POP();
1099 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001100 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001101 Py_DECREF(v);
1102 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001103 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001104 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001105 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001106
Guido van Rossum7928cd71991-10-24 14:59:31 +00001107 case BINARY_OR:
1108 w = POP();
1109 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001110 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001111 Py_DECREF(v);
1112 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001113 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001114 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001115 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001116
1117 case INPLACE_POWER:
1118 w = POP();
1119 v = POP();
1120 x = PyNumber_InPlacePower(v, w, Py_None);
1121 Py_DECREF(v);
1122 Py_DECREF(w);
1123 PUSH(x);
1124 if (x != NULL) continue;
1125 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001126
Thomas Wouters434d0822000-08-24 20:11:32 +00001127 case INPLACE_MULTIPLY:
1128 w = POP();
1129 v = POP();
1130 x = PyNumber_InPlaceMultiply(v, w);
1131 Py_DECREF(v);
1132 Py_DECREF(w);
1133 PUSH(x);
1134 if (x != NULL) continue;
1135 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001136
Thomas Wouters434d0822000-08-24 20:11:32 +00001137 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001138 if (!_Py_QnewFlag) {
1139 w = POP();
1140 v = POP();
1141 x = PyNumber_InPlaceDivide(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 PUSH(x);
1145 if (x != NULL) continue;
1146 break;
1147 }
1148 /* -Qnew is in effect: fall through to
1149 INPLACE_TRUE_DIVIDE */
1150 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 w = POP();
1152 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001153 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001154 Py_DECREF(v);
1155 Py_DECREF(w);
1156 PUSH(x);
1157 if (x != NULL) continue;
1158 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001159
Guido van Rossum4668b002001-08-08 05:00:18 +00001160 case INPLACE_FLOOR_DIVIDE:
1161 w = POP();
1162 v = POP();
1163 x = PyNumber_InPlaceFloorDivide(v, w);
1164 Py_DECREF(v);
1165 Py_DECREF(w);
1166 PUSH(x);
1167 if (x != NULL) continue;
1168 break;
1169
Thomas Wouters434d0822000-08-24 20:11:32 +00001170 case INPLACE_MODULO:
1171 w = POP();
1172 v = POP();
1173 x = PyNumber_InPlaceRemainder(v, w);
1174 Py_DECREF(v);
1175 Py_DECREF(w);
1176 PUSH(x);
1177 if (x != NULL) continue;
1178 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001179
Thomas Wouters434d0822000-08-24 20:11:32 +00001180 case INPLACE_ADD:
1181 w = POP();
1182 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001183 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001184 /* INLINE: int + int */
1185 register long a, b, i;
1186 a = PyInt_AS_LONG(v);
1187 b = PyInt_AS_LONG(w);
1188 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001189 if ((i^a) < 0 && (i^b) < 0)
1190 goto slow_iadd;
1191 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001192 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001193 else {
1194 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001195 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001196 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001197 Py_DECREF(v);
1198 Py_DECREF(w);
1199 PUSH(x);
1200 if (x != NULL) continue;
1201 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001202
Thomas Wouters434d0822000-08-24 20:11:32 +00001203 case INPLACE_SUBTRACT:
1204 w = POP();
1205 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001206 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001207 /* INLINE: int - int */
1208 register long a, b, i;
1209 a = PyInt_AS_LONG(v);
1210 b = PyInt_AS_LONG(w);
1211 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001212 if ((i^a) < 0 && (i^~b) < 0)
1213 goto slow_isub;
1214 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001216 else {
1217 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001218 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001219 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001220 Py_DECREF(v);
1221 Py_DECREF(w);
1222 PUSH(x);
1223 if (x != NULL) continue;
1224 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001225
Thomas Wouters434d0822000-08-24 20:11:32 +00001226 case INPLACE_LSHIFT:
1227 w = POP();
1228 v = POP();
1229 x = PyNumber_InPlaceLshift(v, w);
1230 Py_DECREF(v);
1231 Py_DECREF(w);
1232 PUSH(x);
1233 if (x != NULL) continue;
1234 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001235
Thomas Wouters434d0822000-08-24 20:11:32 +00001236 case INPLACE_RSHIFT:
1237 w = POP();
1238 v = POP();
1239 x = PyNumber_InPlaceRshift(v, w);
1240 Py_DECREF(v);
1241 Py_DECREF(w);
1242 PUSH(x);
1243 if (x != NULL) continue;
1244 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001245
Thomas Wouters434d0822000-08-24 20:11:32 +00001246 case INPLACE_AND:
1247 w = POP();
1248 v = POP();
1249 x = PyNumber_InPlaceAnd(v, w);
1250 Py_DECREF(v);
1251 Py_DECREF(w);
1252 PUSH(x);
1253 if (x != NULL) continue;
1254 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001255
Thomas Wouters434d0822000-08-24 20:11:32 +00001256 case INPLACE_XOR:
1257 w = POP();
1258 v = POP();
1259 x = PyNumber_InPlaceXor(v, w);
1260 Py_DECREF(v);
1261 Py_DECREF(w);
1262 PUSH(x);
1263 if (x != NULL) continue;
1264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Thomas Wouters434d0822000-08-24 20:11:32 +00001266 case INPLACE_OR:
1267 w = POP();
1268 v = POP();
1269 x = PyNumber_InPlaceOr(v, w);
1270 Py_DECREF(v);
1271 Py_DECREF(w);
1272 PUSH(x);
1273 if (x != NULL) continue;
1274 break;
1275
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 case SLICE+0:
1277 case SLICE+1:
1278 case SLICE+2:
1279 case SLICE+3:
1280 if ((opcode-SLICE) & 2)
1281 w = POP();
1282 else
1283 w = NULL;
1284 if ((opcode-SLICE) & 1)
1285 v = POP();
1286 else
1287 v = NULL;
1288 u = POP();
1289 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 Py_DECREF(u);
1291 Py_XDECREF(v);
1292 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001294 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001296
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 case STORE_SLICE+0:
1298 case STORE_SLICE+1:
1299 case STORE_SLICE+2:
1300 case STORE_SLICE+3:
1301 if ((opcode-STORE_SLICE) & 2)
1302 w = POP();
1303 else
1304 w = NULL;
1305 if ((opcode-STORE_SLICE) & 1)
1306 v = POP();
1307 else
1308 v = NULL;
1309 u = POP();
1310 t = POP();
1311 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 Py_DECREF(t);
1313 Py_DECREF(u);
1314 Py_XDECREF(v);
1315 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001316 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001318
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 case DELETE_SLICE+0:
1320 case DELETE_SLICE+1:
1321 case DELETE_SLICE+2:
1322 case DELETE_SLICE+3:
1323 if ((opcode-DELETE_SLICE) & 2)
1324 w = POP();
1325 else
1326 w = NULL;
1327 if ((opcode-DELETE_SLICE) & 1)
1328 v = POP();
1329 else
1330 v = NULL;
1331 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 Py_DECREF(u);
1335 Py_XDECREF(v);
1336 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001337 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001339
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 case STORE_SUBSCR:
1341 w = POP();
1342 v = POP();
1343 u = POP();
1344 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001345 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 Py_DECREF(u);
1347 Py_DECREF(v);
1348 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001349 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001351
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 case DELETE_SUBSCR:
1353 w = POP();
1354 v = POP();
1355 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001356 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001357 Py_DECREF(v);
1358 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001359 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001361
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 case PRINT_EXPR:
1363 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001364 w = PySys_GetObject("displayhook");
1365 if (w == NULL) {
1366 PyErr_SetString(PyExc_RuntimeError,
1367 "lost sys.displayhook");
1368 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001369 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001370 }
1371 if (err == 0) {
1372 x = Py_BuildValue("(O)", v);
1373 if (x == NULL)
1374 err = -1;
1375 }
1376 if (err == 0) {
1377 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001378 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001379 if (w == NULL)
1380 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001383 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001385
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001386 case PRINT_ITEM_TO:
1387 w = stream = POP();
1388 /* fall through to PRINT_ITEM */
1389
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 case PRINT_ITEM:
1391 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001392 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001393 w = PySys_GetObject("stdout");
1394 if (w == NULL) {
1395 PyErr_SetString(PyExc_RuntimeError,
1396 "lost sys.stdout");
1397 err = -1;
1398 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001399 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001400 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001401 err = PyFile_WriteString(" ", w);
1402 if (err == 0)
1403 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001404 if (err == 0) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001405 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001406 if (PyString_Check(v)) {
1407 char *s = PyString_AS_STRING(v);
1408 int len = PyString_GET_SIZE(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001409 if (len > 0 &&
1410 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001411 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001412 PyFile_SoftSpace(w, 0);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001413 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001414#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001415 else if (PyUnicode_Check(v)) {
1416 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1417 int len = PyUnicode_GET_SIZE(v);
1418 if (len > 0 &&
1419 Py_UNICODE_ISSPACE(s[len-1]) &&
1420 s[len-1] != ' ')
1421 PyFile_SoftSpace(w, 0);
1422 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001423#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001425 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001426 Py_XDECREF(stream);
1427 stream = NULL;
1428 if (err == 0)
1429 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001431
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001432 case PRINT_NEWLINE_TO:
1433 w = stream = POP();
1434 /* fall through to PRINT_NEWLINE */
1435
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001437 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001438 w = PySys_GetObject("stdout");
1439 if (w == NULL)
1440 PyErr_SetString(PyExc_RuntimeError,
1441 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001442 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001443 if (w != NULL) {
1444 err = PyFile_WriteString("\n", w);
1445 if (err == 0)
1446 PyFile_SoftSpace(w, 0);
1447 }
1448 Py_XDECREF(stream);
1449 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001451
Thomas Wouters434d0822000-08-24 20:11:32 +00001452
1453#ifdef CASE_TOO_BIG
1454 default: switch (opcode) {
1455#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 case BREAK_LOOP:
1457 why = WHY_BREAK;
1458 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001459
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001460 case CONTINUE_LOOP:
1461 retval = PyInt_FromLong(oparg);
1462 why = WHY_CONTINUE;
1463 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001464
Guido van Rossumf10570b1995-07-07 22:53:21 +00001465 case RAISE_VARARGS:
1466 u = v = w = NULL;
1467 switch (oparg) {
1468 case 3:
1469 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001470 /* Fallthrough */
1471 case 2:
1472 v = POP(); /* value */
1473 /* Fallthrough */
1474 case 1:
1475 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001476 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001477 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001478 break;
1479 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001481 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001482 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001483 break;
1484 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001486
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001488 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001489 PyErr_SetString(PyExc_SystemError,
1490 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001491 break;
1492 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001494 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001496
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 case RETURN_VALUE:
1498 retval = POP();
1499 why = WHY_RETURN;
1500 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001501
Tim Peters5ca576e2001-06-18 22:08:13 +00001502 case YIELD_VALUE:
1503 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001504 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001505 f->f_lasti = INSTR_OFFSET();
1506 why = WHY_YIELD;
1507 break;
1508
1509
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001510 case EXEC_STMT:
1511 w = POP();
1512 v = POP();
1513 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001514 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 Py_DECREF(u);
1516 Py_DECREF(v);
1517 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001518 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001519
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 case POP_BLOCK:
1521 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 while (STACK_LEVEL() > b->b_level) {
1524 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 }
1527 }
1528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 case END_FINALLY:
1531 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 if (PyInt_Check(v)) {
1533 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001534 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001535 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001536 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 retval = POP();
1538 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001544 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 else if (v != Py_None) {
1547 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 "'finally' pops bad exception");
1549 why = WHY_EXCEPTION;
1550 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 Py_DECREF(v);
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 BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001555 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001557 w = POP();
1558 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 Py_DECREF(u);
1561 Py_DECREF(v);
1562 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001564
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 case STORE_NAME:
1566 w = GETNAMEV(oparg);
1567 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001569 PyErr_Format(PyExc_SystemError,
1570 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001571 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 break;
1573 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 err = PyDict_SetItem(x, w, v);
1575 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001577
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001579 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001580 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001581 PyErr_Format(PyExc_SystemError,
1582 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001583 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 break;
1585 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001587 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001588 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001590
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001591 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001593 if (PyTuple_Check(v)) {
1594 if (PyTuple_Size(v) != oparg) {
1595 PyErr_SetString(PyExc_ValueError,
1596 "unpack tuple of wrong size");
1597 why = WHY_EXCEPTION;
1598 }
1599 else {
1600 for (; --oparg >= 0; ) {
1601 w = PyTuple_GET_ITEM(v, oparg);
1602 Py_INCREF(w);
1603 PUSH(w);
1604 }
1605 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001606 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001607 else if (PyList_Check(v)) {
1608 if (PyList_Size(v) != oparg) {
1609 PyErr_SetString(PyExc_ValueError,
1610 "unpack list of wrong size");
1611 why = WHY_EXCEPTION;
1612 }
1613 else {
1614 for (; --oparg >= 0; ) {
1615 w = PyList_GET_ITEM(v, oparg);
1616 Py_INCREF(w);
1617 PUSH(w);
1618 }
1619 }
1620 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001621 else if (unpack_iterable(v, oparg,
1622 stack_pointer + oparg))
1623 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001624 else {
1625 if (PyErr_ExceptionMatches(PyExc_TypeError))
1626 PyErr_SetString(PyExc_TypeError,
1627 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001628 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001629 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001630 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001631 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001632
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001634 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 v = POP();
1636 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1638 Py_DECREF(v);
1639 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001641
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001643 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001645 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1646 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001649
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001650 case STORE_GLOBAL:
1651 w = GETNAMEV(oparg);
1652 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 err = PyDict_SetItem(f->f_globals, w, v);
1654 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001655 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001656
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001657 case DELETE_GLOBAL:
1658 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001659 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001660 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001661 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001662 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001663
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001665 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001667 PyErr_Format(PyExc_SystemError,
1668 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001669 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001670 break;
1671 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001678 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001679 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001680 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 break;
1682 }
1683 }
1684 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 PUSH(x);
1687 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001688
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001690 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001695 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001696 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001697 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 break;
1699 }
1700 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001701 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 PUSH(x);
1703 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001704
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001705 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001706 x = GETLOCAL(oparg);
1707 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001708 format_exc_check_arg(
1709 PyExc_UnboundLocalError,
1710 UNBOUNDLOCAL_ERROR_MSG,
1711 PyTuple_GetItem(co->co_varnames, oparg)
1712 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001713 break;
1714 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001715 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001716 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001717
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001718 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001719 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001720 Py_INCREF(x);
1721 PUSH(x);
1722 break;
1723
1724 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001725 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001726 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001727 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001728 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001729 v = PyTuple_GetItem(co->co_cellvars,
1730 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001731 format_exc_check_arg(
1732 PyExc_UnboundLocalError,
1733 UNBOUNDLOCAL_ERROR_MSG,
1734 v);
1735 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001736 v = PyTuple_GetItem(
1737 co->co_freevars,
1738 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001739 format_exc_check_arg(
1740 PyExc_NameError,
1741 UNBOUNDFREE_ERROR_MSG,
1742 v);
1743 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001744 err = -1;
1745 break;
1746 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001747 PUSH(w);
1748 break;
1749
1750 case STORE_DEREF:
1751 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001752 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001753 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001754 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001755 continue;
1756
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001758 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 if (x != NULL) {
1760 for (; --oparg >= 0;) {
1761 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 }
1764 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001765 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 }
1767 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001768
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001770 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 if (x != NULL) {
1772 for (; --oparg >= 0;) {
1773 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001774 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 }
1776 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001777 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 }
1779 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001780
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001784 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001786
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001788 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 x = PyObject_GetAttr(v, w);
1791 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001793 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001795
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 case COMPARE_OP:
1797 w = POP();
1798 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001799 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001800 /* INLINE: cmp(int, int) */
1801 register long a, b;
1802 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001803 a = PyInt_AS_LONG(v);
1804 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001805 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001806 case PyCmp_LT: res = a < b; break;
1807 case PyCmp_LE: res = a <= b; break;
1808 case PyCmp_EQ: res = a == b; break;
1809 case PyCmp_NE: res = a != b; break;
1810 case PyCmp_GT: res = a > b; break;
1811 case PyCmp_GE: res = a >= b; break;
1812 case PyCmp_IS: res = v == w; break;
1813 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001814 default: goto slow_compare;
1815 }
1816 x = res ? Py_True : Py_False;
1817 Py_INCREF(x);
1818 }
1819 else {
1820 slow_compare:
1821 x = cmp_outcome(oparg, v, w);
1822 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001823 Py_DECREF(v);
1824 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001826 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001828
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001830 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001831 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001832 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001833 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001834 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001835 break;
1836 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001837 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001838 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001839 w,
1840 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001841 f->f_locals == NULL ?
1842 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001843 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001845 if (w == NULL) {
1846 x = NULL;
1847 break;
1848 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001849 x = PyEval_CallObject(x, w);
1850 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001851 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001852 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001854
Thomas Wouters52152252000-08-17 22:55:00 +00001855 case IMPORT_STAR:
1856 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001857 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001858 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001859 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001860 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001861 break;
1862 }
Thomas Wouters52152252000-08-17 22:55:00 +00001863 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001865 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001866 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001868
Thomas Wouters52152252000-08-17 22:55:00 +00001869 case IMPORT_FROM:
1870 w = GETNAMEV(oparg);
1871 v = TOP();
1872 x = import_from(v, w);
1873 PUSH(x);
1874 if (x != NULL) continue;
1875 break;
1876
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 case JUMP_FORWARD:
1878 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001879 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001880
Guido van Rossum374a9221991-04-04 10:40:29 +00001881 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001882 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001883 if (err > 0)
1884 err = 0;
1885 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001886 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001887 else
1888 break;
1889 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001890
Guido van Rossum374a9221991-04-04 10:40:29 +00001891 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001892 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001893 if (err > 0) {
1894 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001895 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001896 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001897 else if (err == 0)
1898 ;
1899 else
1900 break;
1901 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001902
Guido van Rossum374a9221991-04-04 10:40:29 +00001903 case JUMP_ABSOLUTE:
1904 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001905 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001906
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001907 case GET_ITER:
1908 /* before: [obj]; after [getiter(obj)] */
1909 v = POP();
1910 x = PyObject_GetIter(v);
1911 Py_DECREF(v);
1912 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001913 PUSH(x);
1914 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001915 }
1916 break;
1917
1918 case FOR_ITER:
1919 /* before: [iter]; after: [iter, iter()] *or* [] */
1920 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001921 x = PyIter_Next(v);
1922 if (x != NULL) {
1923 PUSH(x);
1924 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001925 }
Tim Petersf4848da2001-05-05 00:14:56 +00001926 if (!PyErr_Occurred()) {
1927 /* iterator ended normally */
1928 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001929 Py_DECREF(v);
1930 JUMPBY(oparg);
1931 continue;
1932 }
1933 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001934
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 case FOR_LOOP:
1936 /* for v in s: ...
1937 On entry: stack contains s, i.
1938 On exit: stack contains s, i+1, s[i];
1939 but if loop exhausted:
1940 s, i are popped, and we jump */
1941 w = POP(); /* Loop index */
1942 v = POP(); /* Sequence object */
1943 u = loop_subscript(v, w);
1944 if (u != NULL) {
1945 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001946 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001947 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001948 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001949 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001950 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001951 }
1952 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001953 Py_DECREF(v);
1954 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001955 /* A NULL can mean "s exhausted"
1956 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001957 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001958 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001959 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001960 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001961 continue;
1962 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001963 }
1964 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001965
Guido van Rossum374a9221991-04-04 10:40:29 +00001966 case SETUP_LOOP:
1967 case SETUP_EXCEPT:
1968 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001969 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001970 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001971 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001972
Guido van Rossumf10570b1995-07-07 22:53:21 +00001973 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001974 {
1975 int na = oparg & 0xff;
1976 int nk = (oparg>>8) & 0xff;
1977 int n = na + 2 * nk;
1978 PyObject **pfunc = stack_pointer - n - 1;
1979 PyObject *func = *pfunc;
1980 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1981
1982 /* Always dispatch PyCFunction first, because
1983 these are presumed to be the most frequent
1984 callable object.
1985 */
1986 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001987 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001988 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001989 x = do_call(func, &stack_pointer,
1990 na, nk);
1991 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001992 PyObject *callargs;
1993 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001994 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001995 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001996 } else
1997 x = fast_cfunction(func,
1998 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001999 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00002000 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002001 && PyMethod_GET_SELF(func) != NULL) {
2002 /* optimize access to bound methods */
2003 PyObject *self = PyMethod_GET_SELF(func);
2004 Py_INCREF(self);
2005 func = PyMethod_GET_FUNCTION(func);
2006 Py_INCREF(func);
2007 Py_DECREF(*pfunc);
2008 *pfunc = self;
2009 na++;
2010 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002011 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002012 Py_INCREF(func);
2013 if (PyFunction_Check(func)) {
2014 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002015 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002016 } else {
2017 x = do_call(func, &stack_pointer,
2018 na, nk);
2019 }
2020 Py_DECREF(func);
2021 }
2022
2023 while (stack_pointer > pfunc) {
2024 w = POP();
2025 Py_DECREF(w);
2026 }
2027 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002028 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002029 continue;
2030 break;
2031 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002032
Jeremy Hylton76901512000-03-28 23:49:17 +00002033 case CALL_FUNCTION_VAR:
2034 case CALL_FUNCTION_KW:
2035 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002036 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002037 int na = oparg & 0xff;
2038 int nk = (oparg>>8) & 0xff;
2039 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002040 int n = na + 2 * nk;
2041 PyObject **pfunc, *func;
2042 if (flags & CALL_FLAG_VAR)
2043 n++;
2044 if (flags & CALL_FLAG_KW)
2045 n++;
2046 pfunc = stack_pointer - n - 1;
2047 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002048 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002049
Guido van Rossumac7be682001-01-17 15:42:30 +00002050 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002051 && PyMethod_GET_SELF(func) != NULL) {
2052 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002053 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002054 func = PyMethod_GET_FUNCTION(func);
2055 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002056 Py_DECREF(*pfunc);
2057 *pfunc = self;
2058 na++;
2059 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002060 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002061 Py_INCREF(func);
2062 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002063 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002064
Jeremy Hylton76901512000-03-28 23:49:17 +00002065 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002066 w = POP();
2067 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002068 }
2069 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002070 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002071 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002072 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002073 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002074
Guido van Rossum681d79a1995-07-18 14:51:37 +00002075 case MAKE_FUNCTION:
2076 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 x = PyFunction_New(v, f->f_globals);
2078 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002079 /* XXX Maybe this should be a separate opcode? */
2080 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002082 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002084 x = NULL;
2085 break;
2086 }
2087 while (--oparg >= 0) {
2088 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002089 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002090 }
2091 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002093 }
2094 PUSH(x);
2095 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002096
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002097 case MAKE_CLOSURE:
2098 {
2099 int nfree;
2100 v = POP(); /* code object */
2101 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002102 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002103 Py_DECREF(v);
2104 /* XXX Maybe this should be a separate opcode? */
2105 if (x != NULL && nfree > 0) {
2106 v = PyTuple_New(nfree);
2107 if (v == NULL) {
2108 Py_DECREF(x);
2109 x = NULL;
2110 break;
2111 }
2112 while (--nfree >= 0) {
2113 w = POP();
2114 PyTuple_SET_ITEM(v, nfree, w);
2115 }
2116 err = PyFunction_SetClosure(x, v);
2117 Py_DECREF(v);
2118 }
2119 if (x != NULL && oparg > 0) {
2120 v = PyTuple_New(oparg);
2121 if (v == NULL) {
2122 Py_DECREF(x);
2123 x = NULL;
2124 break;
2125 }
2126 while (--oparg >= 0) {
2127 w = POP();
2128 PyTuple_SET_ITEM(v, oparg, w);
2129 }
2130 err = PyFunction_SetDefaults(x, v);
2131 Py_DECREF(v);
2132 }
2133 PUSH(x);
2134 break;
2135 }
2136
Guido van Rossum8861b741996-07-30 16:49:37 +00002137 case BUILD_SLICE:
2138 if (oparg == 3)
2139 w = POP();
2140 else
2141 w = NULL;
2142 v = POP();
2143 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002144 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 Py_DECREF(u);
2146 Py_DECREF(v);
2147 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002148 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002149 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002150 break;
2151
Fred Drakeef8ace32000-08-24 00:32:09 +00002152 case EXTENDED_ARG:
2153 opcode = NEXTOP();
2154 oparg = oparg<<16 | NEXTARG();
2155 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002156
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 default:
2158 fprintf(stderr,
2159 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002160 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002162 why = WHY_EXCEPTION;
2163 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002164
2165#ifdef CASE_TOO_BIG
2166 }
2167#endif
2168
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 } /* switch */
2170
2171 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002172
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002174
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002176 if (err == 0 && x != NULL) {
2177#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002178 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002180 fprintf(stderr,
2181 "XXX undetected error\n");
2182 else
2183#endif
2184 continue; /* Normal, fast path */
2185 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002187 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 err = 0;
2189 }
2190
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002192
Guido van Rossum374a9221991-04-04 10:40:29 +00002193 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002194 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002195 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002196 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 why = WHY_EXCEPTION;
2198 }
2199 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002200#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002201 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002202 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002204 fprintf(stderr,
2205 "XXX undetected error (why=%d)\n",
2206 why);
2207 why = WHY_EXCEPTION;
2208 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002209 }
2210#endif
2211
2212 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002213
Guido van Rossum374a9221991-04-04 10:40:29 +00002214 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002215 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002217 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002218 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002219
Fred Drake8f51f542001-10-04 14:48:42 +00002220 if (tstate->c_tracefunc != NULL)
2221 call_exc_trace(tstate->c_tracefunc,
2222 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002223 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002224
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002226
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 if (why == WHY_RERAISE)
2228 why = WHY_EXCEPTION;
2229
2230 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002231
Tim Peters5ca576e2001-06-18 22:08:13 +00002232 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002234
2235 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2236 /* For a continue inside a try block,
2237 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002238 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2239 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002240 why = WHY_NOT;
2241 JUMPTO(PyInt_AS_LONG(retval));
2242 Py_DECREF(retval);
2243 break;
2244 }
2245
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 while (STACK_LEVEL() > b->b_level) {
2247 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002248 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002249 }
2250 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2251 why = WHY_NOT;
2252 JUMPTO(b->b_handler);
2253 break;
2254 }
2255 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002256 (b->b_type == SETUP_EXCEPT &&
2257 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002258 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 PyObject *exc, *val, *tb;
2260 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002261 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002262 val = Py_None;
2263 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002264 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002265 /* Make the raw exception data
2266 available to the handler,
2267 so a program can emulate the
2268 Python main loop. Don't do
2269 this for 'finally'. */
2270 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002271 PyErr_NormalizeException(
2272 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002273 set_exc_info(tstate,
2274 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002275 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002276 if (tb == NULL) {
2277 Py_INCREF(Py_None);
2278 PUSH(Py_None);
2279 } else
2280 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002281 PUSH(val);
2282 PUSH(exc);
2283 }
2284 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002285 if (why == WHY_RETURN ||
2286 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002287 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002288 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002289 PUSH(v);
2290 }
2291 why = WHY_NOT;
2292 JUMPTO(b->b_handler);
2293 break;
2294 }
2295 } /* unwind stack */
2296
2297 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002298
Guido van Rossum374a9221991-04-04 10:40:29 +00002299 if (why != WHY_NOT)
2300 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002301
Guido van Rossum374a9221991-04-04 10:40:29 +00002302 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002303
Guido van Rossum35974fb2001-12-06 21:28:18 +00002304 if (why != WHY_YIELD) {
2305 /* Pop remaining stack entries -- but when yielding */
2306 while (!EMPTY()) {
2307 v = POP();
2308 Py_XDECREF(v);
2309 }
2310 }
2311
Tim Peters5ca576e2001-06-18 22:08:13 +00002312 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002313 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002314
Fred Drake9e3ad782001-07-03 23:39:52 +00002315 if (tstate->use_tracing) {
2316 if (tstate->c_tracefunc
2317 && (why == WHY_RETURN || why == WHY_YIELD)) {
2318 if (call_trace(tstate->c_tracefunc,
2319 tstate->c_traceobj, f,
2320 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002322 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002323 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002324 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002325 }
Fred Drake8f51f542001-10-04 14:48:42 +00002326 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002327 if (why == WHY_EXCEPTION)
2328 call_trace_protected(tstate->c_profilefunc,
2329 tstate->c_profileobj, f,
2330 PyTrace_RETURN);
2331 else if (call_trace(tstate->c_profilefunc,
2332 tstate->c_profileobj, f,
2333 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002334 Py_XDECREF(retval);
2335 retval = NULL;
2336 why = WHY_EXCEPTION;
2337 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002338 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002339 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002340
Guido van Rossuma027efa1997-05-05 20:56:21 +00002341 reset_exc_info(tstate);
2342
Tim Peters5ca576e2001-06-18 22:08:13 +00002343 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002344 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002345 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002346
Guido van Rossum96a42c81992-01-12 02:29:51 +00002347 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002348}
2349
Tim Peters6d6c1a32001-08-02 04:15:00 +00002350PyObject *
2351PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002352 PyObject **args, int argcount, PyObject **kws, int kwcount,
2353 PyObject **defs, int defcount, PyObject *closure)
2354{
2355 register PyFrameObject *f;
2356 register PyObject *retval = NULL;
2357 register PyObject **fastlocals, **freevars;
2358 PyThreadState *tstate = PyThreadState_GET();
2359 PyObject *x, *u;
2360
2361 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002362 PyErr_SetString(PyExc_SystemError,
2363 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002364 return NULL;
2365 }
2366
2367 f = PyFrame_New(tstate, /*back*/
2368 co, /*code*/
2369 globals, locals);
2370 if (f == NULL)
2371 return NULL;
2372
2373 fastlocals = f->f_localsplus;
2374 freevars = f->f_localsplus + f->f_nlocals;
2375
2376 if (co->co_argcount > 0 ||
2377 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2378 int i;
2379 int n = argcount;
2380 PyObject *kwdict = NULL;
2381 if (co->co_flags & CO_VARKEYWORDS) {
2382 kwdict = PyDict_New();
2383 if (kwdict == NULL)
2384 goto fail;
2385 i = co->co_argcount;
2386 if (co->co_flags & CO_VARARGS)
2387 i++;
2388 SETLOCAL(i, kwdict);
2389 }
2390 if (argcount > co->co_argcount) {
2391 if (!(co->co_flags & CO_VARARGS)) {
2392 PyErr_Format(PyExc_TypeError,
2393 "%.200s() takes %s %d "
2394 "%sargument%s (%d given)",
2395 PyString_AsString(co->co_name),
2396 defcount ? "at most" : "exactly",
2397 co->co_argcount,
2398 kwcount ? "non-keyword " : "",
2399 co->co_argcount == 1 ? "" : "s",
2400 argcount);
2401 goto fail;
2402 }
2403 n = co->co_argcount;
2404 }
2405 for (i = 0; i < n; i++) {
2406 x = args[i];
2407 Py_INCREF(x);
2408 SETLOCAL(i, x);
2409 }
2410 if (co->co_flags & CO_VARARGS) {
2411 u = PyTuple_New(argcount - n);
2412 if (u == NULL)
2413 goto fail;
2414 SETLOCAL(co->co_argcount, u);
2415 for (i = n; i < argcount; i++) {
2416 x = args[i];
2417 Py_INCREF(x);
2418 PyTuple_SET_ITEM(u, i-n, x);
2419 }
2420 }
2421 for (i = 0; i < kwcount; i++) {
2422 PyObject *keyword = kws[2*i];
2423 PyObject *value = kws[2*i + 1];
2424 int j;
2425 if (keyword == NULL || !PyString_Check(keyword)) {
2426 PyErr_Format(PyExc_TypeError,
2427 "%.200s() keywords must be strings",
2428 PyString_AsString(co->co_name));
2429 goto fail;
2430 }
2431 /* XXX slow -- speed up using dictionary? */
2432 for (j = 0; j < co->co_argcount; j++) {
2433 PyObject *nm = PyTuple_GET_ITEM(
2434 co->co_varnames, j);
2435 int cmp = PyObject_RichCompareBool(
2436 keyword, nm, Py_EQ);
2437 if (cmp > 0)
2438 break;
2439 else if (cmp < 0)
2440 goto fail;
2441 }
2442 /* Check errors from Compare */
2443 if (PyErr_Occurred())
2444 goto fail;
2445 if (j >= co->co_argcount) {
2446 if (kwdict == NULL) {
2447 PyErr_Format(PyExc_TypeError,
2448 "%.200s() got an unexpected "
2449 "keyword argument '%.400s'",
2450 PyString_AsString(co->co_name),
2451 PyString_AsString(keyword));
2452 goto fail;
2453 }
2454 PyDict_SetItem(kwdict, keyword, value);
2455 }
2456 else {
2457 if (GETLOCAL(j) != NULL) {
2458 PyErr_Format(PyExc_TypeError,
2459 "%.200s() got multiple "
2460 "values for keyword "
2461 "argument '%.400s'",
2462 PyString_AsString(co->co_name),
2463 PyString_AsString(keyword));
2464 goto fail;
2465 }
2466 Py_INCREF(value);
2467 SETLOCAL(j, value);
2468 }
2469 }
2470 if (argcount < co->co_argcount) {
2471 int m = co->co_argcount - defcount;
2472 for (i = argcount; i < m; i++) {
2473 if (GETLOCAL(i) == NULL) {
2474 PyErr_Format(PyExc_TypeError,
2475 "%.200s() takes %s %d "
2476 "%sargument%s (%d given)",
2477 PyString_AsString(co->co_name),
2478 ((co->co_flags & CO_VARARGS) ||
2479 defcount) ? "at least"
2480 : "exactly",
2481 m, kwcount ? "non-keyword " : "",
2482 m == 1 ? "" : "s", i);
2483 goto fail;
2484 }
2485 }
2486 if (n > m)
2487 i = n - m;
2488 else
2489 i = 0;
2490 for (; i < defcount; i++) {
2491 if (GETLOCAL(m+i) == NULL) {
2492 PyObject *def = defs[i];
2493 Py_INCREF(def);
2494 SETLOCAL(m+i, def);
2495 }
2496 }
2497 }
2498 }
2499 else {
2500 if (argcount > 0 || kwcount > 0) {
2501 PyErr_Format(PyExc_TypeError,
2502 "%.200s() takes no arguments (%d given)",
2503 PyString_AsString(co->co_name),
2504 argcount + kwcount);
2505 goto fail;
2506 }
2507 }
2508 /* Allocate and initialize storage for cell vars, and copy free
2509 vars into frame. This isn't too efficient right now. */
2510 if (f->f_ncells) {
2511 int i = 0, j = 0, nargs, found;
2512 char *cellname, *argname;
2513 PyObject *c;
2514
2515 nargs = co->co_argcount;
2516 if (co->co_flags & CO_VARARGS)
2517 nargs++;
2518 if (co->co_flags & CO_VARKEYWORDS)
2519 nargs++;
2520
2521 /* Check for cells that shadow args */
2522 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2523 cellname = PyString_AS_STRING(
2524 PyTuple_GET_ITEM(co->co_cellvars, i));
2525 found = 0;
2526 while (j < nargs) {
2527 argname = PyString_AS_STRING(
2528 PyTuple_GET_ITEM(co->co_varnames, j));
2529 if (strcmp(cellname, argname) == 0) {
2530 c = PyCell_New(GETLOCAL(j));
2531 if (c == NULL)
2532 goto fail;
2533 GETLOCAL(f->f_nlocals + i) = c;
2534 found = 1;
2535 break;
2536 }
2537 j++;
2538 }
2539 if (found == 0) {
2540 c = PyCell_New(NULL);
2541 if (c == NULL)
2542 goto fail;
2543 SETLOCAL(f->f_nlocals + i, c);
2544 }
2545 }
2546 /* Initialize any that are left */
2547 while (i < f->f_ncells) {
2548 c = PyCell_New(NULL);
2549 if (c == NULL)
2550 goto fail;
2551 SETLOCAL(f->f_nlocals + i, c);
2552 i++;
2553 }
2554 }
2555 if (f->f_nfreevars) {
2556 int i;
2557 for (i = 0; i < f->f_nfreevars; ++i) {
2558 PyObject *o = PyTuple_GET_ITEM(closure, i);
2559 Py_INCREF(o);
2560 freevars[f->f_ncells + i] = o;
2561 }
2562 }
2563
Tim Peters5ca576e2001-06-18 22:08:13 +00002564 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002565 /* Don't need to keep the reference to f_back, it will be set
2566 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002567 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002568 f->f_back = NULL;
2569
2570 /* Create a new generator that owns the ready to run frame
2571 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002572 return gen_new(f);
2573 }
2574
2575 retval = eval_frame(f);
2576
2577 fail: /* Jump here from prelude on failure */
2578
Tim Petersb13680b2001-11-27 23:29:29 +00002579 /* decref'ing the frame can cause __del__ methods to get invoked,
2580 which can call back into Python. While we're done with the
2581 current Python frame (f), the associated C stack is still in use,
2582 so recursion_depth must be boosted for the duration.
2583 */
2584 assert(tstate != NULL);
2585 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002586 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002587 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002588 return retval;
2589}
2590
2591
Guido van Rossuma027efa1997-05-05 20:56:21 +00002592static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002593set_exc_info(PyThreadState *tstate,
2594 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002595{
2596 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002597 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002598
Guido van Rossuma027efa1997-05-05 20:56:21 +00002599 frame = tstate->frame;
2600 if (frame->f_exc_type == NULL) {
2601 /* This frame didn't catch an exception before */
2602 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002603 if (tstate->exc_type == NULL) {
2604 Py_INCREF(Py_None);
2605 tstate->exc_type = Py_None;
2606 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002607 tmp_type = frame->f_exc_type;
2608 tmp_value = frame->f_exc_value;
2609 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002610 Py_XINCREF(tstate->exc_type);
2611 Py_XINCREF(tstate->exc_value);
2612 Py_XINCREF(tstate->exc_traceback);
2613 frame->f_exc_type = tstate->exc_type;
2614 frame->f_exc_value = tstate->exc_value;
2615 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002616 Py_XDECREF(tmp_type);
2617 Py_XDECREF(tmp_value);
2618 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002619 }
2620 /* Set new exception for this thread */
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(type);
2625 Py_XINCREF(value);
2626 Py_XINCREF(tb);
2627 tstate->exc_type = type;
2628 tstate->exc_value = value;
2629 tstate->exc_traceback = tb;
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", type);
2635 PySys_SetObject("exc_value", value);
2636 PySys_SetObject("exc_traceback", tb);
2637}
2638
2639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002640reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002641{
2642 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002643 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002644 frame = tstate->frame;
2645 if (frame->f_exc_type != NULL) {
2646 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002647 tmp_type = tstate->exc_type;
2648 tmp_value = tstate->exc_value;
2649 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002650 Py_XINCREF(frame->f_exc_type);
2651 Py_XINCREF(frame->f_exc_value);
2652 Py_XINCREF(frame->f_exc_traceback);
2653 tstate->exc_type = frame->f_exc_type;
2654 tstate->exc_value = frame->f_exc_value;
2655 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002656 Py_XDECREF(tmp_type);
2657 Py_XDECREF(tmp_value);
2658 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002659 /* For b/w compatibility */
2660 PySys_SetObject("exc_type", frame->f_exc_type);
2661 PySys_SetObject("exc_value", frame->f_exc_value);
2662 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2663 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002664 tmp_type = frame->f_exc_type;
2665 tmp_value = frame->f_exc_value;
2666 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002667 frame->f_exc_type = NULL;
2668 frame->f_exc_value = NULL;
2669 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002670 Py_XDECREF(tmp_type);
2671 Py_XDECREF(tmp_value);
2672 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002673}
2674
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002675/* Logic for the raise statement (too complicated for inlining).
2676 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002677static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002678do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002679{
Guido van Rossumd295f121998-04-09 21:39:57 +00002680 if (type == NULL) {
2681 /* Reraise */
2682 PyThreadState *tstate = PyThreadState_Get();
2683 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2684 value = tstate->exc_value;
2685 tb = tstate->exc_traceback;
2686 Py_XINCREF(type);
2687 Py_XINCREF(value);
2688 Py_XINCREF(tb);
2689 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002690
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002691 /* We support the following forms of raise:
2692 raise <class>, <classinstance>
2693 raise <class>, <argument tuple>
2694 raise <class>, None
2695 raise <class>, <argument>
2696 raise <classinstance>, None
2697 raise <string>, <object>
2698 raise <string>, None
2699
2700 An omitted second argument is the same as None.
2701
2702 In addition, raise <tuple>, <anything> is the same as
2703 raising the tuple's first item (and it better have one!);
2704 this rule is applied recursively.
2705
2706 Finally, an optional third argument can be supplied, which
2707 gives the traceback to be substituted (useful when
2708 re-raising an exception after examining it). */
2709
2710 /* First, check the traceback argument, replacing None with
2711 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 if (tb == Py_None) {
2713 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002714 tb = NULL;
2715 }
2716 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002718 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002719 goto raise_error;
2720 }
2721
2722 /* Next, replace a missing value with None */
2723 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 value = Py_None;
2725 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002726 }
2727
2728 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2730 PyObject *tmp = type;
2731 type = PyTuple_GET_ITEM(type, 0);
2732 Py_INCREF(type);
2733 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002734 }
2735
Barry Warsaw4249f541997-08-22 21:26:19 +00002736 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002737 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002738
2739 else if (PyClass_Check(type))
2740 PyErr_NormalizeException(&type, &value, &tb);
2741
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002743 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 if (value != Py_None) {
2745 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002746 "instance exception may not have a separate value");
2747 goto raise_error;
2748 }
2749 else {
2750 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002752 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002753 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2754 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002755 }
2756 }
2757 else {
2758 /* Not something you can raise. You get an exception
2759 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002760 PyErr_Format(PyExc_TypeError,
2761 "exceptions must be strings, classes, or "
2762 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002763 goto raise_error;
2764 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002766 if (tb == NULL)
2767 return WHY_EXCEPTION;
2768 else
2769 return WHY_RERAISE;
2770 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 Py_XDECREF(value);
2772 Py_XDECREF(type);
2773 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002774 return WHY_EXCEPTION;
2775}
2776
Tim Petersd6d010b2001-06-21 02:49:55 +00002777/* Iterate v argcnt times and store the results on the stack (via decreasing
2778 sp). Return 1 for success, 0 if error. */
2779
Barry Warsawe42b18f1997-08-25 22:13:04 +00002780static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002781unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002782{
Tim Petersd6d010b2001-06-21 02:49:55 +00002783 int i = 0;
2784 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002785 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002786
Tim Petersd6d010b2001-06-21 02:49:55 +00002787 assert(v != NULL);
2788
2789 it = PyObject_GetIter(v);
2790 if (it == NULL)
2791 goto Error;
2792
2793 for (; i < argcnt; i++) {
2794 w = PyIter_Next(it);
2795 if (w == NULL) {
2796 /* Iterator done, via error or exhaustion. */
2797 if (!PyErr_Occurred()) {
2798 PyErr_Format(PyExc_ValueError,
2799 "need more than %d value%s to unpack",
2800 i, i == 1 ? "" : "s");
2801 }
2802 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002803 }
2804 *--sp = w;
2805 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002806
2807 /* We better have exhausted the iterator now. */
2808 w = PyIter_Next(it);
2809 if (w == NULL) {
2810 if (PyErr_Occurred())
2811 goto Error;
2812 Py_DECREF(it);
2813 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002814 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002815 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002816 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002817 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002818Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002819 for (; i > 0; i--, sp++)
2820 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002821 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002822 return 0;
2823}
2824
2825
Guido van Rossum96a42c81992-01-12 02:29:51 +00002826#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002827static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002828prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002830 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 if (PyObject_Print(v, stdout, 0) != 0)
2832 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002833 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002834 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002836#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002838static void
Fred Drake5755ce62001-06-27 19:19:46 +00002839call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002840{
Guido van Rossumb209a111997-04-29 18:18:01 +00002841 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002842 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002843 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002844 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002845 value = Py_None;
2846 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002847 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002848 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002849 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002850 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002851 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002852 }
Fred Drake5755ce62001-06-27 19:19:46 +00002853 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002854 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002855 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002856 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002857 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002858 Py_XDECREF(type);
2859 Py_XDECREF(value);
2860 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002861 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002862}
2863
Fred Drake4ec5d562001-10-04 19:26:43 +00002864static void
2865call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2866 int what)
2867{
2868 PyObject *type, *value, *traceback;
2869 int err;
2870 PyErr_Fetch(&type, &value, &traceback);
2871 err = call_trace(func, obj, frame, what, NULL);
2872 if (err == 0)
2873 PyErr_Restore(type, value, traceback);
2874 else {
2875 Py_XDECREF(type);
2876 Py_XDECREF(value);
2877 Py_XDECREF(traceback);
2878 }
2879}
2880
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002881static int
Fred Drake5755ce62001-06-27 19:19:46 +00002882call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2883 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002884{
Fred Drake5755ce62001-06-27 19:19:46 +00002885 register PyThreadState *tstate = frame->f_tstate;
2886 int result;
2887 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002888 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002889 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002890 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002891 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002892 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2893 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002894 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002895 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002896}
2897
Fred Drake5755ce62001-06-27 19:19:46 +00002898void
2899PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002900{
Fred Drake5755ce62001-06-27 19:19:46 +00002901 PyThreadState *tstate = PyThreadState_Get();
2902 PyObject *temp = tstate->c_profileobj;
2903 Py_XINCREF(arg);
2904 tstate->c_profilefunc = NULL;
2905 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002906 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002907 Py_XDECREF(temp);
2908 tstate->c_profilefunc = func;
2909 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002910 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002911}
2912
2913void
2914PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2915{
2916 PyThreadState *tstate = PyThreadState_Get();
2917 PyObject *temp = tstate->c_traceobj;
2918 Py_XINCREF(arg);
2919 tstate->c_tracefunc = NULL;
2920 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002921 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002922 Py_XDECREF(temp);
2923 tstate->c_tracefunc = func;
2924 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002925 tstate->use_tracing = ((func != NULL)
2926 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002927}
2928
Guido van Rossumb209a111997-04-29 18:18:01 +00002929PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002930PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002931{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002932 PyThreadState *tstate = PyThreadState_Get();
2933 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002934 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002935 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002936 else
2937 return current_frame->f_builtins;
2938}
2939
Guido van Rossumb209a111997-04-29 18:18:01 +00002940PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002941PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002942{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002943 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002944 if (current_frame == NULL)
2945 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002946 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002947 return current_frame->f_locals;
2948}
2949
Guido van Rossumb209a111997-04-29 18:18:01 +00002950PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002951PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002953 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002954 if (current_frame == NULL)
2955 return NULL;
2956 else
2957 return current_frame->f_globals;
2958}
2959
Guido van Rossumb209a111997-04-29 18:18:01 +00002960PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002961PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002962{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002963 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002964 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002965}
2966
Guido van Rossum6135a871995-01-09 17:53:26 +00002967int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002968PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002969{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002970 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002971 return current_frame == NULL ? 0 : current_frame->f_restricted;
2972}
2973
Guido van Rossumbe270261997-05-22 22:26:18 +00002974int
Tim Peters5ba58662001-07-16 02:29:45 +00002975PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002976{
2977 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002978 int result = 0;
2979
2980 if (current_frame != NULL) {
2981 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002982 const int compilerflags = codeflags & PyCF_MASK;
2983 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002984 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002985 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002986 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002987#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002988 if (codeflags & CO_GENERATOR_ALLOWED) {
2989 result = 1;
2990 cf->cf_flags |= CO_GENERATOR_ALLOWED;
2991 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002992#endif
Tim Peters5ba58662001-07-16 02:29:45 +00002993 }
2994 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002995}
2996
2997int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002998Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002999{
Guido van Rossumb209a111997-04-29 18:18:01 +00003000 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003001 if (f == NULL)
3002 return 0;
3003 if (!PyFile_SoftSpace(f, 0))
3004 return 0;
3005 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006}
3007
Guido van Rossum3f5da241990-12-20 15:06:42 +00003008
Guido van Rossum681d79a1995-07-18 14:51:37 +00003009/* External interface to call any callable object.
3010 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003011
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003012#undef PyEval_CallObject
3013/* for backward compatibility: export this interface */
3014
Guido van Rossumb209a111997-04-29 18:18:01 +00003015PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003016PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003017{
Guido van Rossumb209a111997-04-29 18:18:01 +00003018 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003019}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003020#define PyEval_CallObject(func,arg) \
3021 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003022
Guido van Rossumb209a111997-04-29 18:18:01 +00003023PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003024PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003025{
Jeremy Hylton52820442001-01-03 23:52:36 +00003026 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003027
3028 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003029 arg = PyTuple_New(0);
3030 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003031 PyErr_SetString(PyExc_TypeError,
3032 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033 return NULL;
3034 }
3035 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003036 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003037
Guido van Rossumb209a111997-04-29 18:18:01 +00003038 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003039 PyErr_SetString(PyExc_TypeError,
3040 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003041 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003042 return NULL;
3043 }
3044
Tim Peters6d6c1a32001-08-02 04:15:00 +00003045 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003046 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003047 return result;
3048}
3049
Tim Peters6d6c1a32001-08-02 04:15:00 +00003050char *
3051PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003052{
3053 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003054 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003055 else if (PyFunction_Check(func))
3056 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3057 else if (PyCFunction_Check(func))
3058 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3059 else if (PyClass_Check(func))
3060 return PyString_AsString(((PyClassObject*)func)->cl_name);
3061 else if (PyInstance_Check(func)) {
3062 return PyString_AsString(
3063 ((PyInstanceObject*)func)->in_class->cl_name);
3064 } else {
3065 return func->ob_type->tp_name;
3066 }
3067}
3068
Tim Peters6d6c1a32001-08-02 04:15:00 +00003069char *
3070PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003071{
3072 if (PyMethod_Check(func))
3073 return "()";
3074 else if (PyFunction_Check(func))
3075 return "()";
3076 else if (PyCFunction_Check(func))
3077 return "()";
3078 else if (PyClass_Check(func))
3079 return " constructor";
3080 else if (PyInstance_Check(func)) {
3081 return " instance";
3082 } else {
3083 return " object";
3084 }
3085}
3086
Jeremy Hylton52820442001-01-03 23:52:36 +00003087#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3088
3089/* The two fast_xxx() functions optimize calls for which no argument
3090 tuple is necessary; the objects are passed directly from the stack.
3091 fast_cfunction() is called for METH_OLDARGS functions.
3092 fast_function() is for functions with no special argument handling.
3093*/
3094
3095static PyObject *
3096fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3097{
3098 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3099 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003100 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003101
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003102 switch (flags) {
3103 case METH_OLDARGS:
3104 if (na == 0)
3105 return (*meth)(self, NULL);
3106 else if (na == 1) {
3107 PyObject *arg = EXT_POP(*pp_stack);
3108 PyObject *result = (*meth)(self, arg);
3109 Py_DECREF(arg);
3110 return result;
3111 } else {
3112 PyObject *args = load_args(pp_stack, na);
3113 PyObject *result = (*meth)(self, args);
3114 Py_DECREF(args);
3115 return result;
3116 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003117 case METH_NOARGS:
3118 if (na == 0)
3119 return (*meth)(self, NULL);
3120 PyErr_Format(PyExc_TypeError,
3121 "%.200s() takes no arguments (%d given)",
3122 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3123 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003124 case METH_O:
3125 if (na == 1) {
3126 PyObject *arg = EXT_POP(*pp_stack);
3127 PyObject *result = (*meth)(self, arg);
3128 Py_DECREF(arg);
3129 return result;
3130 }
3131 PyErr_Format(PyExc_TypeError,
3132 "%.200s() takes exactly one argument (%d given)",
3133 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3134 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003135 default:
3136 fprintf(stderr, "%.200s() flags = %d\n",
3137 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3138 PyErr_BadInternalCall();
3139 return NULL;
3140 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003141}
3142
3143static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003144fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003145{
3146 PyObject *co = PyFunction_GET_CODE(func);
3147 PyObject *globals = PyFunction_GET_GLOBALS(func);
3148 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003149 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003150 PyObject **d = NULL;
3151 int nd = 0;
3152
3153 if (argdefs != NULL) {
3154 d = &PyTuple_GET_ITEM(argdefs, 0);
3155 nd = ((PyTupleObject *)argdefs)->ob_size;
3156 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003157 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003158 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003159 (*pp_stack)-2*nk, nk, d, nd,
3160 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003161}
3162
3163static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003164update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3165 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003166{
3167 PyObject *kwdict = NULL;
3168 if (orig_kwdict == NULL)
3169 kwdict = PyDict_New();
3170 else {
3171 kwdict = PyDict_Copy(orig_kwdict);
3172 Py_DECREF(orig_kwdict);
3173 }
3174 if (kwdict == NULL)
3175 return NULL;
3176 while (--nk >= 0) {
3177 int err;
3178 PyObject *value = EXT_POP(*pp_stack);
3179 PyObject *key = EXT_POP(*pp_stack);
3180 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003181 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003182 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003183 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003184 PyEval_GetFuncName(func),
3185 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003186 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003187 Py_DECREF(key);
3188 Py_DECREF(value);
3189 Py_DECREF(kwdict);
3190 return NULL;
3191 }
3192 err = PyDict_SetItem(kwdict, key, value);
3193 Py_DECREF(key);
3194 Py_DECREF(value);
3195 if (err) {
3196 Py_DECREF(kwdict);
3197 return NULL;
3198 }
3199 }
3200 return kwdict;
3201}
3202
3203static PyObject *
3204update_star_args(int nstack, int nstar, PyObject *stararg,
3205 PyObject ***pp_stack)
3206{
3207 PyObject *callargs, *w;
3208
3209 callargs = PyTuple_New(nstack + nstar);
3210 if (callargs == NULL) {
3211 return NULL;
3212 }
3213 if (nstar) {
3214 int i;
3215 for (i = 0; i < nstar; i++) {
3216 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3217 Py_INCREF(a);
3218 PyTuple_SET_ITEM(callargs, nstack + i, a);
3219 }
3220 }
3221 while (--nstack >= 0) {
3222 w = EXT_POP(*pp_stack);
3223 PyTuple_SET_ITEM(callargs, nstack, w);
3224 }
3225 return callargs;
3226}
3227
3228static PyObject *
3229load_args(PyObject ***pp_stack, int na)
3230{
3231 PyObject *args = PyTuple_New(na);
3232 PyObject *w;
3233
3234 if (args == NULL)
3235 return NULL;
3236 while (--na >= 0) {
3237 w = EXT_POP(*pp_stack);
3238 PyTuple_SET_ITEM(args, na, w);
3239 }
3240 return args;
3241}
3242
3243static PyObject *
3244do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3245{
3246 PyObject *callargs = NULL;
3247 PyObject *kwdict = NULL;
3248 PyObject *result = NULL;
3249
3250 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003251 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003252 if (kwdict == NULL)
3253 goto call_fail;
3254 }
3255 callargs = load_args(pp_stack, na);
3256 if (callargs == NULL)
3257 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003258 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003259 call_fail:
3260 Py_XDECREF(callargs);
3261 Py_XDECREF(kwdict);
3262 return result;
3263}
3264
3265static PyObject *
3266ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3267{
3268 int nstar = 0;
3269 PyObject *callargs = NULL;
3270 PyObject *stararg = NULL;
3271 PyObject *kwdict = NULL;
3272 PyObject *result = NULL;
3273
3274 if (flags & CALL_FLAG_KW) {
3275 kwdict = EXT_POP(*pp_stack);
3276 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003277 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003278 "%s%s argument after ** "
3279 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003280 PyEval_GetFuncName(func),
3281 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003282 goto ext_call_fail;
3283 }
3284 }
3285 if (flags & CALL_FLAG_VAR) {
3286 stararg = EXT_POP(*pp_stack);
3287 if (!PyTuple_Check(stararg)) {
3288 PyObject *t = NULL;
3289 t = PySequence_Tuple(stararg);
3290 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003291 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3292 PyErr_Format(PyExc_TypeError,
3293 "%s%s argument after * "
3294 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003295 PyEval_GetFuncName(func),
3296 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003297 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003298 goto ext_call_fail;
3299 }
3300 Py_DECREF(stararg);
3301 stararg = t;
3302 }
3303 nstar = PyTuple_GET_SIZE(stararg);
3304 }
3305 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003306 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003307 if (kwdict == NULL)
3308 goto ext_call_fail;
3309 }
3310 callargs = update_star_args(na, nstar, stararg, pp_stack);
3311 if (callargs == NULL)
3312 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003313 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003314 ext_call_fail:
3315 Py_XDECREF(callargs);
3316 Py_XDECREF(kwdict);
3317 Py_XDECREF(stararg);
3318 return result;
3319}
3320
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003321#define SLICE_ERROR_MSG \
3322 "standard sequence type does not support step size other than one"
3323
Guido van Rossumb209a111997-04-29 18:18:01 +00003324static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003325loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326{
Guido van Rossumb209a111997-04-29 18:18:01 +00003327 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003328 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003329 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003330 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 return NULL;
3332 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003333 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003334 v = (*sq->sq_item)(v, i);
3335 if (v)
3336 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003337 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003338 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003339 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340}
3341
Tim Peterscb479e72001-12-16 19:11:44 +00003342/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3343 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3344 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3345*/
Tim Petersb5196382001-12-16 19:44:20 +00003346/* Note: If v is NULL, return success without storing into *pi. This
3347 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3348 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003349*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003350int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003351_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352{
Tim Petersb5196382001-12-16 19:44:20 +00003353 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003354 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003355 if (PyInt_Check(v)) {
3356 x = PyInt_AsLong(v);
3357 } else if (PyLong_Check(v)) {
3358 x = PyLong_AsLong(v);
3359 if (x==-1 && PyErr_Occurred()) {
3360 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003361 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003362
Guido van Rossumac7be682001-01-17 15:42:30 +00003363 if (!PyErr_ExceptionMatches(
3364 PyExc_OverflowError)) {
3365 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003366 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003367 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003368 }
3369
Guido van Rossumac7be682001-01-17 15:42:30 +00003370 /* Clear the OverflowError */
3371 PyErr_Clear();
3372
3373 /* It's an overflow error, so we need to
3374 check the sign of the long integer,
3375 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003376 the error. */
3377
3378 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003379 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003380 if (long_zero == NULL)
3381 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003382
3383 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003384 cmp = PyObject_RichCompareBool(v, long_zero,
3385 Py_GT);
3386 Py_DECREF(long_zero);
3387 if (cmp < 0)
3388 return 0;
3389 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003390 x = INT_MAX;
3391 else
3392 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003393 }
3394 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003395 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003396 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003397 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003399 /* Truncate -- very long indices are truncated anyway */
3400 if (x > INT_MAX)
3401 x = INT_MAX;
3402 else if (x < -INT_MAX)
3403 x = 0;
3404 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003406 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407}
3408
Guido van Rossum50d756e2001-08-18 17:43:36 +00003409#undef ISINT
3410#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3411
Guido van Rossumb209a111997-04-29 18:18:01 +00003412static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003413apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003415 PyTypeObject *tp = u->ob_type;
3416 PySequenceMethods *sq = tp->tp_as_sequence;
3417
3418 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3419 int ilow = 0, ihigh = INT_MAX;
3420 if (!_PyEval_SliceIndex(v, &ilow))
3421 return NULL;
3422 if (!_PyEval_SliceIndex(w, &ihigh))
3423 return NULL;
3424 return PySequence_GetSlice(u, ilow, ihigh);
3425 }
3426 else {
3427 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003428 if (slice != NULL) {
3429 PyObject *res = PyObject_GetItem(u, slice);
3430 Py_DECREF(slice);
3431 return res;
3432 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003433 else
3434 return NULL;
3435 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003436}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003437
3438static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003439assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3440 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003442 PyTypeObject *tp = u->ob_type;
3443 PySequenceMethods *sq = tp->tp_as_sequence;
3444
3445 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3446 int ilow = 0, ihigh = INT_MAX;
3447 if (!_PyEval_SliceIndex(v, &ilow))
3448 return -1;
3449 if (!_PyEval_SliceIndex(w, &ihigh))
3450 return -1;
3451 if (x == NULL)
3452 return PySequence_DelSlice(u, ilow, ihigh);
3453 else
3454 return PySequence_SetSlice(u, ilow, ihigh, x);
3455 }
3456 else {
3457 PyObject *slice = PySlice_New(v, w, NULL);
3458 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003459 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003460 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003461 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003462 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003463 res = PyObject_DelItem(u, slice);
3464 Py_DECREF(slice);
3465 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003466 }
3467 else
3468 return -1;
3469 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003470}
3471
Guido van Rossumb209a111997-04-29 18:18:01 +00003472static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003473cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474{
Guido van Rossumac7be682001-01-17 15:42:30 +00003475 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003476 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003477 case PyCmp_IS:
3478 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003479 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003480 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003481 res = !res;
3482 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003483 case PyCmp_IN:
3484 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003485 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003486 if (res < 0)
3487 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003488 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003489 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003491 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003492 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493 break;
3494 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003495 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003497 v = res ? Py_True : Py_False;
3498 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499 return v;
3500}
3501
Thomas Wouters52152252000-08-17 22:55:00 +00003502static PyObject *
3503import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003504{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003505 PyObject *x;
3506
3507 x = PyObject_GetAttr(v, name);
3508 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003509 PyErr_Format(PyExc_ImportError,
3510 "cannot import name %.230s",
3511 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003512 }
Thomas Wouters52152252000-08-17 22:55:00 +00003513 return x;
3514}
Guido van Rossumac7be682001-01-17 15:42:30 +00003515
Thomas Wouters52152252000-08-17 22:55:00 +00003516static int
3517import_all_from(PyObject *locals, PyObject *v)
3518{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003519 PyObject *all = PyObject_GetAttrString(v, "__all__");
3520 PyObject *dict, *name, *value;
3521 int skip_leading_underscores = 0;
3522 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003523
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003524 if (all == NULL) {
3525 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3526 return -1; /* Unexpected error */
3527 PyErr_Clear();
3528 dict = PyObject_GetAttrString(v, "__dict__");
3529 if (dict == NULL) {
3530 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3531 return -1;
3532 PyErr_SetString(PyExc_ImportError,
3533 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003534 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003535 }
3536 all = PyMapping_Keys(dict);
3537 Py_DECREF(dict);
3538 if (all == NULL)
3539 return -1;
3540 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003541 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003542
3543 for (pos = 0, err = 0; ; pos++) {
3544 name = PySequence_GetItem(all, pos);
3545 if (name == NULL) {
3546 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3547 err = -1;
3548 else
3549 PyErr_Clear();
3550 break;
3551 }
3552 if (skip_leading_underscores &&
3553 PyString_Check(name) &&
3554 PyString_AS_STRING(name)[0] == '_')
3555 {
3556 Py_DECREF(name);
3557 continue;
3558 }
3559 value = PyObject_GetAttr(v, name);
3560 if (value == NULL)
3561 err = -1;
3562 else
3563 err = PyDict_SetItem(locals, name, value);
3564 Py_DECREF(name);
3565 Py_XDECREF(value);
3566 if (err != 0)
3567 break;
3568 }
3569 Py_DECREF(all);
3570 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003571}
3572
Guido van Rossumb209a111997-04-29 18:18:01 +00003573static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003574build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003575{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003576 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003577
3578 if (PyDict_Check(methods))
3579 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003580 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003581 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003582 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3583 base = PyTuple_GET_ITEM(bases, 0);
3584 metaclass = PyObject_GetAttrString(base, "__class__");
3585 if (metaclass == NULL) {
3586 PyErr_Clear();
3587 metaclass = (PyObject *)base->ob_type;
3588 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003589 }
3590 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003591 else {
3592 PyObject *g = PyEval_GetGlobals();
3593 if (g != NULL && PyDict_Check(g))
3594 metaclass = PyDict_GetItemString(g, "__metaclass__");
3595 if (metaclass == NULL)
3596 metaclass = (PyObject *) &PyClass_Type;
3597 Py_INCREF(metaclass);
3598 }
3599 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3600 Py_DECREF(metaclass);
3601 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003602}
3603
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003604static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003605exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3606 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003607{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003608 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003609 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003610 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003611
Guido van Rossumb209a111997-04-29 18:18:01 +00003612 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3613 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003614 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003615 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003616 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003617 locals = PyTuple_GetItem(prog, 2);
3618 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003620 if (globals == Py_None) {
3621 globals = PyEval_GetGlobals();
3622 if (locals == Py_None) {
3623 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003624 plain = 1;
3625 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003626 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003627 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003628 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003629 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003630 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003631 !PyCode_Check(prog) &&
3632 !PyFile_Check(prog)) {
3633 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003634 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003635 return -1;
3636 }
Fred Drake661ea262000-10-24 19:57:45 +00003637 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003638 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003639 "exec: arg 2 must be a dictionary or None");
3640 return -1;
3641 }
3642 if (!PyDict_Check(locals)) {
3643 PyErr_SetString(PyExc_TypeError,
3644 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003645 return -1;
3646 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003647 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003648 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003649 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003650 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3651 PyErr_SetString(PyExc_TypeError,
3652 "code object passed to exec may not contain free variables");
3653 return -1;
3654 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003655 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003656 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003657 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003658 FILE *fp = PyFile_AsFile(prog);
3659 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003660 PyCompilerFlags cf;
3661 cf.cf_flags = 0;
3662 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003663 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3664 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003665 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003666 v = PyRun_File(fp, name, Py_file_input, globals,
3667 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003668 }
3669 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003670 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003671 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003672 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003673 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003674 cf.cf_flags = 0;
3675 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003676 v = PyRun_StringFlags(str, Py_file_input, globals,
3677 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003678 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003679 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003680 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003681 if (plain)
3682 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003683 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003684 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003685 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003686 return 0;
3687}
Guido van Rossum24c13741995-02-14 09:42:43 +00003688
Guido van Rossumac7be682001-01-17 15:42:30 +00003689static void
Paul Prescode68140d2000-08-30 20:25:01 +00003690format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3691{
3692 char *obj_str;
3693
3694 if (!obj)
3695 return;
3696
3697 obj_str = PyString_AsString(obj);
3698 if (!obj_str)
3699 return;
3700
3701 PyErr_Format(exc, format_str, obj_str);
3702}
Guido van Rossum950361c1997-01-24 13:49:28 +00003703
3704#ifdef DYNAMIC_EXECUTION_PROFILE
3705
Skip Montanarof118cb12001-10-15 20:51:38 +00003706static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003707getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003708{
3709 int i;
3710 PyObject *l = PyList_New(256);
3711 if (l == NULL) return NULL;
3712 for (i = 0; i < 256; i++) {
3713 PyObject *x = PyInt_FromLong(a[i]);
3714 if (x == NULL) {
3715 Py_DECREF(l);
3716 return NULL;
3717 }
3718 PyList_SetItem(l, i, x);
3719 }
3720 for (i = 0; i < 256; i++)
3721 a[i] = 0;
3722 return l;
3723}
3724
3725PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003726_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003727{
3728#ifndef DXPAIRS
3729 return getarray(dxp);
3730#else
3731 int i;
3732 PyObject *l = PyList_New(257);
3733 if (l == NULL) return NULL;
3734 for (i = 0; i < 257; i++) {
3735 PyObject *x = getarray(dxpairs[i]);
3736 if (x == NULL) {
3737 Py_DECREF(l);
3738 return NULL;
3739 }
3740 PyList_SetItem(l, i, x);
3741 }
3742 return l;
3743#endif
3744}
3745
3746#endif