blob: 97a734cf949cfb1ff98007057f03fac5e5507ebe [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static PyObject *loop_subscript(PyObject *, PyObject *);
55static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
56static int assign_slice(PyObject *, PyObject *,
57 PyObject *, PyObject *);
58static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000059static PyObject *import_from(PyObject *, PyObject *);
60static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static PyObject *build_class(PyObject *, PyObject *, PyObject *);
62static int exec_statement(PyFrameObject *,
63 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
65static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000066static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Paul Prescode68140d2000-08-30 20:25:01 +000068#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000069 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000070#define GLOBAL_NAME_ERROR_MSG \
71 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000072#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000073 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000074#define UNBOUNDFREE_ERROR_MSG \
75 "free variable '%.200s' referenced before assignment" \
76 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Guido van Rossum950361c1997-01-24 13:49:28 +000078/* Dynamic execution profile */
79#ifdef DYNAMIC_EXECUTION_PROFILE
80#ifdef DXPAIRS
81static long dxpairs[257][256];
82#define dxp dxpairs[256]
83#else
84static long dxp[256];
85#endif
86#endif
87
Tim Peters5ca576e2001-06-18 22:08:13 +000088staticforward PyTypeObject gentype;
89
90typedef struct {
91 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000092 /* The gi_ prefix is intended to remind of generator-iterator. */
93
94 PyFrameObject *gi_frame;
95
Tim Peterse77f2e22001-06-26 22:24:51 +000096 /* True if generator is being executed. */
97 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000098} genobject;
99
100static PyObject *
101gen_new(PyFrameObject *f)
102{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000103 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000104 if (gen == NULL) {
105 Py_DECREF(f);
106 return NULL;
107 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000108 gen->gi_frame = f;
109 gen->gi_running = 0;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000110 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000111 return (PyObject *)gen;
112}
113
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000114static int
115gen_traverse(genobject *gen, visitproc visit, void *arg)
116{
117 return visit((PyObject *)gen->gi_frame, arg);
118}
119
Tim Peters5ca576e2001-06-18 22:08:13 +0000120static void
121gen_dealloc(genobject *gen)
122{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000123 _PyObject_GC_UNTRACK(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000124 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000125 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000126}
127
128static PyObject *
129gen_iternext(genobject *gen)
130{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000131 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000133 PyObject *result;
134
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000135 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000136 PyErr_SetString(PyExc_ValueError,
137 "generator already executing");
138 return NULL;
139 }
Tim Peters8c963692001-06-23 05:26:56 +0000140 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000142
143 /* Generators always return to their most recent caller, not
144 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000145 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000146 assert(f->f_back == NULL);
147 f->f_back = tstate->frame;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000151 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000152
153 /* Don't keep the reference to f_back any longer than necessary. It
154 * may keep a chain of frames alive or it could create a reference
155 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000156 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000157 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000158
Tim Petersad1a18b2001-06-23 06:19:16 +0000159 /* If the generator just returned (as opposed to yielding), signal
160 * that the generator is exhausted. */
161 if (result == Py_None && f->f_stacktop == NULL) {
162 Py_DECREF(result);
163 result = NULL;
164 }
165
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000167}
168
169static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000170gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000171{
172 PyObject *result;
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000175
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000176 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000177 PyErr_SetObject(PyExc_StopIteration, Py_None);
178 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000179 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000180
181 return result;
182}
183
184static PyObject *
185gen_getiter(PyObject *gen)
186{
187 Py_INCREF(gen);
188 return gen;
189}
190
191static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000192 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000193 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 {NULL, NULL} /* Sentinel */
195};
196
Guido van Rossum6f799372001-09-20 20:46:19 +0000197static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000198 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
199 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
200 {NULL} /* Sentinel */
201};
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
203statichere PyTypeObject gentype = {
204 PyObject_HEAD_INIT(&PyType_Type)
205 0, /* ob_size */
206 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000207 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000208 0, /* tp_itemsize */
209 /* methods */
210 (destructor)gen_dealloc, /* tp_dealloc */
211 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_setattr */
214 0, /* tp_compare */
215 0, /* tp_repr */
216 0, /* tp_as_number */
217 0, /* tp_as_sequence */
218 0, /* tp_as_mapping */
219 0, /* tp_hash */
220 0, /* tp_call */
221 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000223 0, /* tp_setattro */
224 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000226 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000227 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000228 0, /* tp_clear */
229 0, /* tp_richcompare */
230 0, /* tp_weaklistoffset */
231 (getiterfunc)gen_getiter, /* tp_iter */
232 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000233 gen_methods, /* tp_methods */
234 gen_memberlist, /* tp_members */
235 0, /* tp_getset */
236 0, /* tp_base */
237 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000238};
239
240
Guido van Rossume59214e1994-08-30 08:01:59 +0000241#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000242
Guido van Rossum2571cc81999-04-07 16:07:23 +0000243#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000245#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000246#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248extern int _PyThread_Started; /* Flag for Py_Exit */
249
Guido van Rossum65d5b571998-12-21 19:32:43 +0000250static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252
253void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000257 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000259 interpreter_lock = PyThread_allocate_lock();
260 PyThread_acquire_lock(interpreter_lock, 1);
261 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000262}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000263
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000264void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268}
269
270void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274}
275
276void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000278{
279 if (tstate == NULL)
280 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282 if (PyThreadState_Swap(tstate) != NULL)
283 Py_FatalError(
284 "PyEval_AcquireThread: non-NULL old thread state");
285}
286
287void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000288PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289{
290 if (tstate == NULL)
291 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
292 if (PyThreadState_Swap(NULL) != tstate)
293 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000294 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000295}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000296
297/* This function is called from PyOS_AfterFork to ensure that newly
298 created child processes don't hold locks referring to threads which
299 are not running in the child process. (This could also be done using
300 pthread_atfork mechanism, at least for the pthreads implementation.) */
301
302void
303PyEval_ReInitThreads(void)
304{
305 if (!interpreter_lock)
306 return;
307 /*XXX Can't use PyThread_free_lock here because it does too
308 much error-checking. Doing this cleanly would require
309 adding a new function to each thread_*.h. Instead, just
310 create a new lock and waste a little bit of memory */
311 interpreter_lock = PyThread_allocate_lock();
312 PyThread_acquire_lock(interpreter_lock, 1);
313 main_thread = PyThread_get_thread_ident();
314}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315#endif
316
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317/* Functions save_thread and restore_thread are always defined so
318 dynamically loaded modules needn't be compiled separately for use
319 with and without threads: */
320
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000321PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 PyThreadState *tstate = PyThreadState_Swap(NULL);
325 if (tstate == NULL)
326 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000327#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000331 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332}
333
334void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000335PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000337 if (tstate == NULL)
338 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000339#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000341 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000342 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 }
345#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000346 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347}
348
349
Guido van Rossuma9672091994-09-14 13:31:22 +0000350/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
351 signal handlers or Mac I/O completion routines) can schedule calls
352 to a function to be called synchronously.
353 The synchronous function is called with one void* argument.
354 It should return 0 for success or -1 for failure -- failure should
355 be accompanied by an exception.
356
357 If registry succeeds, the registry function returns 0; if it fails
358 (e.g. due to too many pending calls) it returns -1 (without setting
359 an exception condition).
360
361 Note that because registry may occur from within signal handlers,
362 or other asynchronous events, calling malloc() is unsafe!
363
364#ifdef WITH_THREAD
365 Any thread can schedule pending calls, but only the main thread
366 will execute them.
367#endif
368
369 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
370 There are two possible race conditions:
371 (1) nested asynchronous registry calls;
372 (2) registry calls made while pending calls are being processed.
373 While (1) is very unlikely, (2) is a real possibility.
374 The current code is safe against (2), but not against (1).
375 The safety against (2) is derived from the fact that only one
376 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378 XXX Darn! With the advent of thread state, we should have an array
379 of pending calls per thread in the thread state! Later...
380*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000381
Guido van Rossuma9672091994-09-14 13:31:22 +0000382#define NPENDINGCALLS 32
383static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000384 int (*func)(void *);
385 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000386} pendingcalls[NPENDINGCALLS];
387static volatile int pendingfirst = 0;
388static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390
391int
Thomas Wouters334fb892000-07-25 12:56:38 +0000392Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000393{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000394 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 int i, j;
396 /* XXX Begin critical section */
397 /* XXX If you want this to be safe against nested
398 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000399 if (busy)
400 return -1;
401 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendinglast;
403 j = (i + 1) % NPENDINGCALLS;
404 if (j == pendingfirst)
405 return -1; /* Queue full */
406 pendingcalls[i].func = func;
407 pendingcalls[i].arg = arg;
408 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000409 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000410 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 /* XXX End critical section */
412 return 0;
413}
414
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000417{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000418 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000420 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000421 return 0;
422#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000423 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 return 0;
425 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 for (;;) {
428 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000429 int (*func)(void *);
430 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 i = pendingfirst;
432 if (i == pendinglast)
433 break; /* Queue empty */
434 func = pendingcalls[i].func;
435 arg = pendingcalls[i].arg;
436 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000437 if (func(arg) < 0) {
438 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000439 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000440 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000441 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 return 0;
445}
446
447
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000448/* The interpreter's recursion limit */
449
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000450static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000452int
453Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000454{
455 return recursion_limit;
456}
457
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000458void
459Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000460{
461 recursion_limit = new_limit;
462}
463
Guido van Rossum374a9221991-04-04 10:40:29 +0000464/* Status code for main loop (reason for stack unwind) */
465
466enum why_code {
467 WHY_NOT, /* No error */
468 WHY_EXCEPTION, /* Exception occurred */
469 WHY_RERAISE, /* Exception re-raised by 'finally' */
470 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000471 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000472 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000473 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000474};
475
Tim Petersdbd9ba62000-07-09 03:09:57 +0000476static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000477static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000478
Guido van Rossum374a9221991-04-04 10:40:29 +0000479
Guido van Rossumb209a111997-04-29 18:18:01 +0000480PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000481PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 (PyObject **)NULL, 0,
486 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000487 (PyObject **)NULL, 0,
488 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489}
490
491
492/* Interpreter main loop */
493
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000495eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000496{
Guido van Rossum950361c1997-01-24 13:49:28 +0000497#ifdef DXPAIRS
498 int lastopcode = 0;
499#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000500 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000501 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000502 register int opcode=0; /* Current opcode */
503 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000504 register enum why_code why; /* Reason for block stack unwind */
505 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000506 register PyObject *x; /* Result object -- NULL if error */
507 register PyObject *v; /* Temporary objects popped off stack */
508 register PyObject *w;
509 register PyObject *u;
510 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000511 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000512 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000513 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000514 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000515 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000518 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000520#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000522 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000523#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000524
525/* Code access macros */
526
527#define GETCONST(i) Getconst(f, i)
528#define GETNAME(i) Getname(f, i)
529#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000530#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000531#define NEXTOP() (*next_instr++)
532#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000533#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#define JUMPBY(x) (next_instr += (x))
535
536/* Stack manipulation macros */
537
538#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
539#define EMPTY() (STACK_LEVEL() == 0)
540#define TOP() (stack_pointer[-1])
541#define BASIC_PUSH(v) (*stack_pointer++ = (v))
542#define BASIC_POP() (*--stack_pointer)
543
Guido van Rossum96a42c81992-01-12 02:29:51 +0000544#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000545#define PUSH(v) { (void)(BASIC_PUSH(v), \
546 lltrace && prtrace(TOP(), "push")); \
547 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000548#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000549#else
550#define PUSH(v) BASIC_PUSH(v)
551#define POP() BASIC_POP()
552#endif
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000557#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 GETLOCAL(i) = value; } while (0)
559
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560/* Start of code */
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 if (f == NULL)
563 return NULL;
564
Guido van Rossum8861b741996-07-30 16:49:37 +0000565#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000567 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570#endif
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000573 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000576 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000577 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 co = f->f_code;
583 fastlocals = f->f_localsplus;
584 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000585 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000587 stack_pointer = f->f_stacktop;
588 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000589 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000590
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000591 if (tstate->use_tracing) {
592 if (tstate->c_tracefunc != NULL) {
593 /* tstate->c_tracefunc, if defined, is a
594 function that will be called on *every* entry
595 to a code block. Its return value, if not
596 None, is a function that will be called at
597 the start of each executed line of code.
598 (Actually, the function must return itself
599 in order to continue tracing.) The trace
600 functions are called with three arguments:
601 a pointer to the current frame, a string
602 indicating why the function is called, and
603 an argument which depends on the situation.
604 The global trace function is also called
605 whenever an exception is detected. */
606 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
607 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000608 /* Trace function raised an error */
609 return NULL;
610 }
611 }
612 if (tstate->c_profilefunc != NULL) {
613 /* Similar for c_profilefunc, except it needn't
614 return itself and isn't called for "line" events */
615 if (call_trace(tstate->c_profilefunc,
616 tstate->c_profileobj,
617 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000618 /* Profile function raised an error */
619 return NULL;
620 }
621 }
622 }
623
Tim Peters5ca576e2001-06-18 22:08:13 +0000624#ifdef LLTRACE
625 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
626#endif
627#if defined(Py_DEBUG) || defined(LLTRACE)
628 filename = PyString_AsString(co->co_filename);
629#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000630
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 why = WHY_NOT;
632 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000633 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000634 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000637 assert(stack_pointer >= f->f_valuestack); /* else underflow */
638 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000639 /* Do periodic things. Doing this every time through
640 the loop would add too much overhead, so we do it
641 only every Nth instruction. We also do it if
642 ``things_to_do'' is set, i.e. when an asynchronous
643 event needs attention (e.g. a signal handler or
644 async I/O handler); see Py_AddPendingCall() and
645 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000646
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000648 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000649 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000650 if (Py_MakePendingCalls() < 0) {
651 why = WHY_EXCEPTION;
652 goto on_error;
653 }
654 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000655#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000656 /* If we have true signals, the signal handler
657 will call Py_AddPendingCall() so we don't
658 have to call sigcheck(). On the Mac and
659 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000660 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 goto on_error;
663 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000664#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665
Guido van Rossume59214e1994-08-30 08:01:59 +0000666#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 if (interpreter_lock) {
668 /* Give another thread a chance */
669
Guido van Rossum25ce5661997-08-02 03:10:38 +0000670 if (PyThreadState_Swap(NULL) != tstate)
671 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000672 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673
674 /* Other threads may run now */
675
Guido van Rossum65d5b571998-12-21 19:32:43 +0000676 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000677 if (PyThreadState_Swap(tstate) != NULL)
678 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 }
680#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682
Neil Schemenauer63543862002-02-17 19:10:14 +0000683 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000685
Guido van Rossum408027e1996-12-30 16:17:54 +0000686#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000687 f->f_lasti = INSTR_OFFSET();
688#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000689
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 opcode = NEXTOP();
691 if (HAS_ARG(opcode))
692 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000693 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000694#ifdef DYNAMIC_EXECUTION_PROFILE
695#ifdef DXPAIRS
696 dxpairs[lastopcode][opcode]++;
697 lastopcode = opcode;
698#endif
699 dxp[opcode]++;
700#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000701
Guido van Rossum96a42c81992-01-12 02:29:51 +0000702#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000704
Guido van Rossum96a42c81992-01-12 02:29:51 +0000705 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 if (HAS_ARG(opcode)) {
707 printf("%d: %d, %d\n",
708 (int) (INSTR_OFFSET() - 3),
709 opcode, oparg);
710 }
711 else {
712 printf("%d: %d\n",
713 (int) (INSTR_OFFSET() - 1), opcode);
714 }
715 }
716#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000720
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 /* BEWARE!
722 It is essential that any operation that fails sets either
723 x to NULL, err to nonzero, or why to anything but WHY_NOT,
724 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000727
Neil Schemenauer63543862002-02-17 19:10:14 +0000728 case SET_LINENO:
729#ifdef LLTRACE
730 if (lltrace)
731 printf("--- %s:%d \n", filename, oparg);
732#endif
733 f->f_lineno = oparg;
734 if (tstate->c_tracefunc == NULL || tstate->tracing)
735 goto fast_next_opcode;
736 /* Trace each line of code reached */
737 f->f_lasti = INSTR_OFFSET();
738 /* Inline call_trace() for performance: */
739 tstate->tracing++;
740 tstate->use_tracing = 0;
741 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
742 PyTrace_LINE, Py_None);
743 tstate->use_tracing = (tstate->c_tracefunc
744 || tstate->c_profilefunc);
745 tstate->tracing--;
746 break;
747
748 case LOAD_FAST:
749 x = GETLOCAL(oparg);
750 if (x != NULL) {
751 Py_INCREF(x);
752 PUSH(x);
753 goto fast_next_opcode;
754 }
755 format_exc_check_arg(PyExc_UnboundLocalError,
756 UNBOUNDLOCAL_ERROR_MSG,
757 PyTuple_GetItem(co->co_varnames, oparg));
758 break;
759
760 case LOAD_CONST:
761 x = GETCONST(oparg);
762 Py_INCREF(x);
763 PUSH(x);
764 goto fast_next_opcode;
765
766 case STORE_FAST:
767 v = POP();
768 SETLOCAL(oparg, v);
769 goto fast_next_opcode;
770
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 case POP_TOP:
772 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000773 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000774 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000775
Guido van Rossum374a9221991-04-04 10:40:29 +0000776 case ROT_TWO:
777 v = POP();
778 w = POP();
779 PUSH(v);
780 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000781 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000782
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 case ROT_THREE:
784 v = POP();
785 w = POP();
786 x = POP();
787 PUSH(v);
788 PUSH(x);
789 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000790 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000791
Thomas Wouters434d0822000-08-24 20:11:32 +0000792 case ROT_FOUR:
793 u = POP();
794 v = POP();
795 w = POP();
796 x = POP();
797 PUSH(u);
798 PUSH(x);
799 PUSH(w);
800 PUSH(v);
801 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000802
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 case DUP_TOP:
804 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000805 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000806 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000807 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000808
Thomas Wouters434d0822000-08-24 20:11:32 +0000809 case DUP_TOPX:
810 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000811 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000812 x = TOP();
813 Py_INCREF(x);
814 PUSH(x);
815 continue;
816 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000817 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000818 Py_INCREF(x);
819 w = TOP();
820 Py_INCREF(w);
821 PUSH(x);
822 PUSH(w);
823 PUSH(x);
824 continue;
825 case 3:
826 x = POP();
827 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000828 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000829 Py_INCREF(w);
830 v = TOP();
831 Py_INCREF(v);
832 PUSH(w);
833 PUSH(x);
834 PUSH(v);
835 PUSH(w);
836 PUSH(x);
837 continue;
838 case 4:
839 x = POP();
840 Py_INCREF(x);
841 w = POP();
842 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000843 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000844 Py_INCREF(v);
845 u = TOP();
846 Py_INCREF(u);
847 PUSH(v);
848 PUSH(w);
849 PUSH(x);
850 PUSH(u);
851 PUSH(v);
852 PUSH(w);
853 PUSH(x);
854 continue;
855 case 5:
856 x = POP();
857 Py_INCREF(x);
858 w = POP();
859 Py_INCREF(w);
860 v = POP();
861 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000862 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000863 Py_INCREF(u);
864 t = TOP();
865 Py_INCREF(t);
866 PUSH(u);
867 PUSH(v);
868 PUSH(w);
869 PUSH(x);
870 PUSH(t);
871 PUSH(u);
872 PUSH(v);
873 PUSH(w);
874 PUSH(x);
875 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000876 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000877 Py_FatalError("invalid argument to DUP_TOPX"
878 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000879 }
Tim Peters35ba6892000-10-11 07:04:49 +0000880 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000881
Guido van Rossum374a9221991-04-04 10:40:29 +0000882 case UNARY_POSITIVE:
883 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000884 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000885 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000887 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000889
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 case UNARY_NEGATIVE:
891 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000892 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000893 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000895 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000897
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 case UNARY_NOT:
899 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000902 if (err == 0) {
903 Py_INCREF(Py_True);
904 PUSH(Py_True);
905 continue;
906 }
907 else if (err > 0) {
908 Py_INCREF(Py_False);
909 PUSH(Py_False);
910 err = 0;
911 continue;
912 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000914
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 case UNARY_CONVERT:
916 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 x = PyObject_Repr(v);
918 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000920 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000922
Guido van Rossum7928cd71991-10-24 14:59:31 +0000923 case UNARY_INVERT:
924 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000925 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000926 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000927 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000928 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000929 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000930
Guido van Rossum50564e81996-01-12 01:13:16 +0000931 case BINARY_POWER:
932 w = POP();
933 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000934 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 Py_DECREF(v);
936 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000937 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000938 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000939 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000940
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 case BINARY_MULTIPLY:
942 w = POP();
943 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000944 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 Py_DECREF(v);
946 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000950
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000952 if (!_Py_QnewFlag) {
953 w = POP();
954 v = POP();
955 x = PyNumber_Divide(v, w);
956 Py_DECREF(v);
957 Py_DECREF(w);
958 PUSH(x);
959 if (x != NULL) continue;
960 break;
961 }
962 /* -Qnew is in effect: fall through to
963 BINARY_TRUE_DIVIDE */
964 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 w = POP();
966 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000967 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000968 Py_DECREF(v);
969 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000971 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000973
Guido van Rossum4668b002001-08-08 05:00:18 +0000974 case BINARY_FLOOR_DIVIDE:
975 w = POP();
976 v = POP();
977 x = PyNumber_FloorDivide(v, w);
978 Py_DECREF(v);
979 Py_DECREF(w);
980 PUSH(x);
981 if (x != NULL) continue;
982 break;
983
Guido van Rossum374a9221991-04-04 10:40:29 +0000984 case BINARY_MODULO:
985 w = POP();
986 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000987 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(v);
989 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000991 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000993
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 case BINARY_ADD:
995 w = POP();
996 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000997 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000998 /* INLINE: int + int */
999 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001000 a = PyInt_AS_LONG(v);
1001 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001002 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001003 if ((i^a) < 0 && (i^b) < 0)
1004 goto slow_add;
1005 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001007 else {
1008 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001010 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001011 Py_DECREF(v);
1012 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001014 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001016
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 case BINARY_SUBTRACT:
1018 w = POP();
1019 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001020 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001021 /* INLINE: int - int */
1022 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001023 a = PyInt_AS_LONG(v);
1024 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001025 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001026 if ((i^a) < 0 && (i^~b) < 0)
1027 goto slow_sub;
1028 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001029 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001030 else {
1031 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001032 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001033 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 Py_DECREF(v);
1035 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001037 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001039
Guido van Rossum374a9221991-04-04 10:40:29 +00001040 case BINARY_SUBSCR:
1041 w = POP();
1042 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001043 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001044 /* INLINE: list[int] */
1045 long i = PyInt_AsLong(w);
1046 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001047 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001048 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001049 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001050 PyErr_SetString(PyExc_IndexError,
1051 "list index out of range");
1052 x = NULL;
1053 }
1054 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001055 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001056 Py_INCREF(x);
1057 }
1058 }
1059 else
1060 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001061 Py_DECREF(v);
1062 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001064 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001065 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001066
Guido van Rossum7928cd71991-10-24 14:59:31 +00001067 case BINARY_LSHIFT:
1068 w = POP();
1069 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001070 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001071 Py_DECREF(v);
1072 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001073 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001074 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001075 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001076
Guido van Rossum7928cd71991-10-24 14:59:31 +00001077 case BINARY_RSHIFT:
1078 w = POP();
1079 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001080 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001081 Py_DECREF(v);
1082 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001083 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001084 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001085 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001086
Guido van Rossum7928cd71991-10-24 14:59:31 +00001087 case BINARY_AND:
1088 w = POP();
1089 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001090 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001091 Py_DECREF(v);
1092 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001093 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001094 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001096
Guido van Rossum7928cd71991-10-24 14:59:31 +00001097 case BINARY_XOR:
1098 w = POP();
1099 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001100 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001101 Py_DECREF(v);
1102 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001103 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001104 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001105 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001106
Guido van Rossum7928cd71991-10-24 14:59:31 +00001107 case BINARY_OR:
1108 w = POP();
1109 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001110 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001111 Py_DECREF(v);
1112 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001113 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001114 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001115 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001116
1117 case INPLACE_POWER:
1118 w = POP();
1119 v = POP();
1120 x = PyNumber_InPlacePower(v, w, Py_None);
1121 Py_DECREF(v);
1122 Py_DECREF(w);
1123 PUSH(x);
1124 if (x != NULL) continue;
1125 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001126
Thomas Wouters434d0822000-08-24 20:11:32 +00001127 case INPLACE_MULTIPLY:
1128 w = POP();
1129 v = POP();
1130 x = PyNumber_InPlaceMultiply(v, w);
1131 Py_DECREF(v);
1132 Py_DECREF(w);
1133 PUSH(x);
1134 if (x != NULL) continue;
1135 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001136
Thomas Wouters434d0822000-08-24 20:11:32 +00001137 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001138 if (!_Py_QnewFlag) {
1139 w = POP();
1140 v = POP();
1141 x = PyNumber_InPlaceDivide(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 PUSH(x);
1145 if (x != NULL) continue;
1146 break;
1147 }
1148 /* -Qnew is in effect: fall through to
1149 INPLACE_TRUE_DIVIDE */
1150 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 w = POP();
1152 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001153 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001154 Py_DECREF(v);
1155 Py_DECREF(w);
1156 PUSH(x);
1157 if (x != NULL) continue;
1158 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001159
Guido van Rossum4668b002001-08-08 05:00:18 +00001160 case INPLACE_FLOOR_DIVIDE:
1161 w = POP();
1162 v = POP();
1163 x = PyNumber_InPlaceFloorDivide(v, w);
1164 Py_DECREF(v);
1165 Py_DECREF(w);
1166 PUSH(x);
1167 if (x != NULL) continue;
1168 break;
1169
Thomas Wouters434d0822000-08-24 20:11:32 +00001170 case INPLACE_MODULO:
1171 w = POP();
1172 v = POP();
1173 x = PyNumber_InPlaceRemainder(v, w);
1174 Py_DECREF(v);
1175 Py_DECREF(w);
1176 PUSH(x);
1177 if (x != NULL) continue;
1178 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001179
Thomas Wouters434d0822000-08-24 20:11:32 +00001180 case INPLACE_ADD:
1181 w = POP();
1182 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001183 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001184 /* INLINE: int + int */
1185 register long a, b, i;
1186 a = PyInt_AS_LONG(v);
1187 b = PyInt_AS_LONG(w);
1188 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001189 if ((i^a) < 0 && (i^b) < 0)
1190 goto slow_iadd;
1191 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001192 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001193 else {
1194 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001195 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001196 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001197 Py_DECREF(v);
1198 Py_DECREF(w);
1199 PUSH(x);
1200 if (x != NULL) continue;
1201 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001202
Thomas Wouters434d0822000-08-24 20:11:32 +00001203 case INPLACE_SUBTRACT:
1204 w = POP();
1205 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001206 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001207 /* INLINE: int - int */
1208 register long a, b, i;
1209 a = PyInt_AS_LONG(v);
1210 b = PyInt_AS_LONG(w);
1211 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001212 if ((i^a) < 0 && (i^~b) < 0)
1213 goto slow_isub;
1214 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001216 else {
1217 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001218 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001219 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001220 Py_DECREF(v);
1221 Py_DECREF(w);
1222 PUSH(x);
1223 if (x != NULL) continue;
1224 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001225
Thomas Wouters434d0822000-08-24 20:11:32 +00001226 case INPLACE_LSHIFT:
1227 w = POP();
1228 v = POP();
1229 x = PyNumber_InPlaceLshift(v, w);
1230 Py_DECREF(v);
1231 Py_DECREF(w);
1232 PUSH(x);
1233 if (x != NULL) continue;
1234 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001235
Thomas Wouters434d0822000-08-24 20:11:32 +00001236 case INPLACE_RSHIFT:
1237 w = POP();
1238 v = POP();
1239 x = PyNumber_InPlaceRshift(v, w);
1240 Py_DECREF(v);
1241 Py_DECREF(w);
1242 PUSH(x);
1243 if (x != NULL) continue;
1244 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001245
Thomas Wouters434d0822000-08-24 20:11:32 +00001246 case INPLACE_AND:
1247 w = POP();
1248 v = POP();
1249 x = PyNumber_InPlaceAnd(v, w);
1250 Py_DECREF(v);
1251 Py_DECREF(w);
1252 PUSH(x);
1253 if (x != NULL) continue;
1254 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001255
Thomas Wouters434d0822000-08-24 20:11:32 +00001256 case INPLACE_XOR:
1257 w = POP();
1258 v = POP();
1259 x = PyNumber_InPlaceXor(v, w);
1260 Py_DECREF(v);
1261 Py_DECREF(w);
1262 PUSH(x);
1263 if (x != NULL) continue;
1264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Thomas Wouters434d0822000-08-24 20:11:32 +00001266 case INPLACE_OR:
1267 w = POP();
1268 v = POP();
1269 x = PyNumber_InPlaceOr(v, w);
1270 Py_DECREF(v);
1271 Py_DECREF(w);
1272 PUSH(x);
1273 if (x != NULL) continue;
1274 break;
1275
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 case SLICE+0:
1277 case SLICE+1:
1278 case SLICE+2:
1279 case SLICE+3:
1280 if ((opcode-SLICE) & 2)
1281 w = POP();
1282 else
1283 w = NULL;
1284 if ((opcode-SLICE) & 1)
1285 v = POP();
1286 else
1287 v = NULL;
1288 u = POP();
1289 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 Py_DECREF(u);
1291 Py_XDECREF(v);
1292 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001294 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001296
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 case STORE_SLICE+0:
1298 case STORE_SLICE+1:
1299 case STORE_SLICE+2:
1300 case STORE_SLICE+3:
1301 if ((opcode-STORE_SLICE) & 2)
1302 w = POP();
1303 else
1304 w = NULL;
1305 if ((opcode-STORE_SLICE) & 1)
1306 v = POP();
1307 else
1308 v = NULL;
1309 u = POP();
1310 t = POP();
1311 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 Py_DECREF(t);
1313 Py_DECREF(u);
1314 Py_XDECREF(v);
1315 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001316 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001318
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 case DELETE_SLICE+0:
1320 case DELETE_SLICE+1:
1321 case DELETE_SLICE+2:
1322 case DELETE_SLICE+3:
1323 if ((opcode-DELETE_SLICE) & 2)
1324 w = POP();
1325 else
1326 w = NULL;
1327 if ((opcode-DELETE_SLICE) & 1)
1328 v = POP();
1329 else
1330 v = NULL;
1331 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 Py_DECREF(u);
1335 Py_XDECREF(v);
1336 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001337 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001339
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 case STORE_SUBSCR:
1341 w = POP();
1342 v = POP();
1343 u = POP();
1344 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001345 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 Py_DECREF(u);
1347 Py_DECREF(v);
1348 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001349 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001351
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 case DELETE_SUBSCR:
1353 w = POP();
1354 v = POP();
1355 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001356 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001357 Py_DECREF(v);
1358 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001359 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001361
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 case PRINT_EXPR:
1363 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001364 w = PySys_GetObject("displayhook");
1365 if (w == NULL) {
1366 PyErr_SetString(PyExc_RuntimeError,
1367 "lost sys.displayhook");
1368 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001369 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001370 }
1371 if (err == 0) {
1372 x = Py_BuildValue("(O)", v);
1373 if (x == NULL)
1374 err = -1;
1375 }
1376 if (err == 0) {
1377 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001378 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001379 if (w == NULL)
1380 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001383 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001385
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001386 case PRINT_ITEM_TO:
1387 w = stream = POP();
1388 /* fall through to PRINT_ITEM */
1389
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 case PRINT_ITEM:
1391 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001392 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001393 w = PySys_GetObject("stdout");
1394 if (w == NULL) {
1395 PyErr_SetString(PyExc_RuntimeError,
1396 "lost sys.stdout");
1397 err = -1;
1398 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001399 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001400 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001401 err = PyFile_WriteString(" ", w);
1402 if (err == 0)
1403 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001404 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001405 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001406 if (PyString_Check(v)) {
1407 char *s = PyString_AS_STRING(v);
1408 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001409 if (len == 0 ||
1410 !isspace(Py_CHARMASK(s[len-1])) ||
1411 s[len-1] == ' ')
1412 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001413 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001414#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001415 else if (PyUnicode_Check(v)) {
1416 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1417 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001418 if (len == 0 ||
1419 !Py_UNICODE_ISSPACE(s[len-1]) ||
1420 s[len-1] == ' ')
1421 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001422 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001423 else
1424 PyFile_SoftSpace(w, 1);
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001425#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001428 Py_XDECREF(stream);
1429 stream = NULL;
1430 if (err == 0)
1431 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001432 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001433
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001434 case PRINT_NEWLINE_TO:
1435 w = stream = POP();
1436 /* fall through to PRINT_NEWLINE */
1437
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001439 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001440 w = PySys_GetObject("stdout");
1441 if (w == NULL)
1442 PyErr_SetString(PyExc_RuntimeError,
1443 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001444 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001445 if (w != NULL) {
1446 err = PyFile_WriteString("\n", w);
1447 if (err == 0)
1448 PyFile_SoftSpace(w, 0);
1449 }
1450 Py_XDECREF(stream);
1451 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001453
Thomas Wouters434d0822000-08-24 20:11:32 +00001454
1455#ifdef CASE_TOO_BIG
1456 default: switch (opcode) {
1457#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 case BREAK_LOOP:
1459 why = WHY_BREAK;
1460 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001461
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001462 case CONTINUE_LOOP:
1463 retval = PyInt_FromLong(oparg);
1464 why = WHY_CONTINUE;
1465 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001466
Guido van Rossumf10570b1995-07-07 22:53:21 +00001467 case RAISE_VARARGS:
1468 u = v = w = NULL;
1469 switch (oparg) {
1470 case 3:
1471 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001472 /* Fallthrough */
1473 case 2:
1474 v = POP(); /* value */
1475 /* Fallthrough */
1476 case 1:
1477 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001478 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001479 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480 break;
1481 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001482 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001483 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001484 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001485 break;
1486 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001488
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001490 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001491 PyErr_SetString(PyExc_SystemError,
1492 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001493 break;
1494 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001496 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001498
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 case RETURN_VALUE:
1500 retval = POP();
1501 why = WHY_RETURN;
1502 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001503
Tim Peters5ca576e2001-06-18 22:08:13 +00001504 case YIELD_VALUE:
1505 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001506 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001507 f->f_lasti = INSTR_OFFSET();
1508 why = WHY_YIELD;
1509 break;
1510
1511
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001512 case EXEC_STMT:
1513 w = POP();
1514 v = POP();
1515 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001516 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001517 Py_DECREF(u);
1518 Py_DECREF(v);
1519 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001520 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001521
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 case POP_BLOCK:
1523 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 while (STACK_LEVEL() > b->b_level) {
1526 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 }
1529 }
1530 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001531
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 case END_FINALLY:
1533 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 if (PyInt_Check(v)) {
1535 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001536 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001537 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001538 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 retval = POP();
1540 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001543 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001546 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001548 else if (v != Py_None) {
1549 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001550 "'finally' pops bad exception");
1551 why = WHY_EXCEPTION;
1552 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001555
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001557 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001559 w = POP();
1560 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 Py_DECREF(u);
1563 Py_DECREF(v);
1564 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001566
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 case STORE_NAME:
1568 w = GETNAMEV(oparg);
1569 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001570 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001571 PyErr_Format(PyExc_SystemError,
1572 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001573 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001574 break;
1575 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 err = PyDict_SetItem(x, w, v);
1577 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001579
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001581 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001582 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001583 PyErr_Format(PyExc_SystemError,
1584 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001585 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001586 break;
1587 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001589 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001590 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001592
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001593 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001595 if (PyTuple_Check(v)) {
1596 if (PyTuple_Size(v) != oparg) {
1597 PyErr_SetString(PyExc_ValueError,
1598 "unpack tuple of wrong size");
1599 why = WHY_EXCEPTION;
1600 }
1601 else {
1602 for (; --oparg >= 0; ) {
1603 w = PyTuple_GET_ITEM(v, oparg);
1604 Py_INCREF(w);
1605 PUSH(w);
1606 }
1607 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001609 else if (PyList_Check(v)) {
1610 if (PyList_Size(v) != oparg) {
1611 PyErr_SetString(PyExc_ValueError,
1612 "unpack list of wrong size");
1613 why = WHY_EXCEPTION;
1614 }
1615 else {
1616 for (; --oparg >= 0; ) {
1617 w = PyList_GET_ITEM(v, oparg);
1618 Py_INCREF(w);
1619 PUSH(w);
1620 }
1621 }
1622 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001623 else if (unpack_iterable(v, oparg,
1624 stack_pointer + oparg))
1625 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001626 else {
1627 if (PyErr_ExceptionMatches(PyExc_TypeError))
1628 PyErr_SetString(PyExc_TypeError,
1629 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001630 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001631 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001632 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001634
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001636 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 v = POP();
1638 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001639 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1640 Py_DECREF(v);
1641 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001643
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001645 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001647 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1648 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001651
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001652 case STORE_GLOBAL:
1653 w = GETNAMEV(oparg);
1654 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 err = PyDict_SetItem(f->f_globals, w, v);
1656 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001657 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001658
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001659 case DELETE_GLOBAL:
1660 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001662 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001663 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001664 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001665
Guido van Rossum374a9221991-04-04 10:40:29 +00001666 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001667 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001668 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001669 PyErr_Format(PyExc_SystemError,
1670 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001671 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001672 break;
1673 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001680 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001681 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001682 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 break;
1684 }
1685 }
1686 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001687 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 PUSH(x);
1689 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001690
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001692 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001697 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001698 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001699 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001700 break;
1701 }
1702 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001703 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 PUSH(x);
1705 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001706
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001707 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001708 x = GETLOCAL(oparg);
1709 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001710 format_exc_check_arg(
1711 PyExc_UnboundLocalError,
1712 UNBOUNDLOCAL_ERROR_MSG,
1713 PyTuple_GetItem(co->co_varnames, oparg)
1714 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001715 break;
1716 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001717 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001718 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001719
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001720 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001721 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001722 Py_INCREF(x);
1723 PUSH(x);
1724 break;
1725
1726 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001727 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001728 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001729 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001730 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001731 v = PyTuple_GetItem(co->co_cellvars,
1732 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001733 format_exc_check_arg(
1734 PyExc_UnboundLocalError,
1735 UNBOUNDLOCAL_ERROR_MSG,
1736 v);
1737 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001738 v = PyTuple_GetItem(
1739 co->co_freevars,
1740 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001741 format_exc_check_arg(
1742 PyExc_NameError,
1743 UNBOUNDFREE_ERROR_MSG,
1744 v);
1745 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001746 err = -1;
1747 break;
1748 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001749 PUSH(w);
1750 break;
1751
1752 case STORE_DEREF:
1753 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001754 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001755 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001756 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001757 continue;
1758
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 if (x != NULL) {
1762 for (; --oparg >= 0;) {
1763 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001764 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 }
1766 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001767 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 }
1769 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001770
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 if (x != NULL) {
1774 for (; --oparg >= 0;) {
1775 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001776 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001777 }
1778 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001779 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 }
1781 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001782
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001786 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001788
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001790 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001792 x = PyObject_GetAttr(v, w);
1793 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001795 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001797
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 case COMPARE_OP:
1799 w = POP();
1800 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001801 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001802 /* INLINE: cmp(int, int) */
1803 register long a, b;
1804 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001805 a = PyInt_AS_LONG(v);
1806 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001807 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001808 case PyCmp_LT: res = a < b; break;
1809 case PyCmp_LE: res = a <= b; break;
1810 case PyCmp_EQ: res = a == b; break;
1811 case PyCmp_NE: res = a != b; break;
1812 case PyCmp_GT: res = a > b; break;
1813 case PyCmp_GE: res = a >= b; break;
1814 case PyCmp_IS: res = v == w; break;
1815 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001816 default: goto slow_compare;
1817 }
1818 x = res ? Py_True : Py_False;
1819 Py_INCREF(x);
1820 }
1821 else {
1822 slow_compare:
1823 x = cmp_outcome(oparg, v, w);
1824 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001825 Py_DECREF(v);
1826 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001828 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001830
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001832 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001833 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001834 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001835 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001836 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001837 break;
1838 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001839 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001840 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001841 w,
1842 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001843 f->f_locals == NULL ?
1844 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001845 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001847 if (w == NULL) {
1848 x = NULL;
1849 break;
1850 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 x = PyEval_CallObject(x, w);
1852 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001853 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001854 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001856
Thomas Wouters52152252000-08-17 22:55:00 +00001857 case IMPORT_STAR:
1858 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001860 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001861 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001862 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001863 break;
1864 }
Thomas Wouters52152252000-08-17 22:55:00 +00001865 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001866 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001867 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001868 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001870
Thomas Wouters52152252000-08-17 22:55:00 +00001871 case IMPORT_FROM:
1872 w = GETNAMEV(oparg);
1873 v = TOP();
1874 x = import_from(v, w);
1875 PUSH(x);
1876 if (x != NULL) continue;
1877 break;
1878
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 case JUMP_FORWARD:
1880 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001881 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001882
Guido van Rossum374a9221991-04-04 10:40:29 +00001883 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001884 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001885 if (err > 0)
1886 err = 0;
1887 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001888 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001889 else
1890 break;
1891 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001892
Guido van Rossum374a9221991-04-04 10:40:29 +00001893 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001894 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001895 if (err > 0) {
1896 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001897 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001898 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001899 else if (err == 0)
1900 ;
1901 else
1902 break;
1903 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001904
Guido van Rossum374a9221991-04-04 10:40:29 +00001905 case JUMP_ABSOLUTE:
1906 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001907 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001908
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001909 case GET_ITER:
1910 /* before: [obj]; after [getiter(obj)] */
1911 v = POP();
1912 x = PyObject_GetIter(v);
1913 Py_DECREF(v);
1914 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001915 PUSH(x);
1916 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001917 }
1918 break;
1919
1920 case FOR_ITER:
1921 /* before: [iter]; after: [iter, iter()] *or* [] */
1922 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001923 x = PyIter_Next(v);
1924 if (x != NULL) {
1925 PUSH(x);
1926 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001927 }
Tim Petersf4848da2001-05-05 00:14:56 +00001928 if (!PyErr_Occurred()) {
1929 /* iterator ended normally */
1930 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001931 Py_DECREF(v);
1932 JUMPBY(oparg);
1933 continue;
1934 }
1935 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001936
Guido van Rossum374a9221991-04-04 10:40:29 +00001937 case FOR_LOOP:
1938 /* for v in s: ...
1939 On entry: stack contains s, i.
1940 On exit: stack contains s, i+1, s[i];
1941 but if loop exhausted:
1942 s, i are popped, and we jump */
1943 w = POP(); /* Loop index */
1944 v = POP(); /* Sequence object */
1945 u = loop_subscript(v, w);
1946 if (u != NULL) {
1947 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001948 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001949 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001950 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001951 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001952 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001953 }
1954 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001955 Py_DECREF(v);
1956 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001957 /* A NULL can mean "s exhausted"
1958 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001959 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001960 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001961 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001962 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001963 continue;
1964 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001965 }
1966 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001967
Guido van Rossum374a9221991-04-04 10:40:29 +00001968 case SETUP_LOOP:
1969 case SETUP_EXCEPT:
1970 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001971 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001972 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001973 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001974
Guido van Rossumf10570b1995-07-07 22:53:21 +00001975 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 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002989#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002990 if (codeflags & CO_GENERATOR_ALLOWED) {
2991 result = 1;
2992 cf->cf_flags |= CO_GENERATOR_ALLOWED;
2993 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002994#endif
Tim Peters5ba58662001-07-16 02:29:45 +00002995 }
2996 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002997}
2998
2999int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003000Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001{
Guido van Rossumb209a111997-04-29 18:18:01 +00003002 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003003 if (f == NULL)
3004 return 0;
3005 if (!PyFile_SoftSpace(f, 0))
3006 return 0;
3007 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008}
3009
Guido van Rossum3f5da241990-12-20 15:06:42 +00003010
Guido van Rossum681d79a1995-07-18 14:51:37 +00003011/* External interface to call any callable object.
3012 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003013
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003014#undef PyEval_CallObject
3015/* for backward compatibility: export this interface */
3016
Guido van Rossumb209a111997-04-29 18:18:01 +00003017PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003018PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003019{
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003021}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003022#define PyEval_CallObject(func,arg) \
3023 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003024
Guido van Rossumb209a111997-04-29 18:18:01 +00003025PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003026PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003027{
Jeremy Hylton52820442001-01-03 23:52:36 +00003028 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029
3030 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003031 arg = PyTuple_New(0);
3032 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003033 PyErr_SetString(PyExc_TypeError,
3034 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003035 return NULL;
3036 }
3037 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003038 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003039
Guido van Rossumb209a111997-04-29 18:18:01 +00003040 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003041 PyErr_SetString(PyExc_TypeError,
3042 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003043 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003044 return NULL;
3045 }
3046
Tim Peters6d6c1a32001-08-02 04:15:00 +00003047 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003048 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003049 return result;
3050}
3051
Tim Peters6d6c1a32001-08-02 04:15:00 +00003052char *
3053PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003054{
3055 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003056 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003057 else if (PyFunction_Check(func))
3058 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3059 else if (PyCFunction_Check(func))
3060 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3061 else if (PyClass_Check(func))
3062 return PyString_AsString(((PyClassObject*)func)->cl_name);
3063 else if (PyInstance_Check(func)) {
3064 return PyString_AsString(
3065 ((PyInstanceObject*)func)->in_class->cl_name);
3066 } else {
3067 return func->ob_type->tp_name;
3068 }
3069}
3070
Tim Peters6d6c1a32001-08-02 04:15:00 +00003071char *
3072PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003073{
3074 if (PyMethod_Check(func))
3075 return "()";
3076 else if (PyFunction_Check(func))
3077 return "()";
3078 else if (PyCFunction_Check(func))
3079 return "()";
3080 else if (PyClass_Check(func))
3081 return " constructor";
3082 else if (PyInstance_Check(func)) {
3083 return " instance";
3084 } else {
3085 return " object";
3086 }
3087}
3088
Jeremy Hylton52820442001-01-03 23:52:36 +00003089#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3090
3091/* The two fast_xxx() functions optimize calls for which no argument
3092 tuple is necessary; the objects are passed directly from the stack.
3093 fast_cfunction() is called for METH_OLDARGS functions.
3094 fast_function() is for functions with no special argument handling.
3095*/
3096
3097static PyObject *
3098fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3099{
3100 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3101 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003102 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003103
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003104 switch (flags) {
3105 case METH_OLDARGS:
3106 if (na == 0)
3107 return (*meth)(self, NULL);
3108 else if (na == 1) {
3109 PyObject *arg = EXT_POP(*pp_stack);
3110 PyObject *result = (*meth)(self, arg);
3111 Py_DECREF(arg);
3112 return result;
3113 } else {
3114 PyObject *args = load_args(pp_stack, na);
3115 PyObject *result = (*meth)(self, args);
3116 Py_DECREF(args);
3117 return result;
3118 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003119 case METH_NOARGS:
3120 if (na == 0)
3121 return (*meth)(self, NULL);
3122 PyErr_Format(PyExc_TypeError,
3123 "%.200s() takes no arguments (%d given)",
3124 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3125 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003126 case METH_O:
3127 if (na == 1) {
3128 PyObject *arg = EXT_POP(*pp_stack);
3129 PyObject *result = (*meth)(self, arg);
3130 Py_DECREF(arg);
3131 return result;
3132 }
3133 PyErr_Format(PyExc_TypeError,
3134 "%.200s() takes exactly one argument (%d given)",
3135 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3136 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003137 default:
3138 fprintf(stderr, "%.200s() flags = %d\n",
3139 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3140 PyErr_BadInternalCall();
3141 return NULL;
3142 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003143}
3144
3145static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003146fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003147{
3148 PyObject *co = PyFunction_GET_CODE(func);
3149 PyObject *globals = PyFunction_GET_GLOBALS(func);
3150 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003151 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003152 PyObject **d = NULL;
3153 int nd = 0;
3154
3155 if (argdefs != NULL) {
3156 d = &PyTuple_GET_ITEM(argdefs, 0);
3157 nd = ((PyTupleObject *)argdefs)->ob_size;
3158 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003159 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003160 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003161 (*pp_stack)-2*nk, nk, d, nd,
3162 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003163}
3164
3165static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003166update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3167 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003168{
3169 PyObject *kwdict = NULL;
3170 if (orig_kwdict == NULL)
3171 kwdict = PyDict_New();
3172 else {
3173 kwdict = PyDict_Copy(orig_kwdict);
3174 Py_DECREF(orig_kwdict);
3175 }
3176 if (kwdict == NULL)
3177 return NULL;
3178 while (--nk >= 0) {
3179 int err;
3180 PyObject *value = EXT_POP(*pp_stack);
3181 PyObject *key = EXT_POP(*pp_stack);
3182 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003183 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003184 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003185 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003186 PyEval_GetFuncName(func),
3187 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003188 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003189 Py_DECREF(key);
3190 Py_DECREF(value);
3191 Py_DECREF(kwdict);
3192 return NULL;
3193 }
3194 err = PyDict_SetItem(kwdict, key, value);
3195 Py_DECREF(key);
3196 Py_DECREF(value);
3197 if (err) {
3198 Py_DECREF(kwdict);
3199 return NULL;
3200 }
3201 }
3202 return kwdict;
3203}
3204
3205static PyObject *
3206update_star_args(int nstack, int nstar, PyObject *stararg,
3207 PyObject ***pp_stack)
3208{
3209 PyObject *callargs, *w;
3210
3211 callargs = PyTuple_New(nstack + nstar);
3212 if (callargs == NULL) {
3213 return NULL;
3214 }
3215 if (nstar) {
3216 int i;
3217 for (i = 0; i < nstar; i++) {
3218 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3219 Py_INCREF(a);
3220 PyTuple_SET_ITEM(callargs, nstack + i, a);
3221 }
3222 }
3223 while (--nstack >= 0) {
3224 w = EXT_POP(*pp_stack);
3225 PyTuple_SET_ITEM(callargs, nstack, w);
3226 }
3227 return callargs;
3228}
3229
3230static PyObject *
3231load_args(PyObject ***pp_stack, int na)
3232{
3233 PyObject *args = PyTuple_New(na);
3234 PyObject *w;
3235
3236 if (args == NULL)
3237 return NULL;
3238 while (--na >= 0) {
3239 w = EXT_POP(*pp_stack);
3240 PyTuple_SET_ITEM(args, na, w);
3241 }
3242 return args;
3243}
3244
3245static PyObject *
3246do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3247{
3248 PyObject *callargs = NULL;
3249 PyObject *kwdict = NULL;
3250 PyObject *result = NULL;
3251
3252 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003253 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003254 if (kwdict == NULL)
3255 goto call_fail;
3256 }
3257 callargs = load_args(pp_stack, na);
3258 if (callargs == NULL)
3259 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003260 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003261 call_fail:
3262 Py_XDECREF(callargs);
3263 Py_XDECREF(kwdict);
3264 return result;
3265}
3266
3267static PyObject *
3268ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3269{
3270 int nstar = 0;
3271 PyObject *callargs = NULL;
3272 PyObject *stararg = NULL;
3273 PyObject *kwdict = NULL;
3274 PyObject *result = NULL;
3275
3276 if (flags & CALL_FLAG_KW) {
3277 kwdict = EXT_POP(*pp_stack);
3278 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003279 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003280 "%s%s argument after ** "
3281 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003282 PyEval_GetFuncName(func),
3283 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003284 goto ext_call_fail;
3285 }
3286 }
3287 if (flags & CALL_FLAG_VAR) {
3288 stararg = EXT_POP(*pp_stack);
3289 if (!PyTuple_Check(stararg)) {
3290 PyObject *t = NULL;
3291 t = PySequence_Tuple(stararg);
3292 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003293 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3294 PyErr_Format(PyExc_TypeError,
3295 "%s%s argument after * "
3296 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003297 PyEval_GetFuncName(func),
3298 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003299 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003300 goto ext_call_fail;
3301 }
3302 Py_DECREF(stararg);
3303 stararg = t;
3304 }
3305 nstar = PyTuple_GET_SIZE(stararg);
3306 }
3307 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003308 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003309 if (kwdict == NULL)
3310 goto ext_call_fail;
3311 }
3312 callargs = update_star_args(na, nstar, stararg, pp_stack);
3313 if (callargs == NULL)
3314 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003315 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003316 ext_call_fail:
3317 Py_XDECREF(callargs);
3318 Py_XDECREF(kwdict);
3319 Py_XDECREF(stararg);
3320 return result;
3321}
3322
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003323#define SLICE_ERROR_MSG \
3324 "standard sequence type does not support step size other than one"
3325
Guido van Rossumb209a111997-04-29 18:18:01 +00003326static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003327loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328{
Guido van Rossumb209a111997-04-29 18:18:01 +00003329 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003330 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003331 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003332 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 return NULL;
3334 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003335 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003336 v = (*sq->sq_item)(v, i);
3337 if (v)
3338 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003339 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003340 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003341 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342}
3343
Tim Peterscb479e72001-12-16 19:11:44 +00003344/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3345 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3346 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3347*/
Tim Petersb5196382001-12-16 19:44:20 +00003348/* Note: If v is NULL, return success without storing into *pi. This
3349 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3350 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003351*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003352int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003353_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354{
Tim Petersb5196382001-12-16 19:44:20 +00003355 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003356 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003357 if (PyInt_Check(v)) {
3358 x = PyInt_AsLong(v);
3359 } else if (PyLong_Check(v)) {
3360 x = PyLong_AsLong(v);
3361 if (x==-1 && PyErr_Occurred()) {
3362 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003363 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003364
Guido van Rossumac7be682001-01-17 15:42:30 +00003365 if (!PyErr_ExceptionMatches(
3366 PyExc_OverflowError)) {
3367 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003368 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003369 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003370 }
3371
Guido van Rossumac7be682001-01-17 15:42:30 +00003372 /* Clear the OverflowError */
3373 PyErr_Clear();
3374
3375 /* It's an overflow error, so we need to
3376 check the sign of the long integer,
3377 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003378 the error. */
3379
3380 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003381 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003382 if (long_zero == NULL)
3383 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003384
3385 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003386 cmp = PyObject_RichCompareBool(v, long_zero,
3387 Py_GT);
3388 Py_DECREF(long_zero);
3389 if (cmp < 0)
3390 return 0;
3391 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003392 x = INT_MAX;
3393 else
3394 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003395 }
3396 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003397 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003398 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003399 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003401 /* Truncate -- very long indices are truncated anyway */
3402 if (x > INT_MAX)
3403 x = INT_MAX;
3404 else if (x < -INT_MAX)
3405 x = 0;
3406 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003408 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409}
3410
Guido van Rossum50d756e2001-08-18 17:43:36 +00003411#undef ISINT
3412#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3413
Guido van Rossumb209a111997-04-29 18:18:01 +00003414static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003415apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003416{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003417 PyTypeObject *tp = u->ob_type;
3418 PySequenceMethods *sq = tp->tp_as_sequence;
3419
3420 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3421 int ilow = 0, ihigh = INT_MAX;
3422 if (!_PyEval_SliceIndex(v, &ilow))
3423 return NULL;
3424 if (!_PyEval_SliceIndex(w, &ihigh))
3425 return NULL;
3426 return PySequence_GetSlice(u, ilow, ihigh);
3427 }
3428 else {
3429 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003430 if (slice != NULL) {
3431 PyObject *res = PyObject_GetItem(u, slice);
3432 Py_DECREF(slice);
3433 return res;
3434 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003435 else
3436 return NULL;
3437 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003438}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003439
3440static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003441assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3442 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003444 PyTypeObject *tp = u->ob_type;
3445 PySequenceMethods *sq = tp->tp_as_sequence;
3446
3447 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3448 int ilow = 0, ihigh = INT_MAX;
3449 if (!_PyEval_SliceIndex(v, &ilow))
3450 return -1;
3451 if (!_PyEval_SliceIndex(w, &ihigh))
3452 return -1;
3453 if (x == NULL)
3454 return PySequence_DelSlice(u, ilow, ihigh);
3455 else
3456 return PySequence_SetSlice(u, ilow, ihigh, x);
3457 }
3458 else {
3459 PyObject *slice = PySlice_New(v, w, NULL);
3460 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003461 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003462 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003463 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003464 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003465 res = PyObject_DelItem(u, slice);
3466 Py_DECREF(slice);
3467 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003468 }
3469 else
3470 return -1;
3471 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472}
3473
Guido van Rossumb209a111997-04-29 18:18:01 +00003474static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003475cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003476{
Guido van Rossumac7be682001-01-17 15:42:30 +00003477 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003479 case PyCmp_IS:
3480 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003481 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003482 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003483 res = !res;
3484 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003485 case PyCmp_IN:
3486 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003487 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003488 if (res < 0)
3489 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003490 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003491 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003493 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003494 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495 break;
3496 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003497 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003499 v = res ? Py_True : Py_False;
3500 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003501 return v;
3502}
3503
Thomas Wouters52152252000-08-17 22:55:00 +00003504static PyObject *
3505import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003506{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003507 PyObject *x;
3508
3509 x = PyObject_GetAttr(v, name);
3510 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003511 PyErr_Format(PyExc_ImportError,
3512 "cannot import name %.230s",
3513 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003514 }
Thomas Wouters52152252000-08-17 22:55:00 +00003515 return x;
3516}
Guido van Rossumac7be682001-01-17 15:42:30 +00003517
Thomas Wouters52152252000-08-17 22:55:00 +00003518static int
3519import_all_from(PyObject *locals, PyObject *v)
3520{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003521 PyObject *all = PyObject_GetAttrString(v, "__all__");
3522 PyObject *dict, *name, *value;
3523 int skip_leading_underscores = 0;
3524 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003525
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003526 if (all == NULL) {
3527 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3528 return -1; /* Unexpected error */
3529 PyErr_Clear();
3530 dict = PyObject_GetAttrString(v, "__dict__");
3531 if (dict == NULL) {
3532 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3533 return -1;
3534 PyErr_SetString(PyExc_ImportError,
3535 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003536 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003537 }
3538 all = PyMapping_Keys(dict);
3539 Py_DECREF(dict);
3540 if (all == NULL)
3541 return -1;
3542 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003543 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003544
3545 for (pos = 0, err = 0; ; pos++) {
3546 name = PySequence_GetItem(all, pos);
3547 if (name == NULL) {
3548 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3549 err = -1;
3550 else
3551 PyErr_Clear();
3552 break;
3553 }
3554 if (skip_leading_underscores &&
3555 PyString_Check(name) &&
3556 PyString_AS_STRING(name)[0] == '_')
3557 {
3558 Py_DECREF(name);
3559 continue;
3560 }
3561 value = PyObject_GetAttr(v, name);
3562 if (value == NULL)
3563 err = -1;
3564 else
3565 err = PyDict_SetItem(locals, name, value);
3566 Py_DECREF(name);
3567 Py_XDECREF(value);
3568 if (err != 0)
3569 break;
3570 }
3571 Py_DECREF(all);
3572 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003573}
3574
Guido van Rossumb209a111997-04-29 18:18:01 +00003575static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003576build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003577{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003578 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003579
3580 if (PyDict_Check(methods))
3581 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003582 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003583 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003584 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3585 base = PyTuple_GET_ITEM(bases, 0);
3586 metaclass = PyObject_GetAttrString(base, "__class__");
3587 if (metaclass == NULL) {
3588 PyErr_Clear();
3589 metaclass = (PyObject *)base->ob_type;
3590 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003591 }
3592 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003593 else {
3594 PyObject *g = PyEval_GetGlobals();
3595 if (g != NULL && PyDict_Check(g))
3596 metaclass = PyDict_GetItemString(g, "__metaclass__");
3597 if (metaclass == NULL)
3598 metaclass = (PyObject *) &PyClass_Type;
3599 Py_INCREF(metaclass);
3600 }
3601 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3602 Py_DECREF(metaclass);
3603 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003604}
3605
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003606static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003607exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3608 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003609{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003610 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003611 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003612 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003613
Guido van Rossumb209a111997-04-29 18:18:01 +00003614 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3615 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003616 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003617 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003618 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003619 locals = PyTuple_GetItem(prog, 2);
3620 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003621 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003622 if (globals == Py_None) {
3623 globals = PyEval_GetGlobals();
3624 if (locals == Py_None) {
3625 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003626 plain = 1;
3627 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003628 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003629 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003630 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003631 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003632 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003633 !PyCode_Check(prog) &&
3634 !PyFile_Check(prog)) {
3635 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003636 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003637 return -1;
3638 }
Fred Drake661ea262000-10-24 19:57:45 +00003639 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003640 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003641 "exec: arg 2 must be a dictionary or None");
3642 return -1;
3643 }
3644 if (!PyDict_Check(locals)) {
3645 PyErr_SetString(PyExc_TypeError,
3646 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003647 return -1;
3648 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003649 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003650 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003651 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003652 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3653 PyErr_SetString(PyExc_TypeError,
3654 "code object passed to exec may not contain free variables");
3655 return -1;
3656 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003657 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003658 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003659 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003660 FILE *fp = PyFile_AsFile(prog);
3661 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003662 PyCompilerFlags cf;
3663 cf.cf_flags = 0;
3664 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003665 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3666 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003667 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003668 v = PyRun_File(fp, name, Py_file_input, globals,
3669 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003670 }
3671 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003672 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003673 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003674 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003675 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003676 cf.cf_flags = 0;
3677 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003678 v = PyRun_StringFlags(str, Py_file_input, globals,
3679 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003680 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003681 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003682 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003683 if (plain)
3684 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003685 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003686 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003687 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003688 return 0;
3689}
Guido van Rossum24c13741995-02-14 09:42:43 +00003690
Guido van Rossumac7be682001-01-17 15:42:30 +00003691static void
Paul Prescode68140d2000-08-30 20:25:01 +00003692format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3693{
3694 char *obj_str;
3695
3696 if (!obj)
3697 return;
3698
3699 obj_str = PyString_AsString(obj);
3700 if (!obj_str)
3701 return;
3702
3703 PyErr_Format(exc, format_str, obj_str);
3704}
Guido van Rossum950361c1997-01-24 13:49:28 +00003705
3706#ifdef DYNAMIC_EXECUTION_PROFILE
3707
Skip Montanarof118cb12001-10-15 20:51:38 +00003708static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003709getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003710{
3711 int i;
3712 PyObject *l = PyList_New(256);
3713 if (l == NULL) return NULL;
3714 for (i = 0; i < 256; i++) {
3715 PyObject *x = PyInt_FromLong(a[i]);
3716 if (x == NULL) {
3717 Py_DECREF(l);
3718 return NULL;
3719 }
3720 PyList_SetItem(l, i, x);
3721 }
3722 for (i = 0; i < 256; i++)
3723 a[i] = 0;
3724 return l;
3725}
3726
3727PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003728_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003729{
3730#ifndef DXPAIRS
3731 return getarray(dxp);
3732#else
3733 int i;
3734 PyObject *l = PyList_New(257);
3735 if (l == NULL) return NULL;
3736 for (i = 0; i < 257; i++) {
3737 PyObject *x = getarray(dxpairs[i]);
3738 if (x == NULL) {
3739 Py_DECREF(l);
3740 return NULL;
3741 }
3742 PyList_SetItem(l, i, x);
3743 }
3744 return l;
3745#endif
3746}
3747
3748#endif