blob: e7ca82bc1a422d2648fe04709fc79c17163822d3 [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
Tim Petersb6d14da2001-12-19 04:11:07 +0000500 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000501 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000502 register int opcode=0; /* Current opcode */
503 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000504 register enum why_code why; /* Reason for block stack unwind */
505 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000506 register PyObject *x; /* Result object -- NULL if error */
507 register PyObject *v; /* Temporary objects popped off stack */
508 register PyObject *w;
509 register PyObject *u;
510 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000511 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000512 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000513 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000514 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000515 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000518 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000520#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000522 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000523#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000524
525/* Code access macros */
526
527#define GETCONST(i) Getconst(f, i)
528#define GETNAME(i) Getname(f, i)
529#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000530#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000531#define NEXTOP() (*next_instr++)
532#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000533#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#define JUMPBY(x) (next_instr += (x))
535
536/* Stack manipulation macros */
537
538#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
539#define EMPTY() (STACK_LEVEL() == 0)
540#define TOP() (stack_pointer[-1])
541#define BASIC_PUSH(v) (*stack_pointer++ = (v))
542#define BASIC_POP() (*--stack_pointer)
543
Guido van Rossum96a42c81992-01-12 02:29:51 +0000544#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000545#define PUSH(v) { (void)(BASIC_PUSH(v), \
546 lltrace && prtrace(TOP(), "push")); \
547 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000548#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000549#else
550#define PUSH(v) BASIC_PUSH(v)
551#define POP() BASIC_POP()
552#endif
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000557#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 GETLOCAL(i) = value; } while (0)
559
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560/* Start of code */
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 if (f == NULL)
563 return NULL;
564
Guido van Rossum8861b741996-07-30 16:49:37 +0000565#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000567 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570#endif
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000573 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000576 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000577 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 co = f->f_code;
583 fastlocals = f->f_localsplus;
584 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000585 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000587 stack_pointer = f->f_stacktop;
588 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000589 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000590
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000591 if (tstate->use_tracing) {
592 if (tstate->c_tracefunc != NULL) {
593 /* tstate->c_tracefunc, if defined, is a
594 function that will be called on *every* entry
595 to a code block. Its return value, if not
596 None, is a function that will be called at
597 the start of each executed line of code.
598 (Actually, the function must return itself
599 in order to continue tracing.) The trace
600 functions are called with three arguments:
601 a pointer to the current frame, a string
602 indicating why the function is called, and
603 an argument which depends on the situation.
604 The global trace function is also called
605 whenever an exception is detected. */
606 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
607 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000608 /* Trace function raised an error */
609 return NULL;
610 }
611 }
612 if (tstate->c_profilefunc != NULL) {
613 /* Similar for c_profilefunc, except it needn't
614 return itself and isn't called for "line" events */
615 if (call_trace(tstate->c_profilefunc,
616 tstate->c_profileobj,
617 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000618 /* Profile function raised an error */
619 return NULL;
620 }
621 }
622 }
623
Tim Peters5ca576e2001-06-18 22:08:13 +0000624#ifdef LLTRACE
625 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
626#endif
627#if defined(Py_DEBUG) || defined(LLTRACE)
628 filename = PyString_AsString(co->co_filename);
629#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000630
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 why = WHY_NOT;
632 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000633 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000634 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000637 assert(stack_pointer >= f->f_valuestack); /* else underflow */
638 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000639 /* Do periodic things. Doing this every time through
640 the loop would add too much overhead, so we do it
641 only every Nth instruction. We also do it if
642 ``things_to_do'' is set, i.e. when an asynchronous
643 event needs attention (e.g. a signal handler or
644 async I/O handler); see Py_AddPendingCall() and
645 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000646
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000648 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000649 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000650 if (Py_MakePendingCalls() < 0) {
651 why = WHY_EXCEPTION;
652 goto on_error;
653 }
654 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000655#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000656 /* If we have true signals, the signal handler
657 will call Py_AddPendingCall() so we don't
658 have to call sigcheck(). On the Mac and
659 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000660 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 goto on_error;
663 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000664#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665
Guido van Rossume59214e1994-08-30 08:01:59 +0000666#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 if (interpreter_lock) {
668 /* Give another thread a chance */
669
Guido van Rossum25ce5661997-08-02 03:10:38 +0000670 if (PyThreadState_Swap(NULL) != tstate)
671 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000672 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673
674 /* Other threads may run now */
675
Guido van Rossum65d5b571998-12-21 19:32:43 +0000676 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000677 if (PyThreadState_Swap(tstate) != NULL)
678 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 }
680#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000684
Guido van Rossum408027e1996-12-30 16:17:54 +0000685#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000686 f->f_lasti = INSTR_OFFSET();
687#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000688
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 opcode = NEXTOP();
690 if (HAS_ARG(opcode))
691 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000692 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000693#ifdef DYNAMIC_EXECUTION_PROFILE
694#ifdef DXPAIRS
695 dxpairs[lastopcode][opcode]++;
696 lastopcode = opcode;
697#endif
698 dxp[opcode]++;
699#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000700
Guido van Rossum96a42c81992-01-12 02:29:51 +0000701#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000703
Guido van Rossum96a42c81992-01-12 02:29:51 +0000704 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 if (HAS_ARG(opcode)) {
706 printf("%d: %d, %d\n",
707 (int) (INSTR_OFFSET() - 3),
708 opcode, oparg);
709 }
710 else {
711 printf("%d: %d\n",
712 (int) (INSTR_OFFSET() - 1), opcode);
713 }
714 }
715#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000717
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000719
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 /* BEWARE!
721 It is essential that any operation that fails sets either
722 x to NULL, err to nonzero, or why to anything but WHY_NOT,
723 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000724
Guido van Rossum374a9221991-04-04 10:40:29 +0000725 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000726
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 case POP_TOP:
728 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000729 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000730 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000731
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 case ROT_TWO:
733 v = POP();
734 w = POP();
735 PUSH(v);
736 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000737 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000738
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 case ROT_THREE:
740 v = POP();
741 w = POP();
742 x = POP();
743 PUSH(v);
744 PUSH(x);
745 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000747
Thomas Wouters434d0822000-08-24 20:11:32 +0000748 case ROT_FOUR:
749 u = POP();
750 v = POP();
751 w = POP();
752 x = POP();
753 PUSH(u);
754 PUSH(x);
755 PUSH(w);
756 PUSH(v);
757 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000758
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 case DUP_TOP:
760 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000761 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000764
Thomas Wouters434d0822000-08-24 20:11:32 +0000765 case DUP_TOPX:
766 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000767 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000768 x = TOP();
769 Py_INCREF(x);
770 PUSH(x);
771 continue;
772 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000773 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000774 Py_INCREF(x);
775 w = TOP();
776 Py_INCREF(w);
777 PUSH(x);
778 PUSH(w);
779 PUSH(x);
780 continue;
781 case 3:
782 x = POP();
783 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000784 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000785 Py_INCREF(w);
786 v = TOP();
787 Py_INCREF(v);
788 PUSH(w);
789 PUSH(x);
790 PUSH(v);
791 PUSH(w);
792 PUSH(x);
793 continue;
794 case 4:
795 x = POP();
796 Py_INCREF(x);
797 w = POP();
798 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000800 Py_INCREF(v);
801 u = TOP();
802 Py_INCREF(u);
803 PUSH(v);
804 PUSH(w);
805 PUSH(x);
806 PUSH(u);
807 PUSH(v);
808 PUSH(w);
809 PUSH(x);
810 continue;
811 case 5:
812 x = POP();
813 Py_INCREF(x);
814 w = POP();
815 Py_INCREF(w);
816 v = POP();
817 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000818 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000819 Py_INCREF(u);
820 t = TOP();
821 Py_INCREF(t);
822 PUSH(u);
823 PUSH(v);
824 PUSH(w);
825 PUSH(x);
826 PUSH(t);
827 PUSH(u);
828 PUSH(v);
829 PUSH(w);
830 PUSH(x);
831 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000832 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000833 Py_FatalError("invalid argument to DUP_TOPX"
834 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000835 }
Tim Peters35ba6892000-10-11 07:04:49 +0000836 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000837
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 case UNARY_POSITIVE:
839 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000840 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000841 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000843 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000845
Guido van Rossum374a9221991-04-04 10:40:29 +0000846 case UNARY_NEGATIVE:
847 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000848 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000849 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000851 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000853
Guido van Rossum374a9221991-04-04 10:40:29 +0000854 case UNARY_NOT:
855 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000857 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000858 if (err == 0) {
859 Py_INCREF(Py_True);
860 PUSH(Py_True);
861 continue;
862 }
863 else if (err > 0) {
864 Py_INCREF(Py_False);
865 PUSH(Py_False);
866 err = 0;
867 continue;
868 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000870
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 case UNARY_CONVERT:
872 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000873 x = PyObject_Repr(v);
874 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000876 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000878
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 case UNARY_INVERT:
880 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000881 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000882 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000884 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000885 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000886
Guido van Rossum50564e81996-01-12 01:13:16 +0000887 case BINARY_POWER:
888 w = POP();
889 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000890 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
892 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000895 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000896
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 case BINARY_MULTIPLY:
898 w = POP();
899 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
902 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000904 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000906
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000908 if (!_Py_QnewFlag) {
909 w = POP();
910 v = POP();
911 x = PyNumber_Divide(v, w);
912 Py_DECREF(v);
913 Py_DECREF(w);
914 PUSH(x);
915 if (x != NULL) continue;
916 break;
917 }
918 /* -Qnew is in effect: fall through to
919 BINARY_TRUE_DIVIDE */
920 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 w = POP();
922 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000923 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 Py_DECREF(v);
925 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000927 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000929
Guido van Rossum4668b002001-08-08 05:00:18 +0000930 case BINARY_FLOOR_DIVIDE:
931 w = POP();
932 v = POP();
933 x = PyNumber_FloorDivide(v, w);
934 Py_DECREF(v);
935 Py_DECREF(w);
936 PUSH(x);
937 if (x != NULL) continue;
938 break;
939
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 case BINARY_MODULO:
941 w = POP();
942 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000943 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000944 Py_DECREF(v);
945 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000947 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000949
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 case BINARY_ADD:
951 w = POP();
952 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000953 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000954 /* INLINE: int + int */
955 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000956 a = PyInt_AS_LONG(v);
957 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000958 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000959 if ((i^a) < 0 && (i^b) < 0)
960 goto slow_add;
961 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000962 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000963 else {
964 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000965 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000966 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000967 Py_DECREF(v);
968 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000970 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000972
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 case BINARY_SUBTRACT:
974 w = POP();
975 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000976 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000977 /* INLINE: int - int */
978 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000979 a = PyInt_AS_LONG(v);
980 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000981 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000982 if ((i^a) < 0 && (i^~b) < 0)
983 goto slow_sub;
984 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000985 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000986 else {
987 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000988 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000989 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000990 Py_DECREF(v);
991 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000993 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000995
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 case BINARY_SUBSCR:
997 w = POP();
998 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +0000999 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001000 /* INLINE: list[int] */
1001 long i = PyInt_AsLong(w);
1002 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 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001005 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 PyErr_SetString(PyExc_IndexError,
1007 "list index out of range");
1008 x = NULL;
1009 }
1010 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001011 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001012 Py_INCREF(x);
1013 }
1014 }
1015 else
1016 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001017 Py_DECREF(v);
1018 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001020 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001022
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 case BINARY_LSHIFT:
1024 w = POP();
1025 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001026 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001027 Py_DECREF(v);
1028 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001030 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001032
Guido van Rossum7928cd71991-10-24 14:59:31 +00001033 case BINARY_RSHIFT:
1034 w = POP();
1035 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001036 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 Py_DECREF(v);
1038 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001040 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001041 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001042
Guido van Rossum7928cd71991-10-24 14:59:31 +00001043 case BINARY_AND:
1044 w = POP();
1045 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001046 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001047 Py_DECREF(v);
1048 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001050 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001051 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001052
Guido van Rossum7928cd71991-10-24 14:59:31 +00001053 case BINARY_XOR:
1054 w = POP();
1055 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001056 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001057 Py_DECREF(v);
1058 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001059 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001060 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001061 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001062
Guido van Rossum7928cd71991-10-24 14:59:31 +00001063 case BINARY_OR:
1064 w = POP();
1065 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001066 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001067 Py_DECREF(v);
1068 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001069 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001070 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001071 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001072
1073 case INPLACE_POWER:
1074 w = POP();
1075 v = POP();
1076 x = PyNumber_InPlacePower(v, w, Py_None);
1077 Py_DECREF(v);
1078 Py_DECREF(w);
1079 PUSH(x);
1080 if (x != NULL) continue;
1081 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001082
Thomas Wouters434d0822000-08-24 20:11:32 +00001083 case INPLACE_MULTIPLY:
1084 w = POP();
1085 v = POP();
1086 x = PyNumber_InPlaceMultiply(v, w);
1087 Py_DECREF(v);
1088 Py_DECREF(w);
1089 PUSH(x);
1090 if (x != NULL) continue;
1091 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001092
Thomas Wouters434d0822000-08-24 20:11:32 +00001093 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001094 if (!_Py_QnewFlag) {
1095 w = POP();
1096 v = POP();
1097 x = PyNumber_InPlaceDivide(v, w);
1098 Py_DECREF(v);
1099 Py_DECREF(w);
1100 PUSH(x);
1101 if (x != NULL) continue;
1102 break;
1103 }
1104 /* -Qnew is in effect: fall through to
1105 INPLACE_TRUE_DIVIDE */
1106 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001107 w = POP();
1108 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001109 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001110 Py_DECREF(v);
1111 Py_DECREF(w);
1112 PUSH(x);
1113 if (x != NULL) continue;
1114 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001115
Guido van Rossum4668b002001-08-08 05:00:18 +00001116 case INPLACE_FLOOR_DIVIDE:
1117 w = POP();
1118 v = POP();
1119 x = PyNumber_InPlaceFloorDivide(v, w);
1120 Py_DECREF(v);
1121 Py_DECREF(w);
1122 PUSH(x);
1123 if (x != NULL) continue;
1124 break;
1125
Thomas Wouters434d0822000-08-24 20:11:32 +00001126 case INPLACE_MODULO:
1127 w = POP();
1128 v = POP();
1129 x = PyNumber_InPlaceRemainder(v, w);
1130 Py_DECREF(v);
1131 Py_DECREF(w);
1132 PUSH(x);
1133 if (x != NULL) continue;
1134 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001135
Thomas Wouters434d0822000-08-24 20:11:32 +00001136 case INPLACE_ADD:
1137 w = POP();
1138 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001139 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001140 /* INLINE: int + int */
1141 register long a, b, i;
1142 a = PyInt_AS_LONG(v);
1143 b = PyInt_AS_LONG(w);
1144 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001145 if ((i^a) < 0 && (i^b) < 0)
1146 goto slow_iadd;
1147 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001149 else {
1150 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001152 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001153 Py_DECREF(v);
1154 Py_DECREF(w);
1155 PUSH(x);
1156 if (x != NULL) continue;
1157 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001158
Thomas Wouters434d0822000-08-24 20:11:32 +00001159 case INPLACE_SUBTRACT:
1160 w = POP();
1161 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001162 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001163 /* INLINE: int - int */
1164 register long a, b, i;
1165 a = PyInt_AS_LONG(v);
1166 b = PyInt_AS_LONG(w);
1167 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001168 if ((i^a) < 0 && (i^~b) < 0)
1169 goto slow_isub;
1170 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001171 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001172 else {
1173 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001174 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001175 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001176 Py_DECREF(v);
1177 Py_DECREF(w);
1178 PUSH(x);
1179 if (x != NULL) continue;
1180 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001181
Thomas Wouters434d0822000-08-24 20:11:32 +00001182 case INPLACE_LSHIFT:
1183 w = POP();
1184 v = POP();
1185 x = PyNumber_InPlaceLshift(v, w);
1186 Py_DECREF(v);
1187 Py_DECREF(w);
1188 PUSH(x);
1189 if (x != NULL) continue;
1190 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001191
Thomas Wouters434d0822000-08-24 20:11:32 +00001192 case INPLACE_RSHIFT:
1193 w = POP();
1194 v = POP();
1195 x = PyNumber_InPlaceRshift(v, w);
1196 Py_DECREF(v);
1197 Py_DECREF(w);
1198 PUSH(x);
1199 if (x != NULL) continue;
1200 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001201
Thomas Wouters434d0822000-08-24 20:11:32 +00001202 case INPLACE_AND:
1203 w = POP();
1204 v = POP();
1205 x = PyNumber_InPlaceAnd(v, w);
1206 Py_DECREF(v);
1207 Py_DECREF(w);
1208 PUSH(x);
1209 if (x != NULL) continue;
1210 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001211
Thomas Wouters434d0822000-08-24 20:11:32 +00001212 case INPLACE_XOR:
1213 w = POP();
1214 v = POP();
1215 x = PyNumber_InPlaceXor(v, w);
1216 Py_DECREF(v);
1217 Py_DECREF(w);
1218 PUSH(x);
1219 if (x != NULL) continue;
1220 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001221
Thomas Wouters434d0822000-08-24 20:11:32 +00001222 case INPLACE_OR:
1223 w = POP();
1224 v = POP();
1225 x = PyNumber_InPlaceOr(v, w);
1226 Py_DECREF(v);
1227 Py_DECREF(w);
1228 PUSH(x);
1229 if (x != NULL) continue;
1230 break;
1231
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 case SLICE+0:
1233 case SLICE+1:
1234 case SLICE+2:
1235 case SLICE+3:
1236 if ((opcode-SLICE) & 2)
1237 w = POP();
1238 else
1239 w = NULL;
1240 if ((opcode-SLICE) & 1)
1241 v = POP();
1242 else
1243 v = NULL;
1244 u = POP();
1245 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001246 Py_DECREF(u);
1247 Py_XDECREF(v);
1248 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001250 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001252
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 case STORE_SLICE+0:
1254 case STORE_SLICE+1:
1255 case STORE_SLICE+2:
1256 case STORE_SLICE+3:
1257 if ((opcode-STORE_SLICE) & 2)
1258 w = POP();
1259 else
1260 w = NULL;
1261 if ((opcode-STORE_SLICE) & 1)
1262 v = POP();
1263 else
1264 v = NULL;
1265 u = POP();
1266 t = POP();
1267 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001268 Py_DECREF(t);
1269 Py_DECREF(u);
1270 Py_XDECREF(v);
1271 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001272 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001274
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 case DELETE_SLICE+0:
1276 case DELETE_SLICE+1:
1277 case DELETE_SLICE+2:
1278 case DELETE_SLICE+3:
1279 if ((opcode-DELETE_SLICE) & 2)
1280 w = POP();
1281 else
1282 w = NULL;
1283 if ((opcode-DELETE_SLICE) & 1)
1284 v = POP();
1285 else
1286 v = NULL;
1287 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 Py_DECREF(u);
1291 Py_XDECREF(v);
1292 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001293 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001295
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 case STORE_SUBSCR:
1297 w = POP();
1298 v = POP();
1299 u = POP();
1300 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001301 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001302 Py_DECREF(u);
1303 Py_DECREF(v);
1304 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001305 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001306 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001307
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 case DELETE_SUBSCR:
1309 w = POP();
1310 v = POP();
1311 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001312 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001313 Py_DECREF(v);
1314 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001315 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001317
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 case PRINT_EXPR:
1319 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001320 w = PySys_GetObject("displayhook");
1321 if (w == NULL) {
1322 PyErr_SetString(PyExc_RuntimeError,
1323 "lost sys.displayhook");
1324 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001325 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001326 }
1327 if (err == 0) {
1328 x = Py_BuildValue("(O)", v);
1329 if (x == NULL)
1330 err = -1;
1331 }
1332 if (err == 0) {
1333 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001334 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001335 if (w == NULL)
1336 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001338 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001339 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001341
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001342 case PRINT_ITEM_TO:
1343 w = stream = POP();
1344 /* fall through to PRINT_ITEM */
1345
Guido van Rossum374a9221991-04-04 10:40:29 +00001346 case PRINT_ITEM:
1347 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001348 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001349 w = PySys_GetObject("stdout");
1350 if (w == NULL) {
1351 PyErr_SetString(PyExc_RuntimeError,
1352 "lost sys.stdout");
1353 err = -1;
1354 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001355 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001356 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001357 err = PyFile_WriteString(" ", w);
1358 if (err == 0)
1359 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001360 if (err == 0) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001361 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001362 if (PyString_Check(v)) {
1363 char *s = PyString_AS_STRING(v);
1364 int len = PyString_GET_SIZE(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001365 if (len > 0 &&
1366 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001367 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001368 PyFile_SoftSpace(w, 0);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001369 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001370#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001371 else if (PyUnicode_Check(v)) {
1372 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1373 int len = PyUnicode_GET_SIZE(v);
1374 if (len > 0 &&
1375 Py_UNICODE_ISSPACE(s[len-1]) &&
1376 s[len-1] != ' ')
1377 PyFile_SoftSpace(w, 0);
1378 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001379#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001381 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001382 Py_XDECREF(stream);
1383 stream = NULL;
1384 if (err == 0)
1385 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001387
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001388 case PRINT_NEWLINE_TO:
1389 w = stream = POP();
1390 /* fall through to PRINT_NEWLINE */
1391
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001393 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001394 w = PySys_GetObject("stdout");
1395 if (w == NULL)
1396 PyErr_SetString(PyExc_RuntimeError,
1397 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001398 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001399 if (w != NULL) {
1400 err = PyFile_WriteString("\n", w);
1401 if (err == 0)
1402 PyFile_SoftSpace(w, 0);
1403 }
1404 Py_XDECREF(stream);
1405 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001407
Thomas Wouters434d0822000-08-24 20:11:32 +00001408
1409#ifdef CASE_TOO_BIG
1410 default: switch (opcode) {
1411#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 case BREAK_LOOP:
1413 why = WHY_BREAK;
1414 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001415
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001416 case CONTINUE_LOOP:
1417 retval = PyInt_FromLong(oparg);
1418 why = WHY_CONTINUE;
1419 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001420
Guido van Rossumf10570b1995-07-07 22:53:21 +00001421 case RAISE_VARARGS:
1422 u = v = w = NULL;
1423 switch (oparg) {
1424 case 3:
1425 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001426 /* Fallthrough */
1427 case 2:
1428 v = POP(); /* value */
1429 /* Fallthrough */
1430 case 1:
1431 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001432 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001433 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001434 break;
1435 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001437 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001438 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001439 break;
1440 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001442
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001444 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001445 PyErr_SetString(PyExc_SystemError,
1446 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001447 break;
1448 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001449 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001450 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001452
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 case RETURN_VALUE:
1454 retval = POP();
1455 why = WHY_RETURN;
1456 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001457
Tim Peters5ca576e2001-06-18 22:08:13 +00001458 case YIELD_VALUE:
1459 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001460 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001461 f->f_lasti = INSTR_OFFSET();
1462 why = WHY_YIELD;
1463 break;
1464
1465
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001466 case EXEC_STMT:
1467 w = POP();
1468 v = POP();
1469 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001470 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001471 Py_DECREF(u);
1472 Py_DECREF(v);
1473 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001474 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001475
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 case POP_BLOCK:
1477 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001478 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 while (STACK_LEVEL() > b->b_level) {
1480 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 }
1483 }
1484 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001485
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 case END_FINALLY:
1487 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 if (PyInt_Check(v)) {
1489 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001490 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001491 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001492 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 retval = POP();
1494 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001497 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001500 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 else if (v != Py_None) {
1503 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 "'finally' pops bad exception");
1505 why = WHY_EXCEPTION;
1506 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001509
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001511 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001513 w = POP();
1514 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001516 Py_DECREF(u);
1517 Py_DECREF(v);
1518 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001520
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 case STORE_NAME:
1522 w = GETNAMEV(oparg);
1523 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001524 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001525 PyErr_Format(PyExc_SystemError,
1526 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001527 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001528 break;
1529 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 err = PyDict_SetItem(x, w, v);
1531 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001533
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001535 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001536 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001537 PyErr_Format(PyExc_SystemError,
1538 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001539 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001540 break;
1541 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001543 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001544 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001546
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001547 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001549 if (PyTuple_Check(v)) {
1550 if (PyTuple_Size(v) != oparg) {
1551 PyErr_SetString(PyExc_ValueError,
1552 "unpack tuple of wrong size");
1553 why = WHY_EXCEPTION;
1554 }
1555 else {
1556 for (; --oparg >= 0; ) {
1557 w = PyTuple_GET_ITEM(v, oparg);
1558 Py_INCREF(w);
1559 PUSH(w);
1560 }
1561 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001563 else if (PyList_Check(v)) {
1564 if (PyList_Size(v) != oparg) {
1565 PyErr_SetString(PyExc_ValueError,
1566 "unpack list of wrong size");
1567 why = WHY_EXCEPTION;
1568 }
1569 else {
1570 for (; --oparg >= 0; ) {
1571 w = PyList_GET_ITEM(v, oparg);
1572 Py_INCREF(w);
1573 PUSH(w);
1574 }
1575 }
1576 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001577 else if (unpack_iterable(v, oparg,
1578 stack_pointer + oparg))
1579 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001580 else {
1581 if (PyErr_ExceptionMatches(PyExc_TypeError))
1582 PyErr_SetString(PyExc_TypeError,
1583 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001584 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001585 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001588
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001590 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 v = POP();
1592 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1594 Py_DECREF(v);
1595 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001597
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001599 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001601 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1602 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001605
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001606 case STORE_GLOBAL:
1607 w = GETNAMEV(oparg);
1608 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001609 err = PyDict_SetItem(f->f_globals, w, v);
1610 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001611 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001612
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001613 case DELETE_GLOBAL:
1614 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001615 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001616 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001617 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001618 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001619
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 case LOAD_CONST:
1621 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001622 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 PUSH(x);
1624 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001625
Guido van Rossum374a9221991-04-04 10:40:29 +00001626 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001627 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001628 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001629 PyErr_Format(PyExc_SystemError,
1630 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001631 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001632 break;
1633 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001640 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001641 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001642 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 break;
1644 }
1645 }
1646 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 PUSH(x);
1649 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001650
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001652 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001657 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001658 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001659 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 break;
1661 }
1662 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 PUSH(x);
1665 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666
Guido van Rossum9bfef441993-03-29 10:43:31 +00001667 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001668 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001669 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001670 format_exc_check_arg(
1671 PyExc_UnboundLocalError,
1672 UNBOUNDLOCAL_ERROR_MSG,
1673 PyTuple_GetItem(co->co_varnames, oparg)
1674 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001675 break;
1676 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001677 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001678 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001679 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001680 break;
1681
1682 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001683 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001684 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001685 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001686
1687 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001688 x = GETLOCAL(oparg);
1689 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001690 format_exc_check_arg(
1691 PyExc_UnboundLocalError,
1692 UNBOUNDLOCAL_ERROR_MSG,
1693 PyTuple_GetItem(co->co_varnames, oparg)
1694 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001695 break;
1696 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001697 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001698 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001699
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001700 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001701 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001702 Py_INCREF(x);
1703 PUSH(x);
1704 break;
1705
1706 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001707 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001708 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001709 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001710 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001711 v = PyTuple_GetItem(co->co_cellvars,
1712 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001713 format_exc_check_arg(
1714 PyExc_UnboundLocalError,
1715 UNBOUNDLOCAL_ERROR_MSG,
1716 v);
1717 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001718 v = PyTuple_GetItem(
1719 co->co_freevars,
1720 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001721 format_exc_check_arg(
1722 PyExc_NameError,
1723 UNBOUNDFREE_ERROR_MSG,
1724 v);
1725 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001726 err = -1;
1727 break;
1728 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001729 PUSH(w);
1730 break;
1731
1732 case STORE_DEREF:
1733 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001734 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001735 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001736 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001737 continue;
1738
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001740 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 if (x != NULL) {
1742 for (; --oparg >= 0;) {
1743 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001744 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 }
1746 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001747 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 }
1749 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001750
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 if (x != NULL) {
1754 for (; --oparg >= 0;) {
1755 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001756 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 }
1758 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001759 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 }
1761 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001762
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001764 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001766 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001768
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001770 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 x = PyObject_GetAttr(v, w);
1773 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001775 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001777
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 case COMPARE_OP:
1779 w = POP();
1780 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001781 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001782 /* INLINE: cmp(int, int) */
1783 register long a, b;
1784 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001785 a = PyInt_AS_LONG(v);
1786 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001787 switch (oparg) {
1788 case LT: res = a < b; break;
1789 case LE: res = a <= b; break;
1790 case EQ: res = a == b; break;
1791 case NE: res = a != b; break;
1792 case GT: res = a > b; break;
1793 case GE: res = a >= b; break;
1794 case IS: res = v == w; break;
1795 case IS_NOT: res = v != w; break;
1796 default: goto slow_compare;
1797 }
1798 x = res ? Py_True : Py_False;
1799 Py_INCREF(x);
1800 }
1801 else {
1802 slow_compare:
1803 x = cmp_outcome(oparg, v, w);
1804 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001805 Py_DECREF(v);
1806 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001808 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001810
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001813 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001814 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001816 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001817 break;
1818 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001819 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001821 w,
1822 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001823 f->f_locals == NULL ?
1824 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001825 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001827 if (w == NULL) {
1828 x = NULL;
1829 break;
1830 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001831 x = PyEval_CallObject(x, w);
1832 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001833 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001834 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001836
Thomas Wouters52152252000-08-17 22:55:00 +00001837 case IMPORT_STAR:
1838 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001839 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001840 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001841 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001842 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001843 break;
1844 }
Thomas Wouters52152252000-08-17 22:55:00 +00001845 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001847 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001848 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001850
Thomas Wouters52152252000-08-17 22:55:00 +00001851 case IMPORT_FROM:
1852 w = GETNAMEV(oparg);
1853 v = TOP();
1854 x = import_from(v, w);
1855 PUSH(x);
1856 if (x != NULL) continue;
1857 break;
1858
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 case JUMP_FORWARD:
1860 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001861 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001862
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001865 if (err > 0)
1866 err = 0;
1867 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 else
1870 break;
1871 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001872
Guido van Rossum374a9221991-04-04 10:40:29 +00001873 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001875 if (err > 0) {
1876 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001878 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001879 else if (err == 0)
1880 ;
1881 else
1882 break;
1883 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001884
Guido van Rossum374a9221991-04-04 10:40:29 +00001885 case JUMP_ABSOLUTE:
1886 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001887 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001888
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001889 case GET_ITER:
1890 /* before: [obj]; after [getiter(obj)] */
1891 v = POP();
1892 x = PyObject_GetIter(v);
1893 Py_DECREF(v);
1894 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001895 PUSH(x);
1896 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001897 }
1898 break;
1899
1900 case FOR_ITER:
1901 /* before: [iter]; after: [iter, iter()] *or* [] */
1902 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001903 x = PyIter_Next(v);
1904 if (x != NULL) {
1905 PUSH(x);
1906 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001907 }
Tim Petersf4848da2001-05-05 00:14:56 +00001908 if (!PyErr_Occurred()) {
1909 /* iterator ended normally */
1910 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001911 Py_DECREF(v);
1912 JUMPBY(oparg);
1913 continue;
1914 }
1915 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001916
Guido van Rossum374a9221991-04-04 10:40:29 +00001917 case FOR_LOOP:
1918 /* for v in s: ...
1919 On entry: stack contains s, i.
1920 On exit: stack contains s, i+1, s[i];
1921 but if loop exhausted:
1922 s, i are popped, and we jump */
1923 w = POP(); /* Loop index */
1924 v = POP(); /* Sequence object */
1925 u = loop_subscript(v, w);
1926 if (u != NULL) {
1927 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001928 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001929 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001930 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001932 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 }
1934 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001935 Py_DECREF(v);
1936 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001937 /* A NULL can mean "s exhausted"
1938 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001939 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001940 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001941 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001942 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001943 continue;
1944 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001945 }
1946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001947
Guido van Rossum374a9221991-04-04 10:40:29 +00001948 case SETUP_LOOP:
1949 case SETUP_EXCEPT:
1950 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001951 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001952 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001953 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001954
Guido van Rossum374a9221991-04-04 10:40:29 +00001955 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001956#ifdef LLTRACE
1957 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001958 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001959#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001960 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001961 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001962 continue;
1963 /* Trace each line of code reached */
1964 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001965 /* Inline call_trace() for performance: */
1966 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001967 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001968 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1969 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001970 tstate->use_tracing = (tstate->c_tracefunc
1971 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001972 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001973 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001974
1975 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001976 {
1977 int na = oparg & 0xff;
1978 int nk = (oparg>>8) & 0xff;
1979 int n = na + 2 * nk;
1980 PyObject **pfunc = stack_pointer - n - 1;
1981 PyObject *func = *pfunc;
1982 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1983
1984 /* Always dispatch PyCFunction first, because
1985 these are presumed to be the most frequent
1986 callable object.
1987 */
1988 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001989 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001990 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001991 x = do_call(func, &stack_pointer,
1992 na, nk);
1993 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001994 PyObject *callargs;
1995 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001996 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001997 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001998 } else
1999 x = fast_cfunction(func,
2000 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00002001 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00002002 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002003 && PyMethod_GET_SELF(func) != NULL) {
2004 /* optimize access to bound methods */
2005 PyObject *self = PyMethod_GET_SELF(func);
2006 Py_INCREF(self);
2007 func = PyMethod_GET_FUNCTION(func);
2008 Py_INCREF(func);
2009 Py_DECREF(*pfunc);
2010 *pfunc = self;
2011 na++;
2012 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002013 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002014 Py_INCREF(func);
2015 if (PyFunction_Check(func)) {
2016 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002017 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002018 } else {
2019 x = do_call(func, &stack_pointer,
2020 na, nk);
2021 }
2022 Py_DECREF(func);
2023 }
2024
2025 while (stack_pointer > pfunc) {
2026 w = POP();
2027 Py_DECREF(w);
2028 }
2029 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002030 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002031 continue;
2032 break;
2033 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002034
Jeremy Hylton76901512000-03-28 23:49:17 +00002035 case CALL_FUNCTION_VAR:
2036 case CALL_FUNCTION_KW:
2037 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002038 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002039 int na = oparg & 0xff;
2040 int nk = (oparg>>8) & 0xff;
2041 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002042 int n = na + 2 * nk;
2043 PyObject **pfunc, *func;
2044 if (flags & CALL_FLAG_VAR)
2045 n++;
2046 if (flags & CALL_FLAG_KW)
2047 n++;
2048 pfunc = stack_pointer - n - 1;
2049 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002050 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002051
Guido van Rossumac7be682001-01-17 15:42:30 +00002052 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002053 && PyMethod_GET_SELF(func) != NULL) {
2054 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002055 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002056 func = PyMethod_GET_FUNCTION(func);
2057 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002058 Py_DECREF(*pfunc);
2059 *pfunc = self;
2060 na++;
2061 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002062 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002063 Py_INCREF(func);
2064 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002065 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002066
Jeremy Hylton76901512000-03-28 23:49:17 +00002067 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002068 w = POP();
2069 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002070 }
2071 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002072 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002073 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002074 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002075 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002076
Guido van Rossum681d79a1995-07-18 14:51:37 +00002077 case MAKE_FUNCTION:
2078 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002079 x = PyFunction_New(v, f->f_globals);
2080 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002081 /* XXX Maybe this should be a separate opcode? */
2082 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002084 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002085 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002086 x = NULL;
2087 break;
2088 }
2089 while (--oparg >= 0) {
2090 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002091 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002092 }
2093 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002095 }
2096 PUSH(x);
2097 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002098
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002099 case MAKE_CLOSURE:
2100 {
2101 int nfree;
2102 v = POP(); /* code object */
2103 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002104 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002105 Py_DECREF(v);
2106 /* XXX Maybe this should be a separate opcode? */
2107 if (x != NULL && nfree > 0) {
2108 v = PyTuple_New(nfree);
2109 if (v == NULL) {
2110 Py_DECREF(x);
2111 x = NULL;
2112 break;
2113 }
2114 while (--nfree >= 0) {
2115 w = POP();
2116 PyTuple_SET_ITEM(v, nfree, w);
2117 }
2118 err = PyFunction_SetClosure(x, v);
2119 Py_DECREF(v);
2120 }
2121 if (x != NULL && oparg > 0) {
2122 v = PyTuple_New(oparg);
2123 if (v == NULL) {
2124 Py_DECREF(x);
2125 x = NULL;
2126 break;
2127 }
2128 while (--oparg >= 0) {
2129 w = POP();
2130 PyTuple_SET_ITEM(v, oparg, w);
2131 }
2132 err = PyFunction_SetDefaults(x, v);
2133 Py_DECREF(v);
2134 }
2135 PUSH(x);
2136 break;
2137 }
2138
Guido van Rossum8861b741996-07-30 16:49:37 +00002139 case BUILD_SLICE:
2140 if (oparg == 3)
2141 w = POP();
2142 else
2143 w = NULL;
2144 v = POP();
2145 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002146 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 Py_DECREF(u);
2148 Py_DECREF(v);
2149 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002150 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002151 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002152 break;
2153
Fred Drakeef8ace32000-08-24 00:32:09 +00002154 case EXTENDED_ARG:
2155 opcode = NEXTOP();
2156 oparg = oparg<<16 | NEXTARG();
2157 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002158
Guido van Rossum374a9221991-04-04 10:40:29 +00002159 default:
2160 fprintf(stderr,
2161 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002162 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 why = WHY_EXCEPTION;
2165 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002166
2167#ifdef CASE_TOO_BIG
2168 }
2169#endif
2170
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 } /* switch */
2172
2173 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002174
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002176
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002178 if (err == 0 && x != NULL) {
2179#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002180 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182 fprintf(stderr,
2183 "XXX undetected error\n");
2184 else
2185#endif
2186 continue; /* Normal, fast path */
2187 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 err = 0;
2191 }
2192
Guido van Rossum374a9221991-04-04 10:40:29 +00002193 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002194
Guido van Rossum374a9221991-04-04 10:40:29 +00002195 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002197 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002198 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 why = WHY_EXCEPTION;
2200 }
2201 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002202#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002204 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002205 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002206 fprintf(stderr,
2207 "XXX undetected error (why=%d)\n",
2208 why);
2209 why = WHY_EXCEPTION;
2210 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 }
2212#endif
2213
2214 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002215
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002217 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002218 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002219 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002220 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002221
Fred Drake8f51f542001-10-04 14:48:42 +00002222 if (tstate->c_tracefunc != NULL)
2223 call_exc_trace(tstate->c_tracefunc,
2224 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002225 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002226
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002228
Guido van Rossum374a9221991-04-04 10:40:29 +00002229 if (why == WHY_RERAISE)
2230 why = WHY_EXCEPTION;
2231
2232 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002233
Tim Peters5ca576e2001-06-18 22:08:13 +00002234 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002235 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002236
2237 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2238 /* For a continue inside a try block,
2239 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002240 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2241 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002242 why = WHY_NOT;
2243 JUMPTO(PyInt_AS_LONG(retval));
2244 Py_DECREF(retval);
2245 break;
2246 }
2247
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 while (STACK_LEVEL() > b->b_level) {
2249 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002250 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002251 }
2252 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2253 why = WHY_NOT;
2254 JUMPTO(b->b_handler);
2255 break;
2256 }
2257 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002258 (b->b_type == SETUP_EXCEPT &&
2259 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002261 PyObject *exc, *val, *tb;
2262 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002263 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002264 val = Py_None;
2265 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002266 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002267 /* Make the raw exception data
2268 available to the handler,
2269 so a program can emulate the
2270 Python main loop. Don't do
2271 this for 'finally'. */
2272 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002273 PyErr_NormalizeException(
2274 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002275 set_exc_info(tstate,
2276 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002277 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002278 if (tb == NULL) {
2279 Py_INCREF(Py_None);
2280 PUSH(Py_None);
2281 } else
2282 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002283 PUSH(val);
2284 PUSH(exc);
2285 }
2286 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002287 if (why == WHY_RETURN ||
2288 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002289 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002290 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002291 PUSH(v);
2292 }
2293 why = WHY_NOT;
2294 JUMPTO(b->b_handler);
2295 break;
2296 }
2297 } /* unwind stack */
2298
2299 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002300
Guido van Rossum374a9221991-04-04 10:40:29 +00002301 if (why != WHY_NOT)
2302 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002303
Guido van Rossum374a9221991-04-04 10:40:29 +00002304 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002305
Guido van Rossum35974fb2001-12-06 21:28:18 +00002306 if (why != WHY_YIELD) {
2307 /* Pop remaining stack entries -- but when yielding */
2308 while (!EMPTY()) {
2309 v = POP();
2310 Py_XDECREF(v);
2311 }
2312 }
2313
Tim Peters5ca576e2001-06-18 22:08:13 +00002314 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002315 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002316
Fred Drake9e3ad782001-07-03 23:39:52 +00002317 if (tstate->use_tracing) {
2318 if (tstate->c_tracefunc
2319 && (why == WHY_RETURN || why == WHY_YIELD)) {
2320 if (call_trace(tstate->c_tracefunc,
2321 tstate->c_traceobj, f,
2322 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002323 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002324 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002325 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002326 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002327 }
Fred Drake8f51f542001-10-04 14:48:42 +00002328 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002329 if (why == WHY_EXCEPTION)
2330 call_trace_protected(tstate->c_profilefunc,
2331 tstate->c_profileobj, f,
2332 PyTrace_RETURN);
2333 else if (call_trace(tstate->c_profilefunc,
2334 tstate->c_profileobj, f,
2335 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002336 Py_XDECREF(retval);
2337 retval = NULL;
2338 why = WHY_EXCEPTION;
2339 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002340 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002341 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002342
Guido van Rossuma027efa1997-05-05 20:56:21 +00002343 reset_exc_info(tstate);
2344
Tim Peters5ca576e2001-06-18 22:08:13 +00002345 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002346 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002347 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002348
Guido van Rossum96a42c81992-01-12 02:29:51 +00002349 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002350}
2351
Tim Peters6d6c1a32001-08-02 04:15:00 +00002352PyObject *
2353PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002354 PyObject **args, int argcount, PyObject **kws, int kwcount,
2355 PyObject **defs, int defcount, PyObject *closure)
2356{
2357 register PyFrameObject *f;
2358 register PyObject *retval = NULL;
2359 register PyObject **fastlocals, **freevars;
2360 PyThreadState *tstate = PyThreadState_GET();
2361 PyObject *x, *u;
2362
2363 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002364 PyErr_SetString(PyExc_SystemError,
2365 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002366 return NULL;
2367 }
2368
2369 f = PyFrame_New(tstate, /*back*/
2370 co, /*code*/
2371 globals, locals);
2372 if (f == NULL)
2373 return NULL;
2374
2375 fastlocals = f->f_localsplus;
2376 freevars = f->f_localsplus + f->f_nlocals;
2377
2378 if (co->co_argcount > 0 ||
2379 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2380 int i;
2381 int n = argcount;
2382 PyObject *kwdict = NULL;
2383 if (co->co_flags & CO_VARKEYWORDS) {
2384 kwdict = PyDict_New();
2385 if (kwdict == NULL)
2386 goto fail;
2387 i = co->co_argcount;
2388 if (co->co_flags & CO_VARARGS)
2389 i++;
2390 SETLOCAL(i, kwdict);
2391 }
2392 if (argcount > co->co_argcount) {
2393 if (!(co->co_flags & CO_VARARGS)) {
2394 PyErr_Format(PyExc_TypeError,
2395 "%.200s() takes %s %d "
2396 "%sargument%s (%d given)",
2397 PyString_AsString(co->co_name),
2398 defcount ? "at most" : "exactly",
2399 co->co_argcount,
2400 kwcount ? "non-keyword " : "",
2401 co->co_argcount == 1 ? "" : "s",
2402 argcount);
2403 goto fail;
2404 }
2405 n = co->co_argcount;
2406 }
2407 for (i = 0; i < n; i++) {
2408 x = args[i];
2409 Py_INCREF(x);
2410 SETLOCAL(i, x);
2411 }
2412 if (co->co_flags & CO_VARARGS) {
2413 u = PyTuple_New(argcount - n);
2414 if (u == NULL)
2415 goto fail;
2416 SETLOCAL(co->co_argcount, u);
2417 for (i = n; i < argcount; i++) {
2418 x = args[i];
2419 Py_INCREF(x);
2420 PyTuple_SET_ITEM(u, i-n, x);
2421 }
2422 }
2423 for (i = 0; i < kwcount; i++) {
2424 PyObject *keyword = kws[2*i];
2425 PyObject *value = kws[2*i + 1];
2426 int j;
2427 if (keyword == NULL || !PyString_Check(keyword)) {
2428 PyErr_Format(PyExc_TypeError,
2429 "%.200s() keywords must be strings",
2430 PyString_AsString(co->co_name));
2431 goto fail;
2432 }
2433 /* XXX slow -- speed up using dictionary? */
2434 for (j = 0; j < co->co_argcount; j++) {
2435 PyObject *nm = PyTuple_GET_ITEM(
2436 co->co_varnames, j);
2437 int cmp = PyObject_RichCompareBool(
2438 keyword, nm, Py_EQ);
2439 if (cmp > 0)
2440 break;
2441 else if (cmp < 0)
2442 goto fail;
2443 }
2444 /* Check errors from Compare */
2445 if (PyErr_Occurred())
2446 goto fail;
2447 if (j >= co->co_argcount) {
2448 if (kwdict == NULL) {
2449 PyErr_Format(PyExc_TypeError,
2450 "%.200s() got an unexpected "
2451 "keyword argument '%.400s'",
2452 PyString_AsString(co->co_name),
2453 PyString_AsString(keyword));
2454 goto fail;
2455 }
2456 PyDict_SetItem(kwdict, keyword, value);
2457 }
2458 else {
2459 if (GETLOCAL(j) != NULL) {
2460 PyErr_Format(PyExc_TypeError,
2461 "%.200s() got multiple "
2462 "values for keyword "
2463 "argument '%.400s'",
2464 PyString_AsString(co->co_name),
2465 PyString_AsString(keyword));
2466 goto fail;
2467 }
2468 Py_INCREF(value);
2469 SETLOCAL(j, value);
2470 }
2471 }
2472 if (argcount < co->co_argcount) {
2473 int m = co->co_argcount - defcount;
2474 for (i = argcount; i < m; i++) {
2475 if (GETLOCAL(i) == NULL) {
2476 PyErr_Format(PyExc_TypeError,
2477 "%.200s() takes %s %d "
2478 "%sargument%s (%d given)",
2479 PyString_AsString(co->co_name),
2480 ((co->co_flags & CO_VARARGS) ||
2481 defcount) ? "at least"
2482 : "exactly",
2483 m, kwcount ? "non-keyword " : "",
2484 m == 1 ? "" : "s", i);
2485 goto fail;
2486 }
2487 }
2488 if (n > m)
2489 i = n - m;
2490 else
2491 i = 0;
2492 for (; i < defcount; i++) {
2493 if (GETLOCAL(m+i) == NULL) {
2494 PyObject *def = defs[i];
2495 Py_INCREF(def);
2496 SETLOCAL(m+i, def);
2497 }
2498 }
2499 }
2500 }
2501 else {
2502 if (argcount > 0 || kwcount > 0) {
2503 PyErr_Format(PyExc_TypeError,
2504 "%.200s() takes no arguments (%d given)",
2505 PyString_AsString(co->co_name),
2506 argcount + kwcount);
2507 goto fail;
2508 }
2509 }
2510 /* Allocate and initialize storage for cell vars, and copy free
2511 vars into frame. This isn't too efficient right now. */
2512 if (f->f_ncells) {
2513 int i = 0, j = 0, nargs, found;
2514 char *cellname, *argname;
2515 PyObject *c;
2516
2517 nargs = co->co_argcount;
2518 if (co->co_flags & CO_VARARGS)
2519 nargs++;
2520 if (co->co_flags & CO_VARKEYWORDS)
2521 nargs++;
2522
2523 /* Check for cells that shadow args */
2524 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2525 cellname = PyString_AS_STRING(
2526 PyTuple_GET_ITEM(co->co_cellvars, i));
2527 found = 0;
2528 while (j < nargs) {
2529 argname = PyString_AS_STRING(
2530 PyTuple_GET_ITEM(co->co_varnames, j));
2531 if (strcmp(cellname, argname) == 0) {
2532 c = PyCell_New(GETLOCAL(j));
2533 if (c == NULL)
2534 goto fail;
2535 GETLOCAL(f->f_nlocals + i) = c;
2536 found = 1;
2537 break;
2538 }
2539 j++;
2540 }
2541 if (found == 0) {
2542 c = PyCell_New(NULL);
2543 if (c == NULL)
2544 goto fail;
2545 SETLOCAL(f->f_nlocals + i, c);
2546 }
2547 }
2548 /* Initialize any that are left */
2549 while (i < f->f_ncells) {
2550 c = PyCell_New(NULL);
2551 if (c == NULL)
2552 goto fail;
2553 SETLOCAL(f->f_nlocals + i, c);
2554 i++;
2555 }
2556 }
2557 if (f->f_nfreevars) {
2558 int i;
2559 for (i = 0; i < f->f_nfreevars; ++i) {
2560 PyObject *o = PyTuple_GET_ITEM(closure, i);
2561 Py_INCREF(o);
2562 freevars[f->f_ncells + i] = o;
2563 }
2564 }
2565
Tim Peters5ca576e2001-06-18 22:08:13 +00002566 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002567 /* Don't need to keep the reference to f_back, it will be set
2568 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002569 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002570 f->f_back = NULL;
2571
2572 /* Create a new generator that owns the ready to run frame
2573 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002574 return gen_new(f);
2575 }
2576
2577 retval = eval_frame(f);
2578
2579 fail: /* Jump here from prelude on failure */
2580
Tim Petersb13680b2001-11-27 23:29:29 +00002581 /* decref'ing the frame can cause __del__ methods to get invoked,
2582 which can call back into Python. While we're done with the
2583 current Python frame (f), the associated C stack is still in use,
2584 so recursion_depth must be boosted for the duration.
2585 */
2586 assert(tstate != NULL);
2587 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002588 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002589 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002590 return retval;
2591}
2592
2593
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002595set_exc_info(PyThreadState *tstate,
2596 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597{
2598 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002599 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002600
Guido van Rossuma027efa1997-05-05 20:56:21 +00002601 frame = tstate->frame;
2602 if (frame->f_exc_type == NULL) {
2603 /* This frame didn't catch an exception before */
2604 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605 if (tstate->exc_type == NULL) {
2606 Py_INCREF(Py_None);
2607 tstate->exc_type = Py_None;
2608 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002609 tmp_type = frame->f_exc_type;
2610 tmp_value = frame->f_exc_value;
2611 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002612 Py_XINCREF(tstate->exc_type);
2613 Py_XINCREF(tstate->exc_value);
2614 Py_XINCREF(tstate->exc_traceback);
2615 frame->f_exc_type = tstate->exc_type;
2616 frame->f_exc_value = tstate->exc_value;
2617 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002618 Py_XDECREF(tmp_type);
2619 Py_XDECREF(tmp_value);
2620 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002621 }
2622 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002623 tmp_type = tstate->exc_type;
2624 tmp_value = tstate->exc_value;
2625 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626 Py_XINCREF(type);
2627 Py_XINCREF(value);
2628 Py_XINCREF(tb);
2629 tstate->exc_type = type;
2630 tstate->exc_value = value;
2631 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002632 Py_XDECREF(tmp_type);
2633 Py_XDECREF(tmp_value);
2634 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002635 /* For b/w compatibility */
2636 PySys_SetObject("exc_type", type);
2637 PySys_SetObject("exc_value", value);
2638 PySys_SetObject("exc_traceback", tb);
2639}
2640
2641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002642reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002643{
2644 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002645 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002646 frame = tstate->frame;
2647 if (frame->f_exc_type != NULL) {
2648 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002649 tmp_type = tstate->exc_type;
2650 tmp_value = tstate->exc_value;
2651 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002652 Py_XINCREF(frame->f_exc_type);
2653 Py_XINCREF(frame->f_exc_value);
2654 Py_XINCREF(frame->f_exc_traceback);
2655 tstate->exc_type = frame->f_exc_type;
2656 tstate->exc_value = frame->f_exc_value;
2657 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002658 Py_XDECREF(tmp_type);
2659 Py_XDECREF(tmp_value);
2660 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002661 /* For b/w compatibility */
2662 PySys_SetObject("exc_type", frame->f_exc_type);
2663 PySys_SetObject("exc_value", frame->f_exc_value);
2664 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2665 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002666 tmp_type = frame->f_exc_type;
2667 tmp_value = frame->f_exc_value;
2668 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002669 frame->f_exc_type = NULL;
2670 frame->f_exc_value = NULL;
2671 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002672 Py_XDECREF(tmp_type);
2673 Py_XDECREF(tmp_value);
2674 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002675}
2676
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002677/* Logic for the raise statement (too complicated for inlining).
2678 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002679static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002680do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681{
Guido van Rossumd295f121998-04-09 21:39:57 +00002682 if (type == NULL) {
2683 /* Reraise */
2684 PyThreadState *tstate = PyThreadState_Get();
2685 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2686 value = tstate->exc_value;
2687 tb = tstate->exc_traceback;
2688 Py_XINCREF(type);
2689 Py_XINCREF(value);
2690 Py_XINCREF(tb);
2691 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002692
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 /* We support the following forms of raise:
2694 raise <class>, <classinstance>
2695 raise <class>, <argument tuple>
2696 raise <class>, None
2697 raise <class>, <argument>
2698 raise <classinstance>, None
2699 raise <string>, <object>
2700 raise <string>, None
2701
2702 An omitted second argument is the same as None.
2703
2704 In addition, raise <tuple>, <anything> is the same as
2705 raising the tuple's first item (and it better have one!);
2706 this rule is applied recursively.
2707
2708 Finally, an optional third argument can be supplied, which
2709 gives the traceback to be substituted (useful when
2710 re-raising an exception after examining it). */
2711
2712 /* First, check the traceback argument, replacing None with
2713 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002714 if (tb == Py_None) {
2715 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002716 tb = NULL;
2717 }
2718 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002719 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002720 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002721 goto raise_error;
2722 }
2723
2724 /* Next, replace a missing value with None */
2725 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 value = Py_None;
2727 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002728 }
2729
2730 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2732 PyObject *tmp = type;
2733 type = PyTuple_GET_ITEM(type, 0);
2734 Py_INCREF(type);
2735 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 }
2737
Barry Warsaw4249f541997-08-22 21:26:19 +00002738 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002739 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002740
2741 else if (PyClass_Check(type))
2742 PyErr_NormalizeException(&type, &value, &tb);
2743
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002745 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 if (value != Py_None) {
2747 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002748 "instance exception may not have a separate value");
2749 goto raise_error;
2750 }
2751 else {
2752 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002753 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002754 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2756 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002757 }
2758 }
2759 else {
2760 /* Not something you can raise. You get an exception
2761 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002762 PyErr_Format(PyExc_TypeError,
2763 "exceptions must be strings, classes, or "
2764 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002765 goto raise_error;
2766 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002768 if (tb == NULL)
2769 return WHY_EXCEPTION;
2770 else
2771 return WHY_RERAISE;
2772 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002773 Py_XDECREF(value);
2774 Py_XDECREF(type);
2775 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002776 return WHY_EXCEPTION;
2777}
2778
Tim Petersd6d010b2001-06-21 02:49:55 +00002779/* Iterate v argcnt times and store the results on the stack (via decreasing
2780 sp). Return 1 for success, 0 if error. */
2781
Barry Warsawe42b18f1997-08-25 22:13:04 +00002782static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002783unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002784{
Tim Petersd6d010b2001-06-21 02:49:55 +00002785 int i = 0;
2786 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002787 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002788
Tim Petersd6d010b2001-06-21 02:49:55 +00002789 assert(v != NULL);
2790
2791 it = PyObject_GetIter(v);
2792 if (it == NULL)
2793 goto Error;
2794
2795 for (; i < argcnt; i++) {
2796 w = PyIter_Next(it);
2797 if (w == NULL) {
2798 /* Iterator done, via error or exhaustion. */
2799 if (!PyErr_Occurred()) {
2800 PyErr_Format(PyExc_ValueError,
2801 "need more than %d value%s to unpack",
2802 i, i == 1 ? "" : "s");
2803 }
2804 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002805 }
2806 *--sp = w;
2807 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002808
2809 /* We better have exhausted the iterator now. */
2810 w = PyIter_Next(it);
2811 if (w == NULL) {
2812 if (PyErr_Occurred())
2813 goto Error;
2814 Py_DECREF(it);
2815 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002816 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002817 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002818 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002819 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002820Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002821 for (; i > 0; i--, sp++)
2822 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002823 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002824 return 0;
2825}
2826
2827
Guido van Rossum96a42c81992-01-12 02:29:51 +00002828#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002829static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002830prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002832 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 if (PyObject_Print(v, stdout, 0) != 0)
2834 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002835 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002836 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002838#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002840static void
Fred Drake5755ce62001-06-27 19:19:46 +00002841call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002842{
Guido van Rossumb209a111997-04-29 18:18:01 +00002843 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002844 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002845 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002846 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002847 value = Py_None;
2848 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002849 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002850 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002851 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002852 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002853 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002854 }
Fred Drake5755ce62001-06-27 19:19:46 +00002855 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002856 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002857 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002858 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002859 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002860 Py_XDECREF(type);
2861 Py_XDECREF(value);
2862 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002863 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002864}
2865
Fred Drake4ec5d562001-10-04 19:26:43 +00002866static void
2867call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2868 int what)
2869{
2870 PyObject *type, *value, *traceback;
2871 int err;
2872 PyErr_Fetch(&type, &value, &traceback);
2873 err = call_trace(func, obj, frame, what, NULL);
2874 if (err == 0)
2875 PyErr_Restore(type, value, traceback);
2876 else {
2877 Py_XDECREF(type);
2878 Py_XDECREF(value);
2879 Py_XDECREF(traceback);
2880 }
2881}
2882
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002883static int
Fred Drake5755ce62001-06-27 19:19:46 +00002884call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2885 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002886{
Fred Drake5755ce62001-06-27 19:19:46 +00002887 register PyThreadState *tstate = frame->f_tstate;
2888 int result;
2889 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002890 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002891 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002892 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002893 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002894 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2895 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002896 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002897 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002898}
2899
Fred Drake5755ce62001-06-27 19:19:46 +00002900void
2901PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002902{
Fred Drake5755ce62001-06-27 19:19:46 +00002903 PyThreadState *tstate = PyThreadState_Get();
2904 PyObject *temp = tstate->c_profileobj;
2905 Py_XINCREF(arg);
2906 tstate->c_profilefunc = NULL;
2907 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002908 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002909 Py_XDECREF(temp);
2910 tstate->c_profilefunc = func;
2911 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002912 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002913}
2914
2915void
2916PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2917{
2918 PyThreadState *tstate = PyThreadState_Get();
2919 PyObject *temp = tstate->c_traceobj;
2920 Py_XINCREF(arg);
2921 tstate->c_tracefunc = NULL;
2922 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002923 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002924 Py_XDECREF(temp);
2925 tstate->c_tracefunc = func;
2926 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002927 tstate->use_tracing = ((func != NULL)
2928 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002929}
2930
Guido van Rossumb209a111997-04-29 18:18:01 +00002931PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002932PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002933{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002934 PyThreadState *tstate = PyThreadState_Get();
2935 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002936 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002937 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002938 else
2939 return current_frame->f_builtins;
2940}
2941
Guido van Rossumb209a111997-04-29 18:18:01 +00002942PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002943PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002944{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002945 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002946 if (current_frame == NULL)
2947 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002948 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002949 return current_frame->f_locals;
2950}
2951
Guido van Rossumb209a111997-04-29 18:18:01 +00002952PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002953PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002954{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002955 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002956 if (current_frame == NULL)
2957 return NULL;
2958 else
2959 return current_frame->f_globals;
2960}
2961
Guido van Rossumb209a111997-04-29 18:18:01 +00002962PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002963PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002964{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002965 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002966 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002967}
2968
Guido van Rossum6135a871995-01-09 17:53:26 +00002969int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002970PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002971{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002972 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002973 return current_frame == NULL ? 0 : current_frame->f_restricted;
2974}
2975
Guido van Rossumbe270261997-05-22 22:26:18 +00002976int
Tim Peters5ba58662001-07-16 02:29:45 +00002977PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002978{
2979 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002980 int result = 0;
2981
2982 if (current_frame != NULL) {
2983 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002984 const int compilerflags = codeflags & PyCF_MASK;
2985 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002986 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002987 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002988 }
2989 }
2990 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002991}
2992
2993int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002994Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995{
Guido van Rossumb209a111997-04-29 18:18:01 +00002996 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002997 if (f == NULL)
2998 return 0;
2999 if (!PyFile_SoftSpace(f, 0))
3000 return 0;
3001 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002}
3003
Guido van Rossum3f5da241990-12-20 15:06:42 +00003004
Guido van Rossum681d79a1995-07-18 14:51:37 +00003005/* External interface to call any callable object.
3006 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003007
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003008#undef PyEval_CallObject
3009/* for backward compatibility: export this interface */
3010
Guido van Rossumb209a111997-04-29 18:18:01 +00003011PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003012PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003013{
Guido van Rossumb209a111997-04-29 18:18:01 +00003014 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003015}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003016#define PyEval_CallObject(func,arg) \
3017 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003018
Guido van Rossumb209a111997-04-29 18:18:01 +00003019PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003020PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003021{
Jeremy Hylton52820442001-01-03 23:52:36 +00003022 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023
3024 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003025 arg = PyTuple_New(0);
3026 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003027 PyErr_SetString(PyExc_TypeError,
3028 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029 return NULL;
3030 }
3031 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003032 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033
Guido van Rossumb209a111997-04-29 18:18:01 +00003034 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003035 PyErr_SetString(PyExc_TypeError,
3036 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003037 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003038 return NULL;
3039 }
3040
Tim Peters6d6c1a32001-08-02 04:15:00 +00003041 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003042 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003043 return result;
3044}
3045
Tim Peters6d6c1a32001-08-02 04:15:00 +00003046char *
3047PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003048{
3049 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003050 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003051 else if (PyFunction_Check(func))
3052 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3053 else if (PyCFunction_Check(func))
3054 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3055 else if (PyClass_Check(func))
3056 return PyString_AsString(((PyClassObject*)func)->cl_name);
3057 else if (PyInstance_Check(func)) {
3058 return PyString_AsString(
3059 ((PyInstanceObject*)func)->in_class->cl_name);
3060 } else {
3061 return func->ob_type->tp_name;
3062 }
3063}
3064
Tim Peters6d6c1a32001-08-02 04:15:00 +00003065char *
3066PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003067{
3068 if (PyMethod_Check(func))
3069 return "()";
3070 else if (PyFunction_Check(func))
3071 return "()";
3072 else if (PyCFunction_Check(func))
3073 return "()";
3074 else if (PyClass_Check(func))
3075 return " constructor";
3076 else if (PyInstance_Check(func)) {
3077 return " instance";
3078 } else {
3079 return " object";
3080 }
3081}
3082
Jeremy Hylton52820442001-01-03 23:52:36 +00003083#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3084
3085/* The two fast_xxx() functions optimize calls for which no argument
3086 tuple is necessary; the objects are passed directly from the stack.
3087 fast_cfunction() is called for METH_OLDARGS functions.
3088 fast_function() is for functions with no special argument handling.
3089*/
3090
3091static PyObject *
3092fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3093{
3094 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3095 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003096 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003097
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003098 switch (flags) {
3099 case METH_OLDARGS:
3100 if (na == 0)
3101 return (*meth)(self, NULL);
3102 else if (na == 1) {
3103 PyObject *arg = EXT_POP(*pp_stack);
3104 PyObject *result = (*meth)(self, arg);
3105 Py_DECREF(arg);
3106 return result;
3107 } else {
3108 PyObject *args = load_args(pp_stack, na);
3109 PyObject *result = (*meth)(self, args);
3110 Py_DECREF(args);
3111 return result;
3112 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003113 case METH_NOARGS:
3114 if (na == 0)
3115 return (*meth)(self, NULL);
3116 PyErr_Format(PyExc_TypeError,
3117 "%.200s() takes no arguments (%d given)",
3118 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3119 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003120 case METH_O:
3121 if (na == 1) {
3122 PyObject *arg = EXT_POP(*pp_stack);
3123 PyObject *result = (*meth)(self, arg);
3124 Py_DECREF(arg);
3125 return result;
3126 }
3127 PyErr_Format(PyExc_TypeError,
3128 "%.200s() takes exactly one argument (%d given)",
3129 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3130 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003131 default:
3132 fprintf(stderr, "%.200s() flags = %d\n",
3133 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3134 PyErr_BadInternalCall();
3135 return NULL;
3136 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003137}
3138
3139static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003140fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003141{
3142 PyObject *co = PyFunction_GET_CODE(func);
3143 PyObject *globals = PyFunction_GET_GLOBALS(func);
3144 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003145 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003146 PyObject **d = NULL;
3147 int nd = 0;
3148
3149 if (argdefs != NULL) {
3150 d = &PyTuple_GET_ITEM(argdefs, 0);
3151 nd = ((PyTupleObject *)argdefs)->ob_size;
3152 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003153 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003154 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003155 (*pp_stack)-2*nk, nk, d, nd,
3156 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003157}
3158
3159static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003160update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3161 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003162{
3163 PyObject *kwdict = NULL;
3164 if (orig_kwdict == NULL)
3165 kwdict = PyDict_New();
3166 else {
3167 kwdict = PyDict_Copy(orig_kwdict);
3168 Py_DECREF(orig_kwdict);
3169 }
3170 if (kwdict == NULL)
3171 return NULL;
3172 while (--nk >= 0) {
3173 int err;
3174 PyObject *value = EXT_POP(*pp_stack);
3175 PyObject *key = EXT_POP(*pp_stack);
3176 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003177 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003178 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003179 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003180 PyEval_GetFuncName(func),
3181 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003182 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003183 Py_DECREF(key);
3184 Py_DECREF(value);
3185 Py_DECREF(kwdict);
3186 return NULL;
3187 }
3188 err = PyDict_SetItem(kwdict, key, value);
3189 Py_DECREF(key);
3190 Py_DECREF(value);
3191 if (err) {
3192 Py_DECREF(kwdict);
3193 return NULL;
3194 }
3195 }
3196 return kwdict;
3197}
3198
3199static PyObject *
3200update_star_args(int nstack, int nstar, PyObject *stararg,
3201 PyObject ***pp_stack)
3202{
3203 PyObject *callargs, *w;
3204
3205 callargs = PyTuple_New(nstack + nstar);
3206 if (callargs == NULL) {
3207 return NULL;
3208 }
3209 if (nstar) {
3210 int i;
3211 for (i = 0; i < nstar; i++) {
3212 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3213 Py_INCREF(a);
3214 PyTuple_SET_ITEM(callargs, nstack + i, a);
3215 }
3216 }
3217 while (--nstack >= 0) {
3218 w = EXT_POP(*pp_stack);
3219 PyTuple_SET_ITEM(callargs, nstack, w);
3220 }
3221 return callargs;
3222}
3223
3224static PyObject *
3225load_args(PyObject ***pp_stack, int na)
3226{
3227 PyObject *args = PyTuple_New(na);
3228 PyObject *w;
3229
3230 if (args == NULL)
3231 return NULL;
3232 while (--na >= 0) {
3233 w = EXT_POP(*pp_stack);
3234 PyTuple_SET_ITEM(args, na, w);
3235 }
3236 return args;
3237}
3238
3239static PyObject *
3240do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3241{
3242 PyObject *callargs = NULL;
3243 PyObject *kwdict = NULL;
3244 PyObject *result = NULL;
3245
3246 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003247 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003248 if (kwdict == NULL)
3249 goto call_fail;
3250 }
3251 callargs = load_args(pp_stack, na);
3252 if (callargs == NULL)
3253 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003254 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003255 call_fail:
3256 Py_XDECREF(callargs);
3257 Py_XDECREF(kwdict);
3258 return result;
3259}
3260
3261static PyObject *
3262ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3263{
3264 int nstar = 0;
3265 PyObject *callargs = NULL;
3266 PyObject *stararg = NULL;
3267 PyObject *kwdict = NULL;
3268 PyObject *result = NULL;
3269
3270 if (flags & CALL_FLAG_KW) {
3271 kwdict = EXT_POP(*pp_stack);
3272 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003273 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003274 "%s%s argument after ** "
3275 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003276 PyEval_GetFuncName(func),
3277 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003278 goto ext_call_fail;
3279 }
3280 }
3281 if (flags & CALL_FLAG_VAR) {
3282 stararg = EXT_POP(*pp_stack);
3283 if (!PyTuple_Check(stararg)) {
3284 PyObject *t = NULL;
3285 t = PySequence_Tuple(stararg);
3286 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003287 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3288 PyErr_Format(PyExc_TypeError,
3289 "%s%s argument after * "
3290 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003291 PyEval_GetFuncName(func),
3292 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003293 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003294 goto ext_call_fail;
3295 }
3296 Py_DECREF(stararg);
3297 stararg = t;
3298 }
3299 nstar = PyTuple_GET_SIZE(stararg);
3300 }
3301 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003302 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003303 if (kwdict == NULL)
3304 goto ext_call_fail;
3305 }
3306 callargs = update_star_args(na, nstar, stararg, pp_stack);
3307 if (callargs == NULL)
3308 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003309 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003310 ext_call_fail:
3311 Py_XDECREF(callargs);
3312 Py_XDECREF(kwdict);
3313 Py_XDECREF(stararg);
3314 return result;
3315}
3316
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003317#define SLICE_ERROR_MSG \
3318 "standard sequence type does not support step size other than one"
3319
Guido van Rossumb209a111997-04-29 18:18:01 +00003320static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003321loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003322{
Guido van Rossumb209a111997-04-29 18:18:01 +00003323 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003324 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003325 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003326 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327 return NULL;
3328 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003329 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003330 v = (*sq->sq_item)(v, i);
3331 if (v)
3332 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003333 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003334 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003335 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336}
3337
Tim Peterscb479e72001-12-16 19:11:44 +00003338/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3339 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3340 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3341*/
Tim Petersb5196382001-12-16 19:44:20 +00003342/* Note: If v is NULL, return success without storing into *pi. This
3343 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3344 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003345*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003346int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003347_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348{
Tim Petersb5196382001-12-16 19:44:20 +00003349 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003350 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003351 if (PyInt_Check(v)) {
3352 x = PyInt_AsLong(v);
3353 } else if (PyLong_Check(v)) {
3354 x = PyLong_AsLong(v);
3355 if (x==-1 && PyErr_Occurred()) {
3356 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003357 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003358
Guido van Rossumac7be682001-01-17 15:42:30 +00003359 if (!PyErr_ExceptionMatches(
3360 PyExc_OverflowError)) {
3361 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003362 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003363 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003364 }
3365
Guido van Rossumac7be682001-01-17 15:42:30 +00003366 /* Clear the OverflowError */
3367 PyErr_Clear();
3368
3369 /* It's an overflow error, so we need to
3370 check the sign of the long integer,
3371 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003372 the error. */
3373
3374 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003375 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003376 if (long_zero == NULL)
3377 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003378
3379 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003380 cmp = PyObject_RichCompareBool(v, long_zero,
3381 Py_GT);
3382 Py_DECREF(long_zero);
3383 if (cmp < 0)
3384 return 0;
3385 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003386 x = INT_MAX;
3387 else
3388 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003389 }
3390 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003391 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003392 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003393 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003395 /* Truncate -- very long indices are truncated anyway */
3396 if (x > INT_MAX)
3397 x = INT_MAX;
3398 else if (x < -INT_MAX)
3399 x = 0;
3400 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003402 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403}
3404
Guido van Rossum50d756e2001-08-18 17:43:36 +00003405#undef ISINT
3406#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3407
Guido van Rossumb209a111997-04-29 18:18:01 +00003408static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003409apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003411 PyTypeObject *tp = u->ob_type;
3412 PySequenceMethods *sq = tp->tp_as_sequence;
3413
3414 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3415 int ilow = 0, ihigh = INT_MAX;
3416 if (!_PyEval_SliceIndex(v, &ilow))
3417 return NULL;
3418 if (!_PyEval_SliceIndex(w, &ihigh))
3419 return NULL;
3420 return PySequence_GetSlice(u, ilow, ihigh);
3421 }
3422 else {
3423 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003424 if (slice != NULL) {
3425 PyObject *res = PyObject_GetItem(u, slice);
3426 Py_DECREF(slice);
3427 return res;
3428 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003429 else
3430 return NULL;
3431 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003433
3434static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003435assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3436 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003438 PyTypeObject *tp = u->ob_type;
3439 PySequenceMethods *sq = tp->tp_as_sequence;
3440
3441 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3442 int ilow = 0, ihigh = INT_MAX;
3443 if (!_PyEval_SliceIndex(v, &ilow))
3444 return -1;
3445 if (!_PyEval_SliceIndex(w, &ihigh))
3446 return -1;
3447 if (x == NULL)
3448 return PySequence_DelSlice(u, ilow, ihigh);
3449 else
3450 return PySequence_SetSlice(u, ilow, ihigh, x);
3451 }
3452 else {
3453 PyObject *slice = PySlice_New(v, w, NULL);
3454 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003455 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003456 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003457 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003458 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003459 res = PyObject_DelItem(u, slice);
3460 Py_DECREF(slice);
3461 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003462 }
3463 else
3464 return -1;
3465 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003466}
3467
Guido van Rossumb209a111997-04-29 18:18:01 +00003468static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003469cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003470{
Guido van Rossumac7be682001-01-17 15:42:30 +00003471 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003473 case IS:
3474 case IS_NOT:
3475 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003476 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003477 res = !res;
3478 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 case IN:
3480 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003481 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003482 if (res < 0)
3483 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003484 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003485 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 break;
3487 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003488 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 break;
3490 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003491 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003493 v = res ? Py_True : Py_False;
3494 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495 return v;
3496}
3497
Thomas Wouters52152252000-08-17 22:55:00 +00003498static PyObject *
3499import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003500{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003501 PyObject *x;
3502
3503 x = PyObject_GetAttr(v, name);
3504 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003505 PyErr_Format(PyExc_ImportError,
3506 "cannot import name %.230s",
3507 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003508 }
Thomas Wouters52152252000-08-17 22:55:00 +00003509 return x;
3510}
Guido van Rossumac7be682001-01-17 15:42:30 +00003511
Thomas Wouters52152252000-08-17 22:55:00 +00003512static int
3513import_all_from(PyObject *locals, PyObject *v)
3514{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003515 PyObject *all = PyObject_GetAttrString(v, "__all__");
3516 PyObject *dict, *name, *value;
3517 int skip_leading_underscores = 0;
3518 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003519
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003520 if (all == NULL) {
3521 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3522 return -1; /* Unexpected error */
3523 PyErr_Clear();
3524 dict = PyObject_GetAttrString(v, "__dict__");
3525 if (dict == NULL) {
3526 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3527 return -1;
3528 PyErr_SetString(PyExc_ImportError,
3529 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003530 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003531 }
3532 all = PyMapping_Keys(dict);
3533 Py_DECREF(dict);
3534 if (all == NULL)
3535 return -1;
3536 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003537 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003538
3539 for (pos = 0, err = 0; ; pos++) {
3540 name = PySequence_GetItem(all, pos);
3541 if (name == NULL) {
3542 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3543 err = -1;
3544 else
3545 PyErr_Clear();
3546 break;
3547 }
3548 if (skip_leading_underscores &&
3549 PyString_Check(name) &&
3550 PyString_AS_STRING(name)[0] == '_')
3551 {
3552 Py_DECREF(name);
3553 continue;
3554 }
3555 value = PyObject_GetAttr(v, name);
3556 if (value == NULL)
3557 err = -1;
3558 else
3559 err = PyDict_SetItem(locals, name, value);
3560 Py_DECREF(name);
3561 Py_XDECREF(value);
3562 if (err != 0)
3563 break;
3564 }
3565 Py_DECREF(all);
3566 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003567}
3568
Guido van Rossumb209a111997-04-29 18:18:01 +00003569static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003570build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003571{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003572 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003573
3574 if (PyDict_Check(methods))
3575 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003576 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003577 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003578 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3579 base = PyTuple_GET_ITEM(bases, 0);
3580 metaclass = PyObject_GetAttrString(base, "__class__");
3581 if (metaclass == NULL) {
3582 PyErr_Clear();
3583 metaclass = (PyObject *)base->ob_type;
3584 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003585 }
3586 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003587 else {
3588 PyObject *g = PyEval_GetGlobals();
3589 if (g != NULL && PyDict_Check(g))
3590 metaclass = PyDict_GetItemString(g, "__metaclass__");
3591 if (metaclass == NULL)
3592 metaclass = (PyObject *) &PyClass_Type;
3593 Py_INCREF(metaclass);
3594 }
3595 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3596 Py_DECREF(metaclass);
3597 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003598}
3599
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003600static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003601exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3602 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003603{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003604 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003605 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003607
Guido van Rossumb209a111997-04-29 18:18:01 +00003608 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3609 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003610 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003611 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003612 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003613 locals = PyTuple_GetItem(prog, 2);
3614 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003615 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003616 if (globals == Py_None) {
3617 globals = PyEval_GetGlobals();
3618 if (locals == Py_None) {
3619 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003620 plain = 1;
3621 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003622 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003623 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003624 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003625 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003626 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003627 !PyCode_Check(prog) &&
3628 !PyFile_Check(prog)) {
3629 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003630 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003631 return -1;
3632 }
Fred Drake661ea262000-10-24 19:57:45 +00003633 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003634 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003635 "exec: arg 2 must be a dictionary or None");
3636 return -1;
3637 }
3638 if (!PyDict_Check(locals)) {
3639 PyErr_SetString(PyExc_TypeError,
3640 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003641 return -1;
3642 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003643 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003644 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003645 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003646 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3647 PyErr_SetString(PyExc_TypeError,
3648 "code object passed to exec may not contain free variables");
3649 return -1;
3650 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003651 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003652 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003653 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003654 FILE *fp = PyFile_AsFile(prog);
3655 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003656 PyCompilerFlags cf;
3657 cf.cf_flags = 0;
3658 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003659 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3660 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003661 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003662 v = PyRun_File(fp, name, Py_file_input, globals,
3663 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003664 }
3665 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003666 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003667 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003668 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003669 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003670 cf.cf_flags = 0;
3671 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003672 v = PyRun_StringFlags(str, Py_file_input, globals,
3673 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003674 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003675 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003676 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003677 if (plain)
3678 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003679 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003680 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003681 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003682 return 0;
3683}
Guido van Rossum24c13741995-02-14 09:42:43 +00003684
Guido van Rossumac7be682001-01-17 15:42:30 +00003685static void
Paul Prescode68140d2000-08-30 20:25:01 +00003686format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3687{
3688 char *obj_str;
3689
3690 if (!obj)
3691 return;
3692
3693 obj_str = PyString_AsString(obj);
3694 if (!obj_str)
3695 return;
3696
3697 PyErr_Format(exc, format_str, obj_str);
3698}
Guido van Rossum950361c1997-01-24 13:49:28 +00003699
3700#ifdef DYNAMIC_EXECUTION_PROFILE
3701
Skip Montanarof118cb12001-10-15 20:51:38 +00003702static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003703getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003704{
3705 int i;
3706 PyObject *l = PyList_New(256);
3707 if (l == NULL) return NULL;
3708 for (i = 0; i < 256; i++) {
3709 PyObject *x = PyInt_FromLong(a[i]);
3710 if (x == NULL) {
3711 Py_DECREF(l);
3712 return NULL;
3713 }
3714 PyList_SetItem(l, i, x);
3715 }
3716 for (i = 0; i < 256; i++)
3717 a[i] = 0;
3718 return l;
3719}
3720
3721PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003722_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003723{
3724#ifndef DXPAIRS
3725 return getarray(dxp);
3726#else
3727 int i;
3728 PyObject *l = PyList_New(257);
3729 if (l == NULL) return NULL;
3730 for (i = 0; i < 257; i++) {
3731 PyObject *x = getarray(dxpairs[i]);
3732 if (x == NULL) {
3733 Py_DECREF(l);
3734 return NULL;
3735 }
3736 PyList_SetItem(l, i, x);
3737 }
3738 return l;
3739#endif
3740}
3741
3742#endif