blob: 94cf17e0d4580c9328ffbc3604ebfbb68ec6ee61 [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{
103 genobject *gen = PyObject_New(genobject, &gentype);
104 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 Schemenauerf8c7c202001-07-12 13:27:49 +0000110 PyObject_GC_Init(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 Schemenauerf8c7c202001-07-12 13:27:49 +0000123 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000124 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000125 PyObject_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 Schemenauerf8c7c202001-07-12 13:27:49 +0000207 sizeof(genobject) + PyGC_HEAD_SIZE, /* 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 Schemenauerf8c7c202001-07-12 13:27:49 +0000225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_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
Jeremy Hylton52820442001-01-03 23:52:36 +0000500 PyObject **stack_pointer;
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);
589 f->f_stacktop = NULL;
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 (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000637 /* Do periodic things. Doing this every time through
638 the loop would add too much overhead, so we do it
639 only every Nth instruction. We also do it if
640 ``things_to_do'' is set, i.e. when an asynchronous
641 event needs attention (e.g. a signal handler or
642 async I/O handler); see Py_AddPendingCall() and
643 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000644
Guido van Rossuma027efa1997-05-05 20:56:21 +0000645 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000646 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000648 if (Py_MakePendingCalls() < 0) {
649 why = WHY_EXCEPTION;
650 goto on_error;
651 }
652 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000653#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000654 /* If we have true signals, the signal handler
655 will call Py_AddPendingCall() so we don't
656 have to call sigcheck(). On the Mac and
657 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000658 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 goto on_error;
661 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000662#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663
Guido van Rossume59214e1994-08-30 08:01:59 +0000664#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665 if (interpreter_lock) {
666 /* Give another thread a chance */
667
Guido van Rossum25ce5661997-08-02 03:10:38 +0000668 if (PyThreadState_Swap(NULL) != tstate)
669 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000670 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671
672 /* Other threads may run now */
673
Guido van Rossum65d5b571998-12-21 19:32:43 +0000674 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000675 if (PyThreadState_Swap(tstate) != NULL)
676 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 }
678#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000682
Guido van Rossum408027e1996-12-30 16:17:54 +0000683#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000684 f->f_lasti = INSTR_OFFSET();
685#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000686
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 opcode = NEXTOP();
688 if (HAS_ARG(opcode))
689 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000690 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000691#ifdef DYNAMIC_EXECUTION_PROFILE
692#ifdef DXPAIRS
693 dxpairs[lastopcode][opcode]++;
694 lastopcode = opcode;
695#endif
696 dxp[opcode]++;
697#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000698
Guido van Rossum96a42c81992-01-12 02:29:51 +0000699#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000701
Guido van Rossum96a42c81992-01-12 02:29:51 +0000702 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 if (HAS_ARG(opcode)) {
704 printf("%d: %d, %d\n",
705 (int) (INSTR_OFFSET() - 3),
706 opcode, oparg);
707 }
708 else {
709 printf("%d: %d\n",
710 (int) (INSTR_OFFSET() - 1), opcode);
711 }
712 }
713#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000717
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 /* BEWARE!
719 It is essential that any operation that fails sets either
720 x to NULL, err to nonzero, or why to anything but WHY_NOT,
721 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000724
Guido van Rossum374a9221991-04-04 10:40:29 +0000725 case POP_TOP:
726 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000727 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000728 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000729
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 case ROT_TWO:
731 v = POP();
732 w = POP();
733 PUSH(v);
734 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000735 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000736
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 case ROT_THREE:
738 v = POP();
739 w = POP();
740 x = POP();
741 PUSH(v);
742 PUSH(x);
743 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000744 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000745
Thomas Wouters434d0822000-08-24 20:11:32 +0000746 case ROT_FOUR:
747 u = POP();
748 v = POP();
749 w = POP();
750 x = POP();
751 PUSH(u);
752 PUSH(x);
753 PUSH(w);
754 PUSH(v);
755 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000756
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 case DUP_TOP:
758 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000759 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000761 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000762
Thomas Wouters434d0822000-08-24 20:11:32 +0000763 case DUP_TOPX:
764 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000765 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000766 x = TOP();
767 Py_INCREF(x);
768 PUSH(x);
769 continue;
770 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000771 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000772 Py_INCREF(x);
773 w = TOP();
774 Py_INCREF(w);
775 PUSH(x);
776 PUSH(w);
777 PUSH(x);
778 continue;
779 case 3:
780 x = POP();
781 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000782 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000783 Py_INCREF(w);
784 v = TOP();
785 Py_INCREF(v);
786 PUSH(w);
787 PUSH(x);
788 PUSH(v);
789 PUSH(w);
790 PUSH(x);
791 continue;
792 case 4:
793 x = POP();
794 Py_INCREF(x);
795 w = POP();
796 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000797 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000798 Py_INCREF(v);
799 u = TOP();
800 Py_INCREF(u);
801 PUSH(v);
802 PUSH(w);
803 PUSH(x);
804 PUSH(u);
805 PUSH(v);
806 PUSH(w);
807 PUSH(x);
808 continue;
809 case 5:
810 x = POP();
811 Py_INCREF(x);
812 w = POP();
813 Py_INCREF(w);
814 v = POP();
815 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000816 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000817 Py_INCREF(u);
818 t = TOP();
819 Py_INCREF(t);
820 PUSH(u);
821 PUSH(v);
822 PUSH(w);
823 PUSH(x);
824 PUSH(t);
825 PUSH(u);
826 PUSH(v);
827 PUSH(w);
828 PUSH(x);
829 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000830 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000831 Py_FatalError("invalid argument to DUP_TOPX"
832 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000833 }
Tim Peters35ba6892000-10-11 07:04:49 +0000834 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case UNARY_POSITIVE:
837 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000838 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000839 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000841 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000843
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 case UNARY_NEGATIVE:
845 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000851
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 case UNARY_NOT:
853 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000855 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 if (err == 0) {
857 Py_INCREF(Py_True);
858 PUSH(Py_True);
859 continue;
860 }
861 else if (err > 0) {
862 Py_INCREF(Py_False);
863 PUSH(Py_False);
864 err = 0;
865 continue;
866 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000868
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 case UNARY_CONVERT:
870 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000871 x = PyObject_Repr(v);
872 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000874 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000876
Guido van Rossum7928cd71991-10-24 14:59:31 +0000877 case UNARY_INVERT:
878 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000879 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000880 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000882 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000884
Guido van Rossum50564e81996-01-12 01:13:16 +0000885 case BINARY_POWER:
886 w = POP();
887 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000888 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000889 Py_DECREF(v);
890 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000891 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000893 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000894
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 case BINARY_MULTIPLY:
896 w = POP();
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
900 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000904
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000906 if (!_Py_QnewFlag) {
907 w = POP();
908 v = POP();
909 x = PyNumber_Divide(v, w);
910 Py_DECREF(v);
911 Py_DECREF(w);
912 PUSH(x);
913 if (x != NULL) continue;
914 break;
915 }
916 /* -Qnew is in effect: fall through to
917 BINARY_TRUE_DIVIDE */
918 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 w = POP();
920 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000921 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000922 Py_DECREF(v);
923 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000925 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000927
Guido van Rossum4668b002001-08-08 05:00:18 +0000928 case BINARY_FLOOR_DIVIDE:
929 w = POP();
930 v = POP();
931 x = PyNumber_FloorDivide(v, w);
932 Py_DECREF(v);
933 Py_DECREF(w);
934 PUSH(x);
935 if (x != NULL) continue;
936 break;
937
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 case BINARY_MODULO:
939 w = POP();
940 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000941 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_ADD:
949 w = POP();
950 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000951 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000952 /* INLINE: int + int */
953 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000954 a = PyInt_AS_LONG(v);
955 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000956 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000957 if ((i^a) < 0 && (i^b) < 0)
958 goto slow_add;
959 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000960 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000961 else {
962 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000963 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000964 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000965 Py_DECREF(v);
966 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000968 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000970
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 case BINARY_SUBTRACT:
972 w = POP();
973 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000974 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 /* INLINE: int - int */
976 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000977 a = PyInt_AS_LONG(v);
978 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000979 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000980 if ((i^a) < 0 && (i^~b) < 0)
981 goto slow_sub;
982 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000983 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000984 else {
985 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000986 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000987 }
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_SUBSCR:
995 w = POP();
996 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +0000997 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000998 /* INLINE: list[int] */
999 long i = PyInt_AsLong(w);
1000 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001001 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001002 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001003 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001004 PyErr_SetString(PyExc_IndexError,
1005 "list index out of range");
1006 x = NULL;
1007 }
1008 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001009 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001010 Py_INCREF(x);
1011 }
1012 }
1013 else
1014 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001015 Py_DECREF(v);
1016 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001018 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001020
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 case BINARY_LSHIFT:
1022 w = POP();
1023 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001024 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 Py_DECREF(v);
1026 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001028 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001030
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 case BINARY_RSHIFT:
1032 w = POP();
1033 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001034 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 Py_DECREF(v);
1036 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001037 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001038 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001040
Guido van Rossum7928cd71991-10-24 14:59:31 +00001041 case BINARY_AND:
1042 w = POP();
1043 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001044 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001045 Py_DECREF(v);
1046 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001047 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001048 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001050
Guido van Rossum7928cd71991-10-24 14:59:31 +00001051 case BINARY_XOR:
1052 w = POP();
1053 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001054 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001055 Py_DECREF(v);
1056 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001057 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001058 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001059 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001060
Guido van Rossum7928cd71991-10-24 14:59:31 +00001061 case BINARY_OR:
1062 w = POP();
1063 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001064 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001065 Py_DECREF(v);
1066 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001067 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001068 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001069 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001070
1071 case INPLACE_POWER:
1072 w = POP();
1073 v = POP();
1074 x = PyNumber_InPlacePower(v, w, Py_None);
1075 Py_DECREF(v);
1076 Py_DECREF(w);
1077 PUSH(x);
1078 if (x != NULL) continue;
1079 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001080
Thomas Wouters434d0822000-08-24 20:11:32 +00001081 case INPLACE_MULTIPLY:
1082 w = POP();
1083 v = POP();
1084 x = PyNumber_InPlaceMultiply(v, w);
1085 Py_DECREF(v);
1086 Py_DECREF(w);
1087 PUSH(x);
1088 if (x != NULL) continue;
1089 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001090
Thomas Wouters434d0822000-08-24 20:11:32 +00001091 case INPLACE_DIVIDE:
1092 w = POP();
1093 v = POP();
1094 x = PyNumber_InPlaceDivide(v, w);
1095 Py_DECREF(v);
1096 Py_DECREF(w);
1097 PUSH(x);
1098 if (x != NULL) continue;
1099 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001100
Guido van Rossum4668b002001-08-08 05:00:18 +00001101 case INPLACE_FLOOR_DIVIDE:
1102 w = POP();
1103 v = POP();
1104 x = PyNumber_InPlaceFloorDivide(v, w);
1105 Py_DECREF(v);
1106 Py_DECREF(w);
1107 PUSH(x);
1108 if (x != NULL) continue;
1109 break;
1110
1111 case INPLACE_TRUE_DIVIDE:
1112 w = POP();
1113 v = POP();
1114 x = PyNumber_InPlaceTrueDivide(v, w);
1115 Py_DECREF(v);
1116 Py_DECREF(w);
1117 PUSH(x);
1118 if (x != NULL) continue;
1119 break;
1120
Thomas Wouters434d0822000-08-24 20:11:32 +00001121 case INPLACE_MODULO:
1122 w = POP();
1123 v = POP();
1124 x = PyNumber_InPlaceRemainder(v, w);
1125 Py_DECREF(v);
1126 Py_DECREF(w);
1127 PUSH(x);
1128 if (x != NULL) continue;
1129 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001130
Thomas Wouters434d0822000-08-24 20:11:32 +00001131 case INPLACE_ADD:
1132 w = POP();
1133 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001134 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 /* INLINE: int + int */
1136 register long a, b, i;
1137 a = PyInt_AS_LONG(v);
1138 b = PyInt_AS_LONG(w);
1139 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001140 if ((i^a) < 0 && (i^b) < 0)
1141 goto slow_iadd;
1142 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001143 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001144 else {
1145 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001146 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001147 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 Py_DECREF(v);
1149 Py_DECREF(w);
1150 PUSH(x);
1151 if (x != NULL) continue;
1152 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001153
Thomas Wouters434d0822000-08-24 20:11:32 +00001154 case INPLACE_SUBTRACT:
1155 w = POP();
1156 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001157 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001158 /* INLINE: int - int */
1159 register long a, b, i;
1160 a = PyInt_AS_LONG(v);
1161 b = PyInt_AS_LONG(w);
1162 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001163 if ((i^a) < 0 && (i^~b) < 0)
1164 goto slow_isub;
1165 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001166 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001167 else {
1168 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001169 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001170 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001171 Py_DECREF(v);
1172 Py_DECREF(w);
1173 PUSH(x);
1174 if (x != NULL) continue;
1175 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001176
Thomas Wouters434d0822000-08-24 20:11:32 +00001177 case INPLACE_LSHIFT:
1178 w = POP();
1179 v = POP();
1180 x = PyNumber_InPlaceLshift(v, w);
1181 Py_DECREF(v);
1182 Py_DECREF(w);
1183 PUSH(x);
1184 if (x != NULL) continue;
1185 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001186
Thomas Wouters434d0822000-08-24 20:11:32 +00001187 case INPLACE_RSHIFT:
1188 w = POP();
1189 v = POP();
1190 x = PyNumber_InPlaceRshift(v, w);
1191 Py_DECREF(v);
1192 Py_DECREF(w);
1193 PUSH(x);
1194 if (x != NULL) continue;
1195 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001196
Thomas Wouters434d0822000-08-24 20:11:32 +00001197 case INPLACE_AND:
1198 w = POP();
1199 v = POP();
1200 x = PyNumber_InPlaceAnd(v, w);
1201 Py_DECREF(v);
1202 Py_DECREF(w);
1203 PUSH(x);
1204 if (x != NULL) continue;
1205 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001206
Thomas Wouters434d0822000-08-24 20:11:32 +00001207 case INPLACE_XOR:
1208 w = POP();
1209 v = POP();
1210 x = PyNumber_InPlaceXor(v, w);
1211 Py_DECREF(v);
1212 Py_DECREF(w);
1213 PUSH(x);
1214 if (x != NULL) continue;
1215 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001216
Thomas Wouters434d0822000-08-24 20:11:32 +00001217 case INPLACE_OR:
1218 w = POP();
1219 v = POP();
1220 x = PyNumber_InPlaceOr(v, w);
1221 Py_DECREF(v);
1222 Py_DECREF(w);
1223 PUSH(x);
1224 if (x != NULL) continue;
1225 break;
1226
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 case SLICE+0:
1228 case SLICE+1:
1229 case SLICE+2:
1230 case SLICE+3:
1231 if ((opcode-SLICE) & 2)
1232 w = POP();
1233 else
1234 w = NULL;
1235 if ((opcode-SLICE) & 1)
1236 v = POP();
1237 else
1238 v = NULL;
1239 u = POP();
1240 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001241 Py_DECREF(u);
1242 Py_XDECREF(v);
1243 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001245 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001247
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 case STORE_SLICE+0:
1249 case STORE_SLICE+1:
1250 case STORE_SLICE+2:
1251 case STORE_SLICE+3:
1252 if ((opcode-STORE_SLICE) & 2)
1253 w = POP();
1254 else
1255 w = NULL;
1256 if ((opcode-STORE_SLICE) & 1)
1257 v = POP();
1258 else
1259 v = NULL;
1260 u = POP();
1261 t = POP();
1262 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_DECREF(t);
1264 Py_DECREF(u);
1265 Py_XDECREF(v);
1266 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001267 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001269
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 case DELETE_SLICE+0:
1271 case DELETE_SLICE+1:
1272 case DELETE_SLICE+2:
1273 case DELETE_SLICE+3:
1274 if ((opcode-DELETE_SLICE) & 2)
1275 w = POP();
1276 else
1277 w = NULL;
1278 if ((opcode-DELETE_SLICE) & 1)
1279 v = POP();
1280 else
1281 v = NULL;
1282 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001283 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 Py_DECREF(u);
1286 Py_XDECREF(v);
1287 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001288 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001290
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 case STORE_SUBSCR:
1292 w = POP();
1293 v = POP();
1294 u = POP();
1295 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001296 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 Py_DECREF(u);
1298 Py_DECREF(v);
1299 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001300 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001302
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 case DELETE_SUBSCR:
1304 w = POP();
1305 v = POP();
1306 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001307 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001308 Py_DECREF(v);
1309 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001310 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001312
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 case PRINT_EXPR:
1314 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001315 w = PySys_GetObject("displayhook");
1316 if (w == NULL) {
1317 PyErr_SetString(PyExc_RuntimeError,
1318 "lost sys.displayhook");
1319 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001320 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001321 }
1322 if (err == 0) {
1323 x = Py_BuildValue("(O)", v);
1324 if (x == NULL)
1325 err = -1;
1326 }
1327 if (err == 0) {
1328 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001329 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001330 if (w == NULL)
1331 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001333 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001334 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001336
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001337 case PRINT_ITEM_TO:
1338 w = stream = POP();
1339 /* fall through to PRINT_ITEM */
1340
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 case PRINT_ITEM:
1342 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001343 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001344 w = PySys_GetObject("stdout");
1345 if (w == NULL) {
1346 PyErr_SetString(PyExc_RuntimeError,
1347 "lost sys.stdout");
1348 err = -1;
1349 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001350 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001351 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001352 err = PyFile_WriteString(" ", w);
1353 if (err == 0)
1354 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001355 if (err == 0) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001356 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001357 if (PyString_Check(v)) {
1358 char *s = PyString_AS_STRING(v);
1359 int len = PyString_GET_SIZE(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001360 if (len > 0 &&
1361 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001362 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 PyFile_SoftSpace(w, 0);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001364 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001365#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001366 else if (PyUnicode_Check(v)) {
1367 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1368 int len = PyUnicode_GET_SIZE(v);
1369 if (len > 0 &&
1370 Py_UNICODE_ISSPACE(s[len-1]) &&
1371 s[len-1] != ' ')
1372 PyFile_SoftSpace(w, 0);
1373 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001374#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001376 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001377 Py_XDECREF(stream);
1378 stream = NULL;
1379 if (err == 0)
1380 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001382
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001383 case PRINT_NEWLINE_TO:
1384 w = stream = POP();
1385 /* fall through to PRINT_NEWLINE */
1386
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001388 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001389 w = PySys_GetObject("stdout");
1390 if (w == NULL)
1391 PyErr_SetString(PyExc_RuntimeError,
1392 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001393 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001394 if (w != NULL) {
1395 err = PyFile_WriteString("\n", w);
1396 if (err == 0)
1397 PyFile_SoftSpace(w, 0);
1398 }
1399 Py_XDECREF(stream);
1400 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001402
Thomas Wouters434d0822000-08-24 20:11:32 +00001403
1404#ifdef CASE_TOO_BIG
1405 default: switch (opcode) {
1406#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 case BREAK_LOOP:
1408 why = WHY_BREAK;
1409 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001410
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001411 case CONTINUE_LOOP:
1412 retval = PyInt_FromLong(oparg);
1413 why = WHY_CONTINUE;
1414 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001415
Guido van Rossumf10570b1995-07-07 22:53:21 +00001416 case RAISE_VARARGS:
1417 u = v = w = NULL;
1418 switch (oparg) {
1419 case 3:
1420 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001421 /* Fallthrough */
1422 case 2:
1423 v = POP(); /* value */
1424 /* Fallthrough */
1425 case 1:
1426 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001427 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001428 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001429 break;
1430 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001432 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001433 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001434 break;
1435 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001437
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001439 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001440 PyErr_SetString(PyExc_SystemError,
1441 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 break;
1443 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001445 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001447
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 case RETURN_VALUE:
1449 retval = POP();
1450 why = WHY_RETURN;
1451 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001452
Tim Peters5ca576e2001-06-18 22:08:13 +00001453 case YIELD_VALUE:
1454 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001455 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001456 f->f_lasti = INSTR_OFFSET();
1457 why = WHY_YIELD;
1458 break;
1459
1460
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001461 case EXEC_STMT:
1462 w = POP();
1463 v = POP();
1464 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001465 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001466 Py_DECREF(u);
1467 Py_DECREF(v);
1468 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001469 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001470
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 case POP_BLOCK:
1472 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001473 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 while (STACK_LEVEL() > b->b_level) {
1475 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001476 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 }
1478 }
1479 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001480
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 case END_FINALLY:
1482 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 if (PyInt_Check(v)) {
1484 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001485 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001486 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001487 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 retval = POP();
1489 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001492 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001495 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 else if (v != Py_None) {
1498 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 "'finally' pops bad exception");
1500 why = WHY_EXCEPTION;
1501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001504
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001506 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001508 w = POP();
1509 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 Py_DECREF(u);
1512 Py_DECREF(v);
1513 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001515
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 case STORE_NAME:
1517 w = GETNAMEV(oparg);
1518 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001520 PyErr_Format(PyExc_SystemError,
1521 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001522 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001523 break;
1524 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 err = PyDict_SetItem(x, w, v);
1526 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001530 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001531 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001532 PyErr_Format(PyExc_SystemError,
1533 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001534 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001535 break;
1536 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001538 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001539 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001541
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001542 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001544 if (PyTuple_Check(v)) {
1545 if (PyTuple_Size(v) != oparg) {
1546 PyErr_SetString(PyExc_ValueError,
1547 "unpack tuple of wrong size");
1548 why = WHY_EXCEPTION;
1549 }
1550 else {
1551 for (; --oparg >= 0; ) {
1552 w = PyTuple_GET_ITEM(v, oparg);
1553 Py_INCREF(w);
1554 PUSH(w);
1555 }
1556 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001558 else if (PyList_Check(v)) {
1559 if (PyList_Size(v) != oparg) {
1560 PyErr_SetString(PyExc_ValueError,
1561 "unpack list of wrong size");
1562 why = WHY_EXCEPTION;
1563 }
1564 else {
1565 for (; --oparg >= 0; ) {
1566 w = PyList_GET_ITEM(v, oparg);
1567 Py_INCREF(w);
1568 PUSH(w);
1569 }
1570 }
1571 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001572 else if (unpack_iterable(v, oparg,
1573 stack_pointer + oparg))
1574 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001575 else {
1576 if (PyErr_ExceptionMatches(PyExc_TypeError))
1577 PyErr_SetString(PyExc_TypeError,
1578 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001579 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001580 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001583
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001585 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 v = POP();
1587 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1589 Py_DECREF(v);
1590 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001592
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001594 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001596 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1597 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001600
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001601 case STORE_GLOBAL:
1602 w = GETNAMEV(oparg);
1603 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001604 err = PyDict_SetItem(f->f_globals, w, v);
1605 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001606 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001607
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001608 case DELETE_GLOBAL:
1609 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001610 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001611 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001612 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001613 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001614
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 case LOAD_CONST:
1616 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 PUSH(x);
1619 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001620
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001622 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001623 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001624 PyErr_Format(PyExc_SystemError,
1625 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001626 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001627 break;
1628 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001629 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001635 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001636 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001637 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 break;
1639 }
1640 }
1641 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 PUSH(x);
1644 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001645
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001647 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001648 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001650 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001652 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001653 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001654 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 break;
1656 }
1657 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 PUSH(x);
1660 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661
Guido van Rossum9bfef441993-03-29 10:43:31 +00001662 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001664 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001665 format_exc_check_arg(
1666 PyExc_UnboundLocalError,
1667 UNBOUNDLOCAL_ERROR_MSG,
1668 PyTuple_GetItem(co->co_varnames, oparg)
1669 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001670 break;
1671 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001673 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001674 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001675 break;
1676
1677 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001678 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001680 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001681
1682 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001683 x = GETLOCAL(oparg);
1684 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001685 format_exc_check_arg(
1686 PyExc_UnboundLocalError,
1687 UNBOUNDLOCAL_ERROR_MSG,
1688 PyTuple_GetItem(co->co_varnames, oparg)
1689 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001690 break;
1691 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001692 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001693 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001694
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001695 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001696 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001697 Py_INCREF(x);
1698 PUSH(x);
1699 break;
1700
1701 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001702 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001703 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001704 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001705 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001706 v = PyTuple_GetItem(co->co_cellvars,
1707 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001708 format_exc_check_arg(
1709 PyExc_UnboundLocalError,
1710 UNBOUNDLOCAL_ERROR_MSG,
1711 v);
1712 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001713 v = PyTuple_GetItem(
1714 co->co_freevars,
1715 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001716 format_exc_check_arg(
1717 PyExc_NameError,
1718 UNBOUNDFREE_ERROR_MSG,
1719 v);
1720 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001721 err = -1;
1722 break;
1723 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001724 PUSH(w);
1725 break;
1726
1727 case STORE_DEREF:
1728 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001729 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001730 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001731 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001732 continue;
1733
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 if (x != NULL) {
1737 for (; --oparg >= 0;) {
1738 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 }
1741 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001742 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 }
1744 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001745
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 if (x != NULL) {
1749 for (; --oparg >= 0;) {
1750 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001751 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 }
1753 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001754 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 }
1756 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001757
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001761 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001763
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001765 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 x = PyObject_GetAttr(v, w);
1768 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001770 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001772
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 case COMPARE_OP:
1774 w = POP();
1775 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001776 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001777 /* INLINE: cmp(int, int) */
1778 register long a, b;
1779 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001780 a = PyInt_AS_LONG(v);
1781 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001782 switch (oparg) {
1783 case LT: res = a < b; break;
1784 case LE: res = a <= b; break;
1785 case EQ: res = a == b; break;
1786 case NE: res = a != b; break;
1787 case GT: res = a > b; break;
1788 case GE: res = a >= b; break;
1789 case IS: res = v == w; break;
1790 case IS_NOT: res = v != w; break;
1791 default: goto slow_compare;
1792 }
1793 x = res ? Py_True : Py_False;
1794 Py_INCREF(x);
1795 }
1796 else {
1797 slow_compare:
1798 x = cmp_outcome(oparg, v, w);
1799 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 Py_DECREF(v);
1801 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001803 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001809 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001811 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 break;
1813 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001814 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001816 w,
1817 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001818 f->f_locals == NULL ?
1819 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001820 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001822 if (w == NULL) {
1823 x = NULL;
1824 break;
1825 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 x = PyEval_CallObject(x, w);
1827 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001828 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001829 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001830 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001831
Thomas Wouters52152252000-08-17 22:55:00 +00001832 case IMPORT_STAR:
1833 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001835 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001836 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001837 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001838 break;
1839 }
Thomas Wouters52152252000-08-17 22:55:00 +00001840 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001842 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001843 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001845
Thomas Wouters52152252000-08-17 22:55:00 +00001846 case IMPORT_FROM:
1847 w = GETNAMEV(oparg);
1848 v = TOP();
1849 x = import_from(v, w);
1850 PUSH(x);
1851 if (x != NULL) continue;
1852 break;
1853
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 case JUMP_FORWARD:
1855 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001856 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001857
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001860 if (err > 0)
1861 err = 0;
1862 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001864 else
1865 break;
1866 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001867
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001869 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001870 if (err > 0) {
1871 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001873 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001874 else if (err == 0)
1875 ;
1876 else
1877 break;
1878 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001879
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 case JUMP_ABSOLUTE:
1881 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001882 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001883
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001884 case GET_ITER:
1885 /* before: [obj]; after [getiter(obj)] */
1886 v = POP();
1887 x = PyObject_GetIter(v);
1888 Py_DECREF(v);
1889 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001890 PUSH(x);
1891 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001892 }
1893 break;
1894
1895 case FOR_ITER:
1896 /* before: [iter]; after: [iter, iter()] *or* [] */
1897 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001898 x = PyIter_Next(v);
1899 if (x != NULL) {
1900 PUSH(x);
1901 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001902 }
Tim Petersf4848da2001-05-05 00:14:56 +00001903 if (!PyErr_Occurred()) {
1904 /* iterator ended normally */
1905 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001906 Py_DECREF(v);
1907 JUMPBY(oparg);
1908 continue;
1909 }
1910 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001911
Guido van Rossum374a9221991-04-04 10:40:29 +00001912 case FOR_LOOP:
1913 /* for v in s: ...
1914 On entry: stack contains s, i.
1915 On exit: stack contains s, i+1, s[i];
1916 but if loop exhausted:
1917 s, i are popped, and we jump */
1918 w = POP(); /* Loop index */
1919 v = POP(); /* Sequence object */
1920 u = loop_subscript(v, w);
1921 if (u != NULL) {
1922 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001923 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001924 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001925 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001926 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001927 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001928 }
1929 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001930 Py_DECREF(v);
1931 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001932 /* A NULL can mean "s exhausted"
1933 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001934 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001936 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001937 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001938 continue;
1939 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001940 }
1941 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001942
Guido van Rossum374a9221991-04-04 10:40:29 +00001943 case SETUP_LOOP:
1944 case SETUP_EXCEPT:
1945 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001946 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001947 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001948 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001949
Guido van Rossum374a9221991-04-04 10:40:29 +00001950 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001951#ifdef LLTRACE
1952 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001953 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001954#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001955 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001956 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001957 continue;
1958 /* Trace each line of code reached */
1959 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001960 /* Inline call_trace() for performance: */
1961 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001962 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001963 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1964 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001965 tstate->use_tracing = (tstate->c_tracefunc
1966 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001967 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001968 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001969
1970 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001971 {
1972 int na = oparg & 0xff;
1973 int nk = (oparg>>8) & 0xff;
1974 int n = na + 2 * nk;
1975 PyObject **pfunc = stack_pointer - n - 1;
1976 PyObject *func = *pfunc;
1977 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1978
1979 /* Always dispatch PyCFunction first, because
1980 these are presumed to be the most frequent
1981 callable object.
1982 */
1983 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001984 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001985 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001986 x = do_call(func, &stack_pointer,
1987 na, nk);
1988 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001989 PyObject *callargs;
1990 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001991 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001992 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001993 } else
1994 x = fast_cfunction(func,
1995 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001997 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001998 && PyMethod_GET_SELF(func) != NULL) {
1999 /* optimize access to bound methods */
2000 PyObject *self = PyMethod_GET_SELF(func);
2001 Py_INCREF(self);
2002 func = PyMethod_GET_FUNCTION(func);
2003 Py_INCREF(func);
2004 Py_DECREF(*pfunc);
2005 *pfunc = self;
2006 na++;
2007 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002008 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002009 Py_INCREF(func);
2010 if (PyFunction_Check(func)) {
2011 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002012 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002013 } else {
2014 x = do_call(func, &stack_pointer,
2015 na, nk);
2016 }
2017 Py_DECREF(func);
2018 }
2019
2020 while (stack_pointer > pfunc) {
2021 w = POP();
2022 Py_DECREF(w);
2023 }
2024 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002025 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002026 continue;
2027 break;
2028 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002029
Jeremy Hylton76901512000-03-28 23:49:17 +00002030 case CALL_FUNCTION_VAR:
2031 case CALL_FUNCTION_KW:
2032 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002033 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002034 int na = oparg & 0xff;
2035 int nk = (oparg>>8) & 0xff;
2036 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002037 int n = na + 2 * nk;
2038 PyObject **pfunc, *func;
2039 if (flags & CALL_FLAG_VAR)
2040 n++;
2041 if (flags & CALL_FLAG_KW)
2042 n++;
2043 pfunc = stack_pointer - n - 1;
2044 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002045 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002046
Guido van Rossumac7be682001-01-17 15:42:30 +00002047 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002048 && PyMethod_GET_SELF(func) != NULL) {
2049 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002050 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002051 func = PyMethod_GET_FUNCTION(func);
2052 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002053 Py_DECREF(*pfunc);
2054 *pfunc = self;
2055 na++;
2056 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002057 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002058 Py_INCREF(func);
2059 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002060 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002061
Jeremy Hylton76901512000-03-28 23:49:17 +00002062 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002063 w = POP();
2064 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002065 }
2066 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002067 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002068 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002069 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002070 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002071
Guido van Rossum681d79a1995-07-18 14:51:37 +00002072 case MAKE_FUNCTION:
2073 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 x = PyFunction_New(v, f->f_globals);
2075 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002076 /* XXX Maybe this should be a separate opcode? */
2077 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002078 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002079 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002081 x = NULL;
2082 break;
2083 }
2084 while (--oparg >= 0) {
2085 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002086 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002087 }
2088 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002089 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002090 }
2091 PUSH(x);
2092 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002093
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002094 case MAKE_CLOSURE:
2095 {
2096 int nfree;
2097 v = POP(); /* code object */
2098 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002099 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002100 Py_DECREF(v);
2101 /* XXX Maybe this should be a separate opcode? */
2102 if (x != NULL && nfree > 0) {
2103 v = PyTuple_New(nfree);
2104 if (v == NULL) {
2105 Py_DECREF(x);
2106 x = NULL;
2107 break;
2108 }
2109 while (--nfree >= 0) {
2110 w = POP();
2111 PyTuple_SET_ITEM(v, nfree, w);
2112 }
2113 err = PyFunction_SetClosure(x, v);
2114 Py_DECREF(v);
2115 }
2116 if (x != NULL && oparg > 0) {
2117 v = PyTuple_New(oparg);
2118 if (v == NULL) {
2119 Py_DECREF(x);
2120 x = NULL;
2121 break;
2122 }
2123 while (--oparg >= 0) {
2124 w = POP();
2125 PyTuple_SET_ITEM(v, oparg, w);
2126 }
2127 err = PyFunction_SetDefaults(x, v);
2128 Py_DECREF(v);
2129 }
2130 PUSH(x);
2131 break;
2132 }
2133
Guido van Rossum8861b741996-07-30 16:49:37 +00002134 case BUILD_SLICE:
2135 if (oparg == 3)
2136 w = POP();
2137 else
2138 w = NULL;
2139 v = POP();
2140 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002141 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002142 Py_DECREF(u);
2143 Py_DECREF(v);
2144 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002145 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002146 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002147 break;
2148
Fred Drakeef8ace32000-08-24 00:32:09 +00002149 case EXTENDED_ARG:
2150 opcode = NEXTOP();
2151 oparg = oparg<<16 | NEXTARG();
2152 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002153
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 default:
2155 fprintf(stderr,
2156 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002157 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002159 why = WHY_EXCEPTION;
2160 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002161
2162#ifdef CASE_TOO_BIG
2163 }
2164#endif
2165
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 } /* switch */
2167
2168 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002169
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002171
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002173 if (err == 0 && x != NULL) {
2174#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002175 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002177 fprintf(stderr,
2178 "XXX undetected error\n");
2179 else
2180#endif
2181 continue; /* Normal, fast path */
2182 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 err = 0;
2186 }
2187
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002189
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002192 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002193 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 why = WHY_EXCEPTION;
2195 }
2196 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002197#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002198 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002199 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002201 fprintf(stderr,
2202 "XXX undetected error (why=%d)\n",
2203 why);
2204 why = WHY_EXCEPTION;
2205 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 }
2207#endif
2208
2209 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002210
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002212 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002214 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002216
Fred Drake8f51f542001-10-04 14:48:42 +00002217 if (tstate->c_tracefunc != NULL)
2218 call_exc_trace(tstate->c_tracefunc,
2219 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002220 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002221
Guido van Rossum374a9221991-04-04 10:40:29 +00002222 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002223
Guido van Rossum374a9221991-04-04 10:40:29 +00002224 if (why == WHY_RERAISE)
2225 why = WHY_EXCEPTION;
2226
2227 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002228
Tim Peters5ca576e2001-06-18 22:08:13 +00002229 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002230 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002231
2232 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2233 /* For a continue inside a try block,
2234 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002235 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2236 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002237 why = WHY_NOT;
2238 JUMPTO(PyInt_AS_LONG(retval));
2239 Py_DECREF(retval);
2240 break;
2241 }
2242
Guido van Rossum374a9221991-04-04 10:40:29 +00002243 while (STACK_LEVEL() > b->b_level) {
2244 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002245 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 }
2247 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2248 why = WHY_NOT;
2249 JUMPTO(b->b_handler);
2250 break;
2251 }
2252 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002253 (b->b_type == SETUP_EXCEPT &&
2254 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002255 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002256 PyObject *exc, *val, *tb;
2257 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002258 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 val = Py_None;
2260 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002261 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002262 /* Make the raw exception data
2263 available to the handler,
2264 so a program can emulate the
2265 Python main loop. Don't do
2266 this for 'finally'. */
2267 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002268 PyErr_NormalizeException(
2269 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002270 set_exc_info(tstate,
2271 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002272 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002273 if (tb == NULL) {
2274 Py_INCREF(Py_None);
2275 PUSH(Py_None);
2276 } else
2277 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002278 PUSH(val);
2279 PUSH(exc);
2280 }
2281 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002282 if (why == WHY_RETURN ||
2283 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002284 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002285 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002286 PUSH(v);
2287 }
2288 why = WHY_NOT;
2289 JUMPTO(b->b_handler);
2290 break;
2291 }
2292 } /* unwind stack */
2293
2294 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002295
Guido van Rossum374a9221991-04-04 10:40:29 +00002296 if (why != WHY_NOT)
2297 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002298
Guido van Rossum374a9221991-04-04 10:40:29 +00002299 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002300
Guido van Rossum35974fb2001-12-06 21:28:18 +00002301 if (why != WHY_YIELD) {
2302 /* Pop remaining stack entries -- but when yielding */
2303 while (!EMPTY()) {
2304 v = POP();
2305 Py_XDECREF(v);
2306 }
2307 }
2308
Tim Peters5ca576e2001-06-18 22:08:13 +00002309 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002310 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002311
Fred Drake9e3ad782001-07-03 23:39:52 +00002312 if (tstate->use_tracing) {
2313 if (tstate->c_tracefunc
2314 && (why == WHY_RETURN || why == WHY_YIELD)) {
2315 if (call_trace(tstate->c_tracefunc,
2316 tstate->c_traceobj, f,
2317 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002318 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002319 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002320 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002321 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002322 }
Fred Drake8f51f542001-10-04 14:48:42 +00002323 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002324 if (why == WHY_EXCEPTION)
2325 call_trace_protected(tstate->c_profilefunc,
2326 tstate->c_profileobj, f,
2327 PyTrace_RETURN);
2328 else if (call_trace(tstate->c_profilefunc,
2329 tstate->c_profileobj, f,
2330 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002331 Py_XDECREF(retval);
2332 retval = NULL;
2333 why = WHY_EXCEPTION;
2334 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002335 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002336 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002337
Guido van Rossuma027efa1997-05-05 20:56:21 +00002338 reset_exc_info(tstate);
2339
Tim Peters5ca576e2001-06-18 22:08:13 +00002340 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002341 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002342 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002343
Guido van Rossum96a42c81992-01-12 02:29:51 +00002344 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002345}
2346
Tim Peters6d6c1a32001-08-02 04:15:00 +00002347PyObject *
2348PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002349 PyObject **args, int argcount, PyObject **kws, int kwcount,
2350 PyObject **defs, int defcount, PyObject *closure)
2351{
2352 register PyFrameObject *f;
2353 register PyObject *retval = NULL;
2354 register PyObject **fastlocals, **freevars;
2355 PyThreadState *tstate = PyThreadState_GET();
2356 PyObject *x, *u;
2357
2358 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002359 PyErr_SetString(PyExc_SystemError,
2360 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002361 return NULL;
2362 }
2363
2364 f = PyFrame_New(tstate, /*back*/
2365 co, /*code*/
2366 globals, locals);
2367 if (f == NULL)
2368 return NULL;
2369
2370 fastlocals = f->f_localsplus;
2371 freevars = f->f_localsplus + f->f_nlocals;
2372
2373 if (co->co_argcount > 0 ||
2374 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2375 int i;
2376 int n = argcount;
2377 PyObject *kwdict = NULL;
2378 if (co->co_flags & CO_VARKEYWORDS) {
2379 kwdict = PyDict_New();
2380 if (kwdict == NULL)
2381 goto fail;
2382 i = co->co_argcount;
2383 if (co->co_flags & CO_VARARGS)
2384 i++;
2385 SETLOCAL(i, kwdict);
2386 }
2387 if (argcount > co->co_argcount) {
2388 if (!(co->co_flags & CO_VARARGS)) {
2389 PyErr_Format(PyExc_TypeError,
2390 "%.200s() takes %s %d "
2391 "%sargument%s (%d given)",
2392 PyString_AsString(co->co_name),
2393 defcount ? "at most" : "exactly",
2394 co->co_argcount,
2395 kwcount ? "non-keyword " : "",
2396 co->co_argcount == 1 ? "" : "s",
2397 argcount);
2398 goto fail;
2399 }
2400 n = co->co_argcount;
2401 }
2402 for (i = 0; i < n; i++) {
2403 x = args[i];
2404 Py_INCREF(x);
2405 SETLOCAL(i, x);
2406 }
2407 if (co->co_flags & CO_VARARGS) {
2408 u = PyTuple_New(argcount - n);
2409 if (u == NULL)
2410 goto fail;
2411 SETLOCAL(co->co_argcount, u);
2412 for (i = n; i < argcount; i++) {
2413 x = args[i];
2414 Py_INCREF(x);
2415 PyTuple_SET_ITEM(u, i-n, x);
2416 }
2417 }
2418 for (i = 0; i < kwcount; i++) {
2419 PyObject *keyword = kws[2*i];
2420 PyObject *value = kws[2*i + 1];
2421 int j;
2422 if (keyword == NULL || !PyString_Check(keyword)) {
2423 PyErr_Format(PyExc_TypeError,
2424 "%.200s() keywords must be strings",
2425 PyString_AsString(co->co_name));
2426 goto fail;
2427 }
2428 /* XXX slow -- speed up using dictionary? */
2429 for (j = 0; j < co->co_argcount; j++) {
2430 PyObject *nm = PyTuple_GET_ITEM(
2431 co->co_varnames, j);
2432 int cmp = PyObject_RichCompareBool(
2433 keyword, nm, Py_EQ);
2434 if (cmp > 0)
2435 break;
2436 else if (cmp < 0)
2437 goto fail;
2438 }
2439 /* Check errors from Compare */
2440 if (PyErr_Occurred())
2441 goto fail;
2442 if (j >= co->co_argcount) {
2443 if (kwdict == NULL) {
2444 PyErr_Format(PyExc_TypeError,
2445 "%.200s() got an unexpected "
2446 "keyword argument '%.400s'",
2447 PyString_AsString(co->co_name),
2448 PyString_AsString(keyword));
2449 goto fail;
2450 }
2451 PyDict_SetItem(kwdict, keyword, value);
2452 }
2453 else {
2454 if (GETLOCAL(j) != NULL) {
2455 PyErr_Format(PyExc_TypeError,
2456 "%.200s() got multiple "
2457 "values for keyword "
2458 "argument '%.400s'",
2459 PyString_AsString(co->co_name),
2460 PyString_AsString(keyword));
2461 goto fail;
2462 }
2463 Py_INCREF(value);
2464 SETLOCAL(j, value);
2465 }
2466 }
2467 if (argcount < co->co_argcount) {
2468 int m = co->co_argcount - defcount;
2469 for (i = argcount; i < m; i++) {
2470 if (GETLOCAL(i) == NULL) {
2471 PyErr_Format(PyExc_TypeError,
2472 "%.200s() takes %s %d "
2473 "%sargument%s (%d given)",
2474 PyString_AsString(co->co_name),
2475 ((co->co_flags & CO_VARARGS) ||
2476 defcount) ? "at least"
2477 : "exactly",
2478 m, kwcount ? "non-keyword " : "",
2479 m == 1 ? "" : "s", i);
2480 goto fail;
2481 }
2482 }
2483 if (n > m)
2484 i = n - m;
2485 else
2486 i = 0;
2487 for (; i < defcount; i++) {
2488 if (GETLOCAL(m+i) == NULL) {
2489 PyObject *def = defs[i];
2490 Py_INCREF(def);
2491 SETLOCAL(m+i, def);
2492 }
2493 }
2494 }
2495 }
2496 else {
2497 if (argcount > 0 || kwcount > 0) {
2498 PyErr_Format(PyExc_TypeError,
2499 "%.200s() takes no arguments (%d given)",
2500 PyString_AsString(co->co_name),
2501 argcount + kwcount);
2502 goto fail;
2503 }
2504 }
2505 /* Allocate and initialize storage for cell vars, and copy free
2506 vars into frame. This isn't too efficient right now. */
2507 if (f->f_ncells) {
2508 int i = 0, j = 0, nargs, found;
2509 char *cellname, *argname;
2510 PyObject *c;
2511
2512 nargs = co->co_argcount;
2513 if (co->co_flags & CO_VARARGS)
2514 nargs++;
2515 if (co->co_flags & CO_VARKEYWORDS)
2516 nargs++;
2517
2518 /* Check for cells that shadow args */
2519 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2520 cellname = PyString_AS_STRING(
2521 PyTuple_GET_ITEM(co->co_cellvars, i));
2522 found = 0;
2523 while (j < nargs) {
2524 argname = PyString_AS_STRING(
2525 PyTuple_GET_ITEM(co->co_varnames, j));
2526 if (strcmp(cellname, argname) == 0) {
2527 c = PyCell_New(GETLOCAL(j));
2528 if (c == NULL)
2529 goto fail;
2530 GETLOCAL(f->f_nlocals + i) = c;
2531 found = 1;
2532 break;
2533 }
2534 j++;
2535 }
2536 if (found == 0) {
2537 c = PyCell_New(NULL);
2538 if (c == NULL)
2539 goto fail;
2540 SETLOCAL(f->f_nlocals + i, c);
2541 }
2542 }
2543 /* Initialize any that are left */
2544 while (i < f->f_ncells) {
2545 c = PyCell_New(NULL);
2546 if (c == NULL)
2547 goto fail;
2548 SETLOCAL(f->f_nlocals + i, c);
2549 i++;
2550 }
2551 }
2552 if (f->f_nfreevars) {
2553 int i;
2554 for (i = 0; i < f->f_nfreevars; ++i) {
2555 PyObject *o = PyTuple_GET_ITEM(closure, i);
2556 Py_INCREF(o);
2557 freevars[f->f_ncells + i] = o;
2558 }
2559 }
2560
Tim Peters5ca576e2001-06-18 22:08:13 +00002561 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002562 /* Don't need to keep the reference to f_back, it will be set
2563 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002564 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002565 f->f_back = NULL;
2566
2567 /* Create a new generator that owns the ready to run frame
2568 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002569 return gen_new(f);
2570 }
2571
2572 retval = eval_frame(f);
2573
2574 fail: /* Jump here from prelude on failure */
2575
Tim Petersb13680b2001-11-27 23:29:29 +00002576 /* decref'ing the frame can cause __del__ methods to get invoked,
2577 which can call back into Python. While we're done with the
2578 current Python frame (f), the associated C stack is still in use,
2579 so recursion_depth must be boosted for the duration.
2580 */
2581 assert(tstate != NULL);
2582 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002583 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002584 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002585 return retval;
2586}
2587
2588
Guido van Rossuma027efa1997-05-05 20:56:21 +00002589static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002590set_exc_info(PyThreadState *tstate,
2591 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002592{
2593 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002594 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002595
Guido van Rossuma027efa1997-05-05 20:56:21 +00002596 frame = tstate->frame;
2597 if (frame->f_exc_type == NULL) {
2598 /* This frame didn't catch an exception before */
2599 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600 if (tstate->exc_type == NULL) {
2601 Py_INCREF(Py_None);
2602 tstate->exc_type = Py_None;
2603 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002604 tmp_type = frame->f_exc_type;
2605 tmp_value = frame->f_exc_value;
2606 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607 Py_XINCREF(tstate->exc_type);
2608 Py_XINCREF(tstate->exc_value);
2609 Py_XINCREF(tstate->exc_traceback);
2610 frame->f_exc_type = tstate->exc_type;
2611 frame->f_exc_value = tstate->exc_value;
2612 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002613 Py_XDECREF(tmp_type);
2614 Py_XDECREF(tmp_value);
2615 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002616 }
2617 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002618 tmp_type = tstate->exc_type;
2619 tmp_value = tstate->exc_value;
2620 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002621 Py_XINCREF(type);
2622 Py_XINCREF(value);
2623 Py_XINCREF(tb);
2624 tstate->exc_type = type;
2625 tstate->exc_value = value;
2626 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002627 Py_XDECREF(tmp_type);
2628 Py_XDECREF(tmp_value);
2629 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002630 /* For b/w compatibility */
2631 PySys_SetObject("exc_type", type);
2632 PySys_SetObject("exc_value", value);
2633 PySys_SetObject("exc_traceback", tb);
2634}
2635
2636static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002637reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002638{
2639 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002640 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002641 frame = tstate->frame;
2642 if (frame->f_exc_type != NULL) {
2643 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002644 tmp_type = tstate->exc_type;
2645 tmp_value = tstate->exc_value;
2646 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002647 Py_XINCREF(frame->f_exc_type);
2648 Py_XINCREF(frame->f_exc_value);
2649 Py_XINCREF(frame->f_exc_traceback);
2650 tstate->exc_type = frame->f_exc_type;
2651 tstate->exc_value = frame->f_exc_value;
2652 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002653 Py_XDECREF(tmp_type);
2654 Py_XDECREF(tmp_value);
2655 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002656 /* For b/w compatibility */
2657 PySys_SetObject("exc_type", frame->f_exc_type);
2658 PySys_SetObject("exc_value", frame->f_exc_value);
2659 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2660 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002661 tmp_type = frame->f_exc_type;
2662 tmp_value = frame->f_exc_value;
2663 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002664 frame->f_exc_type = NULL;
2665 frame->f_exc_value = NULL;
2666 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002667 Py_XDECREF(tmp_type);
2668 Py_XDECREF(tmp_value);
2669 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002670}
2671
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002672/* Logic for the raise statement (too complicated for inlining).
2673 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002674static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002675do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002676{
Guido van Rossumd295f121998-04-09 21:39:57 +00002677 if (type == NULL) {
2678 /* Reraise */
2679 PyThreadState *tstate = PyThreadState_Get();
2680 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2681 value = tstate->exc_value;
2682 tb = tstate->exc_traceback;
2683 Py_XINCREF(type);
2684 Py_XINCREF(value);
2685 Py_XINCREF(tb);
2686 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002687
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002688 /* We support the following forms of raise:
2689 raise <class>, <classinstance>
2690 raise <class>, <argument tuple>
2691 raise <class>, None
2692 raise <class>, <argument>
2693 raise <classinstance>, None
2694 raise <string>, <object>
2695 raise <string>, None
2696
2697 An omitted second argument is the same as None.
2698
2699 In addition, raise <tuple>, <anything> is the same as
2700 raising the tuple's first item (and it better have one!);
2701 this rule is applied recursively.
2702
2703 Finally, an optional third argument can be supplied, which
2704 gives the traceback to be substituted (useful when
2705 re-raising an exception after examining it). */
2706
2707 /* First, check the traceback argument, replacing None with
2708 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 if (tb == Py_None) {
2710 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002711 tb = NULL;
2712 }
2713 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002714 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002715 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002716 goto raise_error;
2717 }
2718
2719 /* Next, replace a missing value with None */
2720 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002721 value = Py_None;
2722 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002723 }
2724
2725 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2727 PyObject *tmp = type;
2728 type = PyTuple_GET_ITEM(type, 0);
2729 Py_INCREF(type);
2730 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002731 }
2732
Barry Warsaw4249f541997-08-22 21:26:19 +00002733 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002734 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002735
2736 else if (PyClass_Check(type))
2737 PyErr_NormalizeException(&type, &value, &tb);
2738
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002740 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 if (value != Py_None) {
2742 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002743 "instance exception may not have a separate value");
2744 goto raise_error;
2745 }
2746 else {
2747 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002749 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2751 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002752 }
2753 }
2754 else {
2755 /* Not something you can raise. You get an exception
2756 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002757 PyErr_Format(PyExc_TypeError,
2758 "exceptions must be strings, classes, or "
2759 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002760 goto raise_error;
2761 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002763 if (tb == NULL)
2764 return WHY_EXCEPTION;
2765 else
2766 return WHY_RERAISE;
2767 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 Py_XDECREF(value);
2769 Py_XDECREF(type);
2770 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002771 return WHY_EXCEPTION;
2772}
2773
Tim Petersd6d010b2001-06-21 02:49:55 +00002774/* Iterate v argcnt times and store the results on the stack (via decreasing
2775 sp). Return 1 for success, 0 if error. */
2776
Barry Warsawe42b18f1997-08-25 22:13:04 +00002777static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002778unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002779{
Tim Petersd6d010b2001-06-21 02:49:55 +00002780 int i = 0;
2781 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002782 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002783
Tim Petersd6d010b2001-06-21 02:49:55 +00002784 assert(v != NULL);
2785
2786 it = PyObject_GetIter(v);
2787 if (it == NULL)
2788 goto Error;
2789
2790 for (; i < argcnt; i++) {
2791 w = PyIter_Next(it);
2792 if (w == NULL) {
2793 /* Iterator done, via error or exhaustion. */
2794 if (!PyErr_Occurred()) {
2795 PyErr_Format(PyExc_ValueError,
2796 "need more than %d value%s to unpack",
2797 i, i == 1 ? "" : "s");
2798 }
2799 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002800 }
2801 *--sp = w;
2802 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002803
2804 /* We better have exhausted the iterator now. */
2805 w = PyIter_Next(it);
2806 if (w == NULL) {
2807 if (PyErr_Occurred())
2808 goto Error;
2809 Py_DECREF(it);
2810 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002811 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002812 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002813 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002814 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002815Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002816 for (; i > 0; i--, sp++)
2817 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002818 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002819 return 0;
2820}
2821
2822
Guido van Rossum96a42c81992-01-12 02:29:51 +00002823#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002824static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002825prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002827 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 if (PyObject_Print(v, stdout, 0) != 0)
2829 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002830 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002831 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002833#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002835static void
Fred Drake5755ce62001-06-27 19:19:46 +00002836call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002837{
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002839 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002841 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 value = Py_None;
2843 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002844 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002845 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002846 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002847 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002848 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002849 }
Fred Drake5755ce62001-06-27 19:19:46 +00002850 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002851 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002852 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002853 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002854 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002855 Py_XDECREF(type);
2856 Py_XDECREF(value);
2857 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002858 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002859}
2860
Fred Drake4ec5d562001-10-04 19:26:43 +00002861static void
2862call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2863 int what)
2864{
2865 PyObject *type, *value, *traceback;
2866 int err;
2867 PyErr_Fetch(&type, &value, &traceback);
2868 err = call_trace(func, obj, frame, what, NULL);
2869 if (err == 0)
2870 PyErr_Restore(type, value, traceback);
2871 else {
2872 Py_XDECREF(type);
2873 Py_XDECREF(value);
2874 Py_XDECREF(traceback);
2875 }
2876}
2877
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002878static int
Fred Drake5755ce62001-06-27 19:19:46 +00002879call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2880 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002881{
Fred Drake5755ce62001-06-27 19:19:46 +00002882 register PyThreadState *tstate = frame->f_tstate;
2883 int result;
2884 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002885 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002886 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002887 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002888 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002889 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2890 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002891 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002892 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002893}
2894
Fred Drake5755ce62001-06-27 19:19:46 +00002895void
2896PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002897{
Fred Drake5755ce62001-06-27 19:19:46 +00002898 PyThreadState *tstate = PyThreadState_Get();
2899 PyObject *temp = tstate->c_profileobj;
2900 Py_XINCREF(arg);
2901 tstate->c_profilefunc = NULL;
2902 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002903 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002904 Py_XDECREF(temp);
2905 tstate->c_profilefunc = func;
2906 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002907 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002908}
2909
2910void
2911PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2912{
2913 PyThreadState *tstate = PyThreadState_Get();
2914 PyObject *temp = tstate->c_traceobj;
2915 Py_XINCREF(arg);
2916 tstate->c_tracefunc = NULL;
2917 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002918 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002919 Py_XDECREF(temp);
2920 tstate->c_tracefunc = func;
2921 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002922 tstate->use_tracing = ((func != NULL)
2923 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002924}
2925
Guido van Rossumb209a111997-04-29 18:18:01 +00002926PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002928{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002929 PyThreadState *tstate = PyThreadState_Get();
2930 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002931 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002932 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002933 else
2934 return current_frame->f_builtins;
2935}
2936
Guido van Rossumb209a111997-04-29 18:18:01 +00002937PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002938PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002939{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002940 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002941 if (current_frame == NULL)
2942 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002943 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002944 return current_frame->f_locals;
2945}
2946
Guido van Rossumb209a111997-04-29 18:18:01 +00002947PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002948PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002949{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002950 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002951 if (current_frame == NULL)
2952 return NULL;
2953 else
2954 return current_frame->f_globals;
2955}
2956
Guido van Rossumb209a111997-04-29 18:18:01 +00002957PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002958PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002959{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002960 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002961 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002962}
2963
Guido van Rossum6135a871995-01-09 17:53:26 +00002964int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002966{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002967 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002968 return current_frame == NULL ? 0 : current_frame->f_restricted;
2969}
2970
Guido van Rossumbe270261997-05-22 22:26:18 +00002971int
Tim Peters5ba58662001-07-16 02:29:45 +00002972PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002973{
2974 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002975 int result = 0;
2976
2977 if (current_frame != NULL) {
2978 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002979 const int compilerflags = codeflags & PyCF_MASK;
2980 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002981 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002982 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002983 }
2984 }
2985 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002986}
2987
2988int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002989Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990{
Guido van Rossumb209a111997-04-29 18:18:01 +00002991 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002992 if (f == NULL)
2993 return 0;
2994 if (!PyFile_SoftSpace(f, 0))
2995 return 0;
2996 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997}
2998
Guido van Rossum3f5da241990-12-20 15:06:42 +00002999
Guido van Rossum681d79a1995-07-18 14:51:37 +00003000/* External interface to call any callable object.
3001 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003002
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003003#undef PyEval_CallObject
3004/* for backward compatibility: export this interface */
3005
Guido van Rossumb209a111997-04-29 18:18:01 +00003006PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003007PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003008{
Guido van Rossumb209a111997-04-29 18:18:01 +00003009 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003010}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003011#define PyEval_CallObject(func,arg) \
3012 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003013
Guido van Rossumb209a111997-04-29 18:18:01 +00003014PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003015PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003016{
Jeremy Hylton52820442001-01-03 23:52:36 +00003017 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018
3019 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 arg = PyTuple_New(0);
3021 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003022 PyErr_SetString(PyExc_TypeError,
3023 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003024 return NULL;
3025 }
3026 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003027 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003028
Guido van Rossumb209a111997-04-29 18:18:01 +00003029 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003030 PyErr_SetString(PyExc_TypeError,
3031 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003032 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003033 return NULL;
3034 }
3035
Tim Peters6d6c1a32001-08-02 04:15:00 +00003036 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003037 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003038 return result;
3039}
3040
Tim Peters6d6c1a32001-08-02 04:15:00 +00003041char *
3042PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003043{
3044 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003045 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003046 else if (PyFunction_Check(func))
3047 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3048 else if (PyCFunction_Check(func))
3049 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3050 else if (PyClass_Check(func))
3051 return PyString_AsString(((PyClassObject*)func)->cl_name);
3052 else if (PyInstance_Check(func)) {
3053 return PyString_AsString(
3054 ((PyInstanceObject*)func)->in_class->cl_name);
3055 } else {
3056 return func->ob_type->tp_name;
3057 }
3058}
3059
Tim Peters6d6c1a32001-08-02 04:15:00 +00003060char *
3061PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003062{
3063 if (PyMethod_Check(func))
3064 return "()";
3065 else if (PyFunction_Check(func))
3066 return "()";
3067 else if (PyCFunction_Check(func))
3068 return "()";
3069 else if (PyClass_Check(func))
3070 return " constructor";
3071 else if (PyInstance_Check(func)) {
3072 return " instance";
3073 } else {
3074 return " object";
3075 }
3076}
3077
Jeremy Hylton52820442001-01-03 23:52:36 +00003078#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3079
3080/* The two fast_xxx() functions optimize calls for which no argument
3081 tuple is necessary; the objects are passed directly from the stack.
3082 fast_cfunction() is called for METH_OLDARGS functions.
3083 fast_function() is for functions with no special argument handling.
3084*/
3085
3086static PyObject *
3087fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3088{
3089 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3090 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003091 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003092
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003093 switch (flags) {
3094 case METH_OLDARGS:
3095 if (na == 0)
3096 return (*meth)(self, NULL);
3097 else if (na == 1) {
3098 PyObject *arg = EXT_POP(*pp_stack);
3099 PyObject *result = (*meth)(self, arg);
3100 Py_DECREF(arg);
3101 return result;
3102 } else {
3103 PyObject *args = load_args(pp_stack, na);
3104 PyObject *result = (*meth)(self, args);
3105 Py_DECREF(args);
3106 return result;
3107 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003108 case METH_NOARGS:
3109 if (na == 0)
3110 return (*meth)(self, NULL);
3111 PyErr_Format(PyExc_TypeError,
3112 "%.200s() takes no arguments (%d given)",
3113 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3114 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003115 case METH_O:
3116 if (na == 1) {
3117 PyObject *arg = EXT_POP(*pp_stack);
3118 PyObject *result = (*meth)(self, arg);
3119 Py_DECREF(arg);
3120 return result;
3121 }
3122 PyErr_Format(PyExc_TypeError,
3123 "%.200s() takes exactly one argument (%d given)",
3124 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3125 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003126 default:
3127 fprintf(stderr, "%.200s() flags = %d\n",
3128 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3129 PyErr_BadInternalCall();
3130 return NULL;
3131 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003132}
3133
3134static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003135fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003136{
3137 PyObject *co = PyFunction_GET_CODE(func);
3138 PyObject *globals = PyFunction_GET_GLOBALS(func);
3139 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003140 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003141 PyObject **d = NULL;
3142 int nd = 0;
3143
3144 if (argdefs != NULL) {
3145 d = &PyTuple_GET_ITEM(argdefs, 0);
3146 nd = ((PyTupleObject *)argdefs)->ob_size;
3147 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003148 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003149 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003150 (*pp_stack)-2*nk, nk, d, nd,
3151 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003152}
3153
3154static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003155update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3156 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003157{
3158 PyObject *kwdict = NULL;
3159 if (orig_kwdict == NULL)
3160 kwdict = PyDict_New();
3161 else {
3162 kwdict = PyDict_Copy(orig_kwdict);
3163 Py_DECREF(orig_kwdict);
3164 }
3165 if (kwdict == NULL)
3166 return NULL;
3167 while (--nk >= 0) {
3168 int err;
3169 PyObject *value = EXT_POP(*pp_stack);
3170 PyObject *key = EXT_POP(*pp_stack);
3171 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003172 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003173 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003174 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003175 PyEval_GetFuncName(func),
3176 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003177 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003178 Py_DECREF(key);
3179 Py_DECREF(value);
3180 Py_DECREF(kwdict);
3181 return NULL;
3182 }
3183 err = PyDict_SetItem(kwdict, key, value);
3184 Py_DECREF(key);
3185 Py_DECREF(value);
3186 if (err) {
3187 Py_DECREF(kwdict);
3188 return NULL;
3189 }
3190 }
3191 return kwdict;
3192}
3193
3194static PyObject *
3195update_star_args(int nstack, int nstar, PyObject *stararg,
3196 PyObject ***pp_stack)
3197{
3198 PyObject *callargs, *w;
3199
3200 callargs = PyTuple_New(nstack + nstar);
3201 if (callargs == NULL) {
3202 return NULL;
3203 }
3204 if (nstar) {
3205 int i;
3206 for (i = 0; i < nstar; i++) {
3207 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3208 Py_INCREF(a);
3209 PyTuple_SET_ITEM(callargs, nstack + i, a);
3210 }
3211 }
3212 while (--nstack >= 0) {
3213 w = EXT_POP(*pp_stack);
3214 PyTuple_SET_ITEM(callargs, nstack, w);
3215 }
3216 return callargs;
3217}
3218
3219static PyObject *
3220load_args(PyObject ***pp_stack, int na)
3221{
3222 PyObject *args = PyTuple_New(na);
3223 PyObject *w;
3224
3225 if (args == NULL)
3226 return NULL;
3227 while (--na >= 0) {
3228 w = EXT_POP(*pp_stack);
3229 PyTuple_SET_ITEM(args, na, w);
3230 }
3231 return args;
3232}
3233
3234static PyObject *
3235do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3236{
3237 PyObject *callargs = NULL;
3238 PyObject *kwdict = NULL;
3239 PyObject *result = NULL;
3240
3241 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003242 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003243 if (kwdict == NULL)
3244 goto call_fail;
3245 }
3246 callargs = load_args(pp_stack, na);
3247 if (callargs == NULL)
3248 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003249 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003250 call_fail:
3251 Py_XDECREF(callargs);
3252 Py_XDECREF(kwdict);
3253 return result;
3254}
3255
3256static PyObject *
3257ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3258{
3259 int nstar = 0;
3260 PyObject *callargs = NULL;
3261 PyObject *stararg = NULL;
3262 PyObject *kwdict = NULL;
3263 PyObject *result = NULL;
3264
3265 if (flags & CALL_FLAG_KW) {
3266 kwdict = EXT_POP(*pp_stack);
3267 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003268 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003269 "%s%s argument after ** "
3270 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003271 PyEval_GetFuncName(func),
3272 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003273 goto ext_call_fail;
3274 }
3275 }
3276 if (flags & CALL_FLAG_VAR) {
3277 stararg = EXT_POP(*pp_stack);
3278 if (!PyTuple_Check(stararg)) {
3279 PyObject *t = NULL;
3280 t = PySequence_Tuple(stararg);
3281 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003282 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3283 PyErr_Format(PyExc_TypeError,
3284 "%s%s argument after * "
3285 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003286 PyEval_GetFuncName(func),
3287 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003288 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003289 goto ext_call_fail;
3290 }
3291 Py_DECREF(stararg);
3292 stararg = t;
3293 }
3294 nstar = PyTuple_GET_SIZE(stararg);
3295 }
3296 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003297 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003298 if (kwdict == NULL)
3299 goto ext_call_fail;
3300 }
3301 callargs = update_star_args(na, nstar, stararg, pp_stack);
3302 if (callargs == NULL)
3303 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003304 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003305 ext_call_fail:
3306 Py_XDECREF(callargs);
3307 Py_XDECREF(kwdict);
3308 Py_XDECREF(stararg);
3309 return result;
3310}
3311
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003312#define SLICE_ERROR_MSG \
3313 "standard sequence type does not support step size other than one"
3314
Guido van Rossumb209a111997-04-29 18:18:01 +00003315static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003316loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317{
Guido van Rossumb209a111997-04-29 18:18:01 +00003318 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003319 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003320 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003321 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003322 return NULL;
3323 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003324 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003325 v = (*sq->sq_item)(v, i);
3326 if (v)
3327 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003328 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003329 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003330 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331}
3332
Tim Peterscb479e72001-12-16 19:11:44 +00003333/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3334 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3335 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3336*/
Tim Petersb5196382001-12-16 19:44:20 +00003337/* Note: If v is NULL, return success without storing into *pi. This
3338 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3339 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003340*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003341int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003342_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003343{
Tim Petersb5196382001-12-16 19:44:20 +00003344 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003345 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003346 if (PyInt_Check(v)) {
3347 x = PyInt_AsLong(v);
3348 } else if (PyLong_Check(v)) {
3349 x = PyLong_AsLong(v);
3350 if (x==-1 && PyErr_Occurred()) {
3351 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003352 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003353
Guido van Rossumac7be682001-01-17 15:42:30 +00003354 if (!PyErr_ExceptionMatches(
3355 PyExc_OverflowError)) {
3356 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003357 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003358 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003359 }
3360
Guido van Rossumac7be682001-01-17 15:42:30 +00003361 /* Clear the OverflowError */
3362 PyErr_Clear();
3363
3364 /* It's an overflow error, so we need to
3365 check the sign of the long integer,
3366 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003367 the error. */
3368
3369 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003370 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003371 if (long_zero == NULL)
3372 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003373
3374 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003375 cmp = PyObject_RichCompareBool(v, long_zero,
3376 Py_GT);
3377 Py_DECREF(long_zero);
3378 if (cmp < 0)
3379 return 0;
3380 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003381 x = INT_MAX;
3382 else
3383 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003384 }
3385 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003386 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003387 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003388 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003390 /* Truncate -- very long indices are truncated anyway */
3391 if (x > INT_MAX)
3392 x = INT_MAX;
3393 else if (x < -INT_MAX)
3394 x = 0;
3395 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003397 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398}
3399
Guido van Rossum50d756e2001-08-18 17:43:36 +00003400#undef ISINT
3401#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3402
Guido van Rossumb209a111997-04-29 18:18:01 +00003403static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003404apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003406 PyTypeObject *tp = u->ob_type;
3407 PySequenceMethods *sq = tp->tp_as_sequence;
3408
3409 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3410 int ilow = 0, ihigh = INT_MAX;
3411 if (!_PyEval_SliceIndex(v, &ilow))
3412 return NULL;
3413 if (!_PyEval_SliceIndex(w, &ihigh))
3414 return NULL;
3415 return PySequence_GetSlice(u, ilow, ihigh);
3416 }
3417 else {
3418 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003419 if (slice != NULL) {
3420 PyObject *res = PyObject_GetItem(u, slice);
3421 Py_DECREF(slice);
3422 return res;
3423 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003424 else
3425 return NULL;
3426 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003427}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003428
3429static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003430assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3431 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003433 PyTypeObject *tp = u->ob_type;
3434 PySequenceMethods *sq = tp->tp_as_sequence;
3435
3436 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3437 int ilow = 0, ihigh = INT_MAX;
3438 if (!_PyEval_SliceIndex(v, &ilow))
3439 return -1;
3440 if (!_PyEval_SliceIndex(w, &ihigh))
3441 return -1;
3442 if (x == NULL)
3443 return PySequence_DelSlice(u, ilow, ihigh);
3444 else
3445 return PySequence_SetSlice(u, ilow, ihigh, x);
3446 }
3447 else {
3448 PyObject *slice = PySlice_New(v, w, NULL);
3449 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003450 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003451 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003452 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003453 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003454 res = PyObject_DelItem(u, slice);
3455 Py_DECREF(slice);
3456 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003457 }
3458 else
3459 return -1;
3460 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003461}
3462
Guido van Rossumb209a111997-04-29 18:18:01 +00003463static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003464cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465{
Guido van Rossumac7be682001-01-17 15:42:30 +00003466 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003467 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003468 case IS:
3469 case IS_NOT:
3470 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003471 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003472 res = !res;
3473 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 case IN:
3475 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003476 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003477 if (res < 0)
3478 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003479 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003480 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 break;
3482 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003483 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484 break;
3485 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003486 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003487 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003488 v = res ? Py_True : Py_False;
3489 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490 return v;
3491}
3492
Thomas Wouters52152252000-08-17 22:55:00 +00003493static PyObject *
3494import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003495{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003496 PyObject *x;
3497
3498 x = PyObject_GetAttr(v, name);
3499 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003500 PyErr_Format(PyExc_ImportError,
3501 "cannot import name %.230s",
3502 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003503 }
Thomas Wouters52152252000-08-17 22:55:00 +00003504 return x;
3505}
Guido van Rossumac7be682001-01-17 15:42:30 +00003506
Thomas Wouters52152252000-08-17 22:55:00 +00003507static int
3508import_all_from(PyObject *locals, PyObject *v)
3509{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003510 PyObject *all = PyObject_GetAttrString(v, "__all__");
3511 PyObject *dict, *name, *value;
3512 int skip_leading_underscores = 0;
3513 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003514
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003515 if (all == NULL) {
3516 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3517 return -1; /* Unexpected error */
3518 PyErr_Clear();
3519 dict = PyObject_GetAttrString(v, "__dict__");
3520 if (dict == NULL) {
3521 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3522 return -1;
3523 PyErr_SetString(PyExc_ImportError,
3524 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003525 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003526 }
3527 all = PyMapping_Keys(dict);
3528 Py_DECREF(dict);
3529 if (all == NULL)
3530 return -1;
3531 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003532 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003533
3534 for (pos = 0, err = 0; ; pos++) {
3535 name = PySequence_GetItem(all, pos);
3536 if (name == NULL) {
3537 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3538 err = -1;
3539 else
3540 PyErr_Clear();
3541 break;
3542 }
3543 if (skip_leading_underscores &&
3544 PyString_Check(name) &&
3545 PyString_AS_STRING(name)[0] == '_')
3546 {
3547 Py_DECREF(name);
3548 continue;
3549 }
3550 value = PyObject_GetAttr(v, name);
3551 if (value == NULL)
3552 err = -1;
3553 else
3554 err = PyDict_SetItem(locals, name, value);
3555 Py_DECREF(name);
3556 Py_XDECREF(value);
3557 if (err != 0)
3558 break;
3559 }
3560 Py_DECREF(all);
3561 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003562}
3563
Guido van Rossumb209a111997-04-29 18:18:01 +00003564static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003565build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003566{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003567 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003568
3569 if (PyDict_Check(methods))
3570 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003571 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003572 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003573 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3574 base = PyTuple_GET_ITEM(bases, 0);
3575 metaclass = PyObject_GetAttrString(base, "__class__");
3576 if (metaclass == NULL) {
3577 PyErr_Clear();
3578 metaclass = (PyObject *)base->ob_type;
3579 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003580 }
3581 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003582 else {
3583 PyObject *g = PyEval_GetGlobals();
3584 if (g != NULL && PyDict_Check(g))
3585 metaclass = PyDict_GetItemString(g, "__metaclass__");
3586 if (metaclass == NULL)
3587 metaclass = (PyObject *) &PyClass_Type;
3588 Py_INCREF(metaclass);
3589 }
3590 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3591 Py_DECREF(metaclass);
3592 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003593}
3594
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003595static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003596exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3597 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003598{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003599 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003600 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003601 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003602
Guido van Rossumb209a111997-04-29 18:18:01 +00003603 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3604 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003605 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003606 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003607 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003608 locals = PyTuple_GetItem(prog, 2);
3609 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003610 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003611 if (globals == Py_None) {
3612 globals = PyEval_GetGlobals();
3613 if (locals == Py_None) {
3614 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003615 plain = 1;
3616 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003617 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003618 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003619 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003620 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003621 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003622 !PyCode_Check(prog) &&
3623 !PyFile_Check(prog)) {
3624 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003625 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003626 return -1;
3627 }
Fred Drake661ea262000-10-24 19:57:45 +00003628 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003629 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003630 "exec: arg 2 must be a dictionary or None");
3631 return -1;
3632 }
3633 if (!PyDict_Check(locals)) {
3634 PyErr_SetString(PyExc_TypeError,
3635 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003636 return -1;
3637 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003638 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003639 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003640 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003641 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3642 PyErr_SetString(PyExc_TypeError,
3643 "code object passed to exec may not contain free variables");
3644 return -1;
3645 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003646 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003647 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003648 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003649 FILE *fp = PyFile_AsFile(prog);
3650 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003651 PyCompilerFlags cf;
3652 cf.cf_flags = 0;
3653 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003654 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3655 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003656 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003657 v = PyRun_File(fp, name, Py_file_input, globals,
3658 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003659 }
3660 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003661 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003662 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003663 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003664 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003665 cf.cf_flags = 0;
3666 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003667 v = PyRun_StringFlags(str, Py_file_input, globals,
3668 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003669 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003670 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003671 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003672 if (plain)
3673 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003674 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003675 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003676 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003677 return 0;
3678}
Guido van Rossum24c13741995-02-14 09:42:43 +00003679
Guido van Rossumac7be682001-01-17 15:42:30 +00003680static void
Paul Prescode68140d2000-08-30 20:25:01 +00003681format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3682{
3683 char *obj_str;
3684
3685 if (!obj)
3686 return;
3687
3688 obj_str = PyString_AsString(obj);
3689 if (!obj_str)
3690 return;
3691
3692 PyErr_Format(exc, format_str, obj_str);
3693}
Guido van Rossum950361c1997-01-24 13:49:28 +00003694
3695#ifdef DYNAMIC_EXECUTION_PROFILE
3696
Skip Montanarof118cb12001-10-15 20:51:38 +00003697static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003698getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003699{
3700 int i;
3701 PyObject *l = PyList_New(256);
3702 if (l == NULL) return NULL;
3703 for (i = 0; i < 256; i++) {
3704 PyObject *x = PyInt_FromLong(a[i]);
3705 if (x == NULL) {
3706 Py_DECREF(l);
3707 return NULL;
3708 }
3709 PyList_SetItem(l, i, x);
3710 }
3711 for (i = 0; i < 256; i++)
3712 a[i] = 0;
3713 return l;
3714}
3715
3716PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003717_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003718{
3719#ifndef DXPAIRS
3720 return getarray(dxp);
3721#else
3722 int i;
3723 PyObject *l = PyList_New(257);
3724 if (l == NULL) return NULL;
3725 for (i = 0; i < 257; i++) {
3726 PyObject *x = getarray(dxpairs[i]);
3727 if (x == NULL) {
3728 Py_DECREF(l);
3729 return NULL;
3730 }
3731 PyList_SetItem(l, i, x);
3732 }
3733 return l;
3734#endif
3735}
3736
3737#endif