blob: 2feb123a9c6ff242b6d2891e1bd3b473684d01ab [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static PyObject *loop_subscript(PyObject *, PyObject *);
55static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
56static int assign_slice(PyObject *, PyObject *,
57 PyObject *, PyObject *);
58static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000059static PyObject *import_from(PyObject *, PyObject *);
60static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static PyObject *build_class(PyObject *, PyObject *, PyObject *);
62static int exec_statement(PyFrameObject *,
63 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
65static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000066static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Paul Prescode68140d2000-08-30 20:25:01 +000068#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000069 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000070#define GLOBAL_NAME_ERROR_MSG \
71 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000072#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000073 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000074#define UNBOUNDFREE_ERROR_MSG \
75 "free variable '%.200s' referenced before assignment" \
76 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Guido van Rossum950361c1997-01-24 13:49:28 +000078/* Dynamic execution profile */
79#ifdef DYNAMIC_EXECUTION_PROFILE
80#ifdef DXPAIRS
81static long dxpairs[257][256];
82#define dxp dxpairs[256]
83#else
84static long dxp[256];
85#endif
86#endif
87
Tim Peters5ca576e2001-06-18 22:08:13 +000088staticforward PyTypeObject gentype;
89
90typedef struct {
91 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000092 /* The gi_ prefix is intended to remind of generator-iterator. */
93
94 PyFrameObject *gi_frame;
95
Tim Peterse77f2e22001-06-26 22:24:51 +000096 /* True if generator is being executed. */
97 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000098} genobject;
99
100static PyObject *
101gen_new(PyFrameObject *f)
102{
103 genobject *gen = PyObject_New(genobject, &gentype);
104 if (gen == NULL) {
105 Py_DECREF(f);
106 return NULL;
107 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000108 gen->gi_frame = f;
109 gen->gi_running = 0;
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000110 PyObject_GC_Init(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000111 return (PyObject *)gen;
112}
113
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000114static int
115gen_traverse(genobject *gen, visitproc visit, void *arg)
116{
117 return visit((PyObject *)gen->gi_frame, arg);
118}
119
Tim Peters5ca576e2001-06-18 22:08:13 +0000120static void
121gen_dealloc(genobject *gen)
122{
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000123 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000124 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000125 PyObject_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000126}
127
128static PyObject *
129gen_iternext(genobject *gen)
130{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000131 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000133 PyObject *result;
134
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000135 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000136 PyErr_SetString(PyExc_ValueError,
137 "generator already executing");
138 return NULL;
139 }
Tim Peters8c963692001-06-23 05:26:56 +0000140 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000142
143 /* Generators always return to their most recent caller, not
144 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000145 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000146 assert(f->f_back == NULL);
147 f->f_back = tstate->frame;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000151 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000152
153 /* Don't keep the reference to f_back any longer than necessary. It
154 * may keep a chain of frames alive or it could create a reference
155 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000156 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000157 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000158
Tim Petersad1a18b2001-06-23 06:19:16 +0000159 /* If the generator just returned (as opposed to yielding), signal
160 * that the generator is exhausted. */
161 if (result == Py_None && f->f_stacktop == NULL) {
162 Py_DECREF(result);
163 result = NULL;
164 }
165
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000167}
168
169static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000170gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000171{
172 PyObject *result;
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000175
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000176 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000177 PyErr_SetObject(PyExc_StopIteration, Py_None);
178 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000179 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000180
181 return result;
182}
183
184static PyObject *
185gen_getiter(PyObject *gen)
186{
187 Py_INCREF(gen);
188 return gen;
189}
190
191static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000192 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000193 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 {NULL, NULL} /* Sentinel */
195};
196
Guido van Rossum6f799372001-09-20 20:46:19 +0000197static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000198 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
199 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
200 {NULL} /* Sentinel */
201};
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
203statichere PyTypeObject gentype = {
204 PyObject_HEAD_INIT(&PyType_Type)
205 0, /* ob_size */
206 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000207 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000208 0, /* tp_itemsize */
209 /* methods */
210 (destructor)gen_dealloc, /* tp_dealloc */
211 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_setattr */
214 0, /* tp_compare */
215 0, /* tp_repr */
216 0, /* tp_as_number */
217 0, /* tp_as_sequence */
218 0, /* tp_as_mapping */
219 0, /* tp_hash */
220 0, /* tp_call */
221 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000223 0, /* tp_setattro */
224 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000226 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000227 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000228 0, /* tp_clear */
229 0, /* tp_richcompare */
230 0, /* tp_weaklistoffset */
231 (getiterfunc)gen_getiter, /* tp_iter */
232 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000233 gen_methods, /* tp_methods */
234 gen_memberlist, /* tp_members */
235 0, /* tp_getset */
236 0, /* tp_base */
237 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000238};
239
240
Guido van Rossume59214e1994-08-30 08:01:59 +0000241#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000242
Guido van Rossum2571cc81999-04-07 16:07:23 +0000243#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000245#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000246#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248extern int _PyThread_Started; /* Flag for Py_Exit */
249
Guido van Rossum65d5b571998-12-21 19:32:43 +0000250static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252
253void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000257 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000259 interpreter_lock = PyThread_allocate_lock();
260 PyThread_acquire_lock(interpreter_lock, 1);
261 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000262}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000263
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000264void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268}
269
270void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274}
275
276void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000278{
279 if (tstate == NULL)
280 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282 if (PyThreadState_Swap(tstate) != NULL)
283 Py_FatalError(
284 "PyEval_AcquireThread: non-NULL old thread state");
285}
286
287void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000288PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289{
290 if (tstate == NULL)
291 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
292 if (PyThreadState_Swap(NULL) != tstate)
293 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000294 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000295}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000296
297/* This function is called from PyOS_AfterFork to ensure that newly
298 created child processes don't hold locks referring to threads which
299 are not running in the child process. (This could also be done using
300 pthread_atfork mechanism, at least for the pthreads implementation.) */
301
302void
303PyEval_ReInitThreads(void)
304{
305 if (!interpreter_lock)
306 return;
307 /*XXX Can't use PyThread_free_lock here because it does too
308 much error-checking. Doing this cleanly would require
309 adding a new function to each thread_*.h. Instead, just
310 create a new lock and waste a little bit of memory */
311 interpreter_lock = PyThread_allocate_lock();
312 PyThread_acquire_lock(interpreter_lock, 1);
313 main_thread = PyThread_get_thread_ident();
314}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315#endif
316
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317/* Functions save_thread and restore_thread are always defined so
318 dynamically loaded modules needn't be compiled separately for use
319 with and without threads: */
320
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000321PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 PyThreadState *tstate = PyThreadState_Swap(NULL);
325 if (tstate == NULL)
326 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000327#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000331 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332}
333
334void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000335PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000337 if (tstate == NULL)
338 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000339#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000341 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000342 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 }
345#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000346 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347}
348
349
Guido van Rossuma9672091994-09-14 13:31:22 +0000350/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
351 signal handlers or Mac I/O completion routines) can schedule calls
352 to a function to be called synchronously.
353 The synchronous function is called with one void* argument.
354 It should return 0 for success or -1 for failure -- failure should
355 be accompanied by an exception.
356
357 If registry succeeds, the registry function returns 0; if it fails
358 (e.g. due to too many pending calls) it returns -1 (without setting
359 an exception condition).
360
361 Note that because registry may occur from within signal handlers,
362 or other asynchronous events, calling malloc() is unsafe!
363
364#ifdef WITH_THREAD
365 Any thread can schedule pending calls, but only the main thread
366 will execute them.
367#endif
368
369 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
370 There are two possible race conditions:
371 (1) nested asynchronous registry calls;
372 (2) registry calls made while pending calls are being processed.
373 While (1) is very unlikely, (2) is a real possibility.
374 The current code is safe against (2), but not against (1).
375 The safety against (2) is derived from the fact that only one
376 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378 XXX Darn! With the advent of thread state, we should have an array
379 of pending calls per thread in the thread state! Later...
380*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000381
Guido van Rossuma9672091994-09-14 13:31:22 +0000382#define NPENDINGCALLS 32
383static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000384 int (*func)(void *);
385 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000386} pendingcalls[NPENDINGCALLS];
387static volatile int pendingfirst = 0;
388static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390
391int
Thomas Wouters334fb892000-07-25 12:56:38 +0000392Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000393{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000394 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 int i, j;
396 /* XXX Begin critical section */
397 /* XXX If you want this to be safe against nested
398 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000399 if (busy)
400 return -1;
401 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendinglast;
403 j = (i + 1) % NPENDINGCALLS;
404 if (j == pendingfirst)
405 return -1; /* Queue full */
406 pendingcalls[i].func = func;
407 pendingcalls[i].arg = arg;
408 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000409 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000410 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 /* XXX End critical section */
412 return 0;
413}
414
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000417{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000418 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000420 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000421 return 0;
422#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000423 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 return 0;
425 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 for (;;) {
428 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000429 int (*func)(void *);
430 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 i = pendingfirst;
432 if (i == pendinglast)
433 break; /* Queue empty */
434 func = pendingcalls[i].func;
435 arg = pendingcalls[i].arg;
436 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000437 if (func(arg) < 0) {
438 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000439 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000440 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000441 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 return 0;
445}
446
447
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000448/* The interpreter's recursion limit */
449
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000450static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000452int
453Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000454{
455 return recursion_limit;
456}
457
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000458void
459Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000460{
461 recursion_limit = new_limit;
462}
463
Guido van Rossum374a9221991-04-04 10:40:29 +0000464/* Status code for main loop (reason for stack unwind) */
465
466enum why_code {
467 WHY_NOT, /* No error */
468 WHY_EXCEPTION, /* Exception occurred */
469 WHY_RERAISE, /* Exception re-raised by 'finally' */
470 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000471 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000472 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000473 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000474};
475
Tim Petersdbd9ba62000-07-09 03:09:57 +0000476static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000477static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000478
Guido van Rossum374a9221991-04-04 10:40:29 +0000479
Guido van Rossumb209a111997-04-29 18:18:01 +0000480PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000481PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 (PyObject **)NULL, 0,
486 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000487 (PyObject **)NULL, 0,
488 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489}
490
491
492/* Interpreter main loop */
493
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000495eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000496{
Guido van Rossum950361c1997-01-24 13:49:28 +0000497#ifdef DXPAIRS
498 int lastopcode = 0;
499#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000500 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000501 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000502 register int opcode=0; /* Current opcode */
503 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000504 register enum why_code why; /* Reason for block stack unwind */
505 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000506 register PyObject *x; /* Result object -- NULL if error */
507 register PyObject *v; /* Temporary objects popped off stack */
508 register PyObject *w;
509 register PyObject *u;
510 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000511 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000512 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000513 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000514 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000515 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000518 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000520#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000522 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000523#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000524
525/* Code access macros */
526
527#define GETCONST(i) Getconst(f, i)
528#define GETNAME(i) Getname(f, i)
529#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000530#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000531#define NEXTOP() (*next_instr++)
532#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000533#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#define JUMPBY(x) (next_instr += (x))
535
536/* Stack manipulation macros */
537
538#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
539#define EMPTY() (STACK_LEVEL() == 0)
540#define TOP() (stack_pointer[-1])
541#define BASIC_PUSH(v) (*stack_pointer++ = (v))
542#define BASIC_POP() (*--stack_pointer)
543
Guido van Rossum96a42c81992-01-12 02:29:51 +0000544#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000545#define PUSH(v) { (void)(BASIC_PUSH(v), \
546 lltrace && prtrace(TOP(), "push")); \
547 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000548#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000549#else
550#define PUSH(v) BASIC_PUSH(v)
551#define POP() BASIC_POP()
552#endif
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000557#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 GETLOCAL(i) = value; } while (0)
559
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560/* Start of code */
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 if (f == NULL)
563 return NULL;
564
Guido van Rossum8861b741996-07-30 16:49:37 +0000565#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000567 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570#endif
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000573 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000576 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000577 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 co = f->f_code;
583 fastlocals = f->f_localsplus;
584 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000585 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000587 stack_pointer = f->f_stacktop;
588 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000589 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000590
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000591 if (tstate->use_tracing) {
592 if (tstate->c_tracefunc != NULL) {
593 /* tstate->c_tracefunc, if defined, is a
594 function that will be called on *every* entry
595 to a code block. Its return value, if not
596 None, is a function that will be called at
597 the start of each executed line of code.
598 (Actually, the function must return itself
599 in order to continue tracing.) The trace
600 functions are called with three arguments:
601 a pointer to the current frame, a string
602 indicating why the function is called, and
603 an argument which depends on the situation.
604 The global trace function is also called
605 whenever an exception is detected. */
606 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
607 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000608 /* Trace function raised an error */
609 return NULL;
610 }
611 }
612 if (tstate->c_profilefunc != NULL) {
613 /* Similar for c_profilefunc, except it needn't
614 return itself and isn't called for "line" events */
615 if (call_trace(tstate->c_profilefunc,
616 tstate->c_profileobj,
617 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000618 /* Profile function raised an error */
619 return NULL;
620 }
621 }
622 }
623
Tim Peters5ca576e2001-06-18 22:08:13 +0000624#ifdef LLTRACE
625 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
626#endif
627#if defined(Py_DEBUG) || defined(LLTRACE)
628 filename = PyString_AsString(co->co_filename);
629#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000630
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 why = WHY_NOT;
632 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000633 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000634 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000637 assert(stack_pointer >= f->f_valuestack); /* else underflow */
638 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000639 /* Do periodic things. Doing this every time through
640 the loop would add too much overhead, so we do it
641 only every Nth instruction. We also do it if
642 ``things_to_do'' is set, i.e. when an asynchronous
643 event needs attention (e.g. a signal handler or
644 async I/O handler); see Py_AddPendingCall() and
645 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000646
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000648 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000649 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000650 if (Py_MakePendingCalls() < 0) {
651 why = WHY_EXCEPTION;
652 goto on_error;
653 }
654 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000655#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000656 /* If we have true signals, the signal handler
657 will call Py_AddPendingCall() so we don't
658 have to call sigcheck(). On the Mac and
659 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000660 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 goto on_error;
663 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000664#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665
Guido van Rossume59214e1994-08-30 08:01:59 +0000666#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 if (interpreter_lock) {
668 /* Give another thread a chance */
669
Guido van Rossum25ce5661997-08-02 03:10:38 +0000670 if (PyThreadState_Swap(NULL) != tstate)
671 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000672 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673
674 /* Other threads may run now */
675
Guido van Rossum65d5b571998-12-21 19:32:43 +0000676 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000677 if (PyThreadState_Swap(tstate) != NULL)
678 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 }
680#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000684
Guido van Rossum408027e1996-12-30 16:17:54 +0000685#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000686 f->f_lasti = INSTR_OFFSET();
687#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000688
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 opcode = NEXTOP();
690 if (HAS_ARG(opcode))
691 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000692 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000693#ifdef DYNAMIC_EXECUTION_PROFILE
694#ifdef DXPAIRS
695 dxpairs[lastopcode][opcode]++;
696 lastopcode = opcode;
697#endif
698 dxp[opcode]++;
699#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000700
Guido van Rossum96a42c81992-01-12 02:29:51 +0000701#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000703
Guido van Rossum96a42c81992-01-12 02:29:51 +0000704 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 if (HAS_ARG(opcode)) {
706 printf("%d: %d, %d\n",
707 (int) (INSTR_OFFSET() - 3),
708 opcode, oparg);
709 }
710 else {
711 printf("%d: %d\n",
712 (int) (INSTR_OFFSET() - 1), opcode);
713 }
714 }
715#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000717
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000719
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 /* BEWARE!
721 It is essential that any operation that fails sets either
722 x to NULL, err to nonzero, or why to anything but WHY_NOT,
723 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000724
Guido van Rossum374a9221991-04-04 10:40:29 +0000725 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000726
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 case POP_TOP:
728 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000729 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000730 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000731
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 case ROT_TWO:
733 v = POP();
734 w = POP();
735 PUSH(v);
736 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000737 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000738
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 case ROT_THREE:
740 v = POP();
741 w = POP();
742 x = POP();
743 PUSH(v);
744 PUSH(x);
745 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000747
Thomas Wouters434d0822000-08-24 20:11:32 +0000748 case ROT_FOUR:
749 u = POP();
750 v = POP();
751 w = POP();
752 x = POP();
753 PUSH(u);
754 PUSH(x);
755 PUSH(w);
756 PUSH(v);
757 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000758
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 case DUP_TOP:
760 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000761 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000764
Thomas Wouters434d0822000-08-24 20:11:32 +0000765 case DUP_TOPX:
766 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000767 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000768 x = TOP();
769 Py_INCREF(x);
770 PUSH(x);
771 continue;
772 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000773 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000774 Py_INCREF(x);
775 w = TOP();
776 Py_INCREF(w);
777 PUSH(x);
778 PUSH(w);
779 PUSH(x);
780 continue;
781 case 3:
782 x = POP();
783 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000784 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000785 Py_INCREF(w);
786 v = TOP();
787 Py_INCREF(v);
788 PUSH(w);
789 PUSH(x);
790 PUSH(v);
791 PUSH(w);
792 PUSH(x);
793 continue;
794 case 4:
795 x = POP();
796 Py_INCREF(x);
797 w = POP();
798 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000800 Py_INCREF(v);
801 u = TOP();
802 Py_INCREF(u);
803 PUSH(v);
804 PUSH(w);
805 PUSH(x);
806 PUSH(u);
807 PUSH(v);
808 PUSH(w);
809 PUSH(x);
810 continue;
811 case 5:
812 x = POP();
813 Py_INCREF(x);
814 w = POP();
815 Py_INCREF(w);
816 v = POP();
817 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000818 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000819 Py_INCREF(u);
820 t = TOP();
821 Py_INCREF(t);
822 PUSH(u);
823 PUSH(v);
824 PUSH(w);
825 PUSH(x);
826 PUSH(t);
827 PUSH(u);
828 PUSH(v);
829 PUSH(w);
830 PUSH(x);
831 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000832 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000833 Py_FatalError("invalid argument to DUP_TOPX"
834 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000835 }
Tim Peters35ba6892000-10-11 07:04:49 +0000836 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000837
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 case UNARY_POSITIVE:
839 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000840 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000841 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000843 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000845
Guido van Rossum374a9221991-04-04 10:40:29 +0000846 case UNARY_NEGATIVE:
847 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000848 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000849 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000851 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000853
Guido van Rossum374a9221991-04-04 10:40:29 +0000854 case UNARY_NOT:
855 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000857 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000858 if (err == 0) {
859 Py_INCREF(Py_True);
860 PUSH(Py_True);
861 continue;
862 }
863 else if (err > 0) {
864 Py_INCREF(Py_False);
865 PUSH(Py_False);
866 err = 0;
867 continue;
868 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000870
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 case UNARY_CONVERT:
872 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000873 x = PyObject_Repr(v);
874 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000876 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000878
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 case UNARY_INVERT:
880 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000881 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000882 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000884 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000885 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000886
Guido van Rossum50564e81996-01-12 01:13:16 +0000887 case BINARY_POWER:
888 w = POP();
889 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000890 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
892 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000895 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000896
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 case BINARY_MULTIPLY:
898 w = POP();
899 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
902 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000904 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000906
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000908 if (!_Py_QnewFlag) {
909 w = POP();
910 v = POP();
911 x = PyNumber_Divide(v, w);
912 Py_DECREF(v);
913 Py_DECREF(w);
914 PUSH(x);
915 if (x != NULL) continue;
916 break;
917 }
918 /* -Qnew is in effect: fall through to
919 BINARY_TRUE_DIVIDE */
920 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 w = POP();
922 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000923 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 Py_DECREF(v);
925 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000927 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000929
Guido van Rossum4668b002001-08-08 05:00:18 +0000930 case BINARY_FLOOR_DIVIDE:
931 w = POP();
932 v = POP();
933 x = PyNumber_FloorDivide(v, w);
934 Py_DECREF(v);
935 Py_DECREF(w);
936 PUSH(x);
937 if (x != NULL) continue;
938 break;
939
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 case BINARY_MODULO:
941 w = POP();
942 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000943 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000944 Py_DECREF(v);
945 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000947 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000949
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 case BINARY_ADD:
951 w = POP();
952 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000953 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000954 /* INLINE: int + int */
955 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000956 a = PyInt_AS_LONG(v);
957 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000958 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000959 if ((i^a) < 0 && (i^b) < 0)
960 goto slow_add;
961 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000962 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000963 else {
964 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000965 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000966 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000967 Py_DECREF(v);
968 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000970 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000972
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 case BINARY_SUBTRACT:
974 w = POP();
975 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000976 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000977 /* INLINE: int - int */
978 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000979 a = PyInt_AS_LONG(v);
980 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000981 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000982 if ((i^a) < 0 && (i^~b) < 0)
983 goto slow_sub;
984 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000985 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000986 else {
987 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000988 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000989 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000990 Py_DECREF(v);
991 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000993 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000995
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 case BINARY_SUBSCR:
997 w = POP();
998 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +0000999 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001000 /* INLINE: list[int] */
1001 long i = PyInt_AsLong(w);
1002 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001003 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001004 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001005 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 PyErr_SetString(PyExc_IndexError,
1007 "list index out of range");
1008 x = NULL;
1009 }
1010 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001011 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001012 Py_INCREF(x);
1013 }
1014 }
1015 else
1016 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001017 Py_DECREF(v);
1018 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001020 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001022
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 case BINARY_LSHIFT:
1024 w = POP();
1025 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001026 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001027 Py_DECREF(v);
1028 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001030 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001032
Guido van Rossum7928cd71991-10-24 14:59:31 +00001033 case BINARY_RSHIFT:
1034 w = POP();
1035 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001036 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 Py_DECREF(v);
1038 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001040 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001041 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001042
Guido van Rossum7928cd71991-10-24 14:59:31 +00001043 case BINARY_AND:
1044 w = POP();
1045 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001046 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001047 Py_DECREF(v);
1048 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001050 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001051 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001052
Guido van Rossum7928cd71991-10-24 14:59:31 +00001053 case BINARY_XOR:
1054 w = POP();
1055 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001056 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001057 Py_DECREF(v);
1058 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001059 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001060 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001061 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001062
Guido van Rossum7928cd71991-10-24 14:59:31 +00001063 case BINARY_OR:
1064 w = POP();
1065 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001066 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001067 Py_DECREF(v);
1068 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001069 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001070 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001071 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001072
1073 case INPLACE_POWER:
1074 w = POP();
1075 v = POP();
1076 x = PyNumber_InPlacePower(v, w, Py_None);
1077 Py_DECREF(v);
1078 Py_DECREF(w);
1079 PUSH(x);
1080 if (x != NULL) continue;
1081 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001082
Thomas Wouters434d0822000-08-24 20:11:32 +00001083 case INPLACE_MULTIPLY:
1084 w = POP();
1085 v = POP();
1086 x = PyNumber_InPlaceMultiply(v, w);
1087 Py_DECREF(v);
1088 Py_DECREF(w);
1089 PUSH(x);
1090 if (x != NULL) continue;
1091 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001092
Thomas Wouters434d0822000-08-24 20:11:32 +00001093 case INPLACE_DIVIDE:
1094 w = POP();
1095 v = POP();
1096 x = PyNumber_InPlaceDivide(v, w);
1097 Py_DECREF(v);
1098 Py_DECREF(w);
1099 PUSH(x);
1100 if (x != NULL) continue;
1101 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001102
Guido van Rossum4668b002001-08-08 05:00:18 +00001103 case INPLACE_FLOOR_DIVIDE:
1104 w = POP();
1105 v = POP();
1106 x = PyNumber_InPlaceFloorDivide(v, w);
1107 Py_DECREF(v);
1108 Py_DECREF(w);
1109 PUSH(x);
1110 if (x != NULL) continue;
1111 break;
1112
1113 case INPLACE_TRUE_DIVIDE:
1114 w = POP();
1115 v = POP();
1116 x = PyNumber_InPlaceTrueDivide(v, w);
1117 Py_DECREF(v);
1118 Py_DECREF(w);
1119 PUSH(x);
1120 if (x != NULL) continue;
1121 break;
1122
Thomas Wouters434d0822000-08-24 20:11:32 +00001123 case INPLACE_MODULO:
1124 w = POP();
1125 v = POP();
1126 x = PyNumber_InPlaceRemainder(v, w);
1127 Py_DECREF(v);
1128 Py_DECREF(w);
1129 PUSH(x);
1130 if (x != NULL) continue;
1131 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001132
Thomas Wouters434d0822000-08-24 20:11:32 +00001133 case INPLACE_ADD:
1134 w = POP();
1135 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001136 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001137 /* INLINE: int + int */
1138 register long a, b, i;
1139 a = PyInt_AS_LONG(v);
1140 b = PyInt_AS_LONG(w);
1141 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001142 if ((i^a) < 0 && (i^b) < 0)
1143 goto slow_iadd;
1144 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001145 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001146 else {
1147 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001149 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001150 Py_DECREF(v);
1151 Py_DECREF(w);
1152 PUSH(x);
1153 if (x != NULL) continue;
1154 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001155
Thomas Wouters434d0822000-08-24 20:11:32 +00001156 case INPLACE_SUBTRACT:
1157 w = POP();
1158 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001159 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001160 /* INLINE: int - int */
1161 register long a, b, i;
1162 a = PyInt_AS_LONG(v);
1163 b = PyInt_AS_LONG(w);
1164 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001165 if ((i^a) < 0 && (i^~b) < 0)
1166 goto slow_isub;
1167 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001169 else {
1170 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001171 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001172 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 Py_DECREF(v);
1174 Py_DECREF(w);
1175 PUSH(x);
1176 if (x != NULL) continue;
1177 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001178
Thomas Wouters434d0822000-08-24 20:11:32 +00001179 case INPLACE_LSHIFT:
1180 w = POP();
1181 v = POP();
1182 x = PyNumber_InPlaceLshift(v, w);
1183 Py_DECREF(v);
1184 Py_DECREF(w);
1185 PUSH(x);
1186 if (x != NULL) continue;
1187 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001188
Thomas Wouters434d0822000-08-24 20:11:32 +00001189 case INPLACE_RSHIFT:
1190 w = POP();
1191 v = POP();
1192 x = PyNumber_InPlaceRshift(v, w);
1193 Py_DECREF(v);
1194 Py_DECREF(w);
1195 PUSH(x);
1196 if (x != NULL) continue;
1197 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001198
Thomas Wouters434d0822000-08-24 20:11:32 +00001199 case INPLACE_AND:
1200 w = POP();
1201 v = POP();
1202 x = PyNumber_InPlaceAnd(v, w);
1203 Py_DECREF(v);
1204 Py_DECREF(w);
1205 PUSH(x);
1206 if (x != NULL) continue;
1207 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001208
Thomas Wouters434d0822000-08-24 20:11:32 +00001209 case INPLACE_XOR:
1210 w = POP();
1211 v = POP();
1212 x = PyNumber_InPlaceXor(v, w);
1213 Py_DECREF(v);
1214 Py_DECREF(w);
1215 PUSH(x);
1216 if (x != NULL) continue;
1217 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001218
Thomas Wouters434d0822000-08-24 20:11:32 +00001219 case INPLACE_OR:
1220 w = POP();
1221 v = POP();
1222 x = PyNumber_InPlaceOr(v, w);
1223 Py_DECREF(v);
1224 Py_DECREF(w);
1225 PUSH(x);
1226 if (x != NULL) continue;
1227 break;
1228
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 case SLICE+0:
1230 case SLICE+1:
1231 case SLICE+2:
1232 case SLICE+3:
1233 if ((opcode-SLICE) & 2)
1234 w = POP();
1235 else
1236 w = NULL;
1237 if ((opcode-SLICE) & 1)
1238 v = POP();
1239 else
1240 v = NULL;
1241 u = POP();
1242 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001243 Py_DECREF(u);
1244 Py_XDECREF(v);
1245 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001247 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001249
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 case STORE_SLICE+0:
1251 case STORE_SLICE+1:
1252 case STORE_SLICE+2:
1253 case STORE_SLICE+3:
1254 if ((opcode-STORE_SLICE) & 2)
1255 w = POP();
1256 else
1257 w = NULL;
1258 if ((opcode-STORE_SLICE) & 1)
1259 v = POP();
1260 else
1261 v = NULL;
1262 u = POP();
1263 t = POP();
1264 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001265 Py_DECREF(t);
1266 Py_DECREF(u);
1267 Py_XDECREF(v);
1268 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001269 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001271
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 case DELETE_SLICE+0:
1273 case DELETE_SLICE+1:
1274 case DELETE_SLICE+2:
1275 case DELETE_SLICE+3:
1276 if ((opcode-DELETE_SLICE) & 2)
1277 w = POP();
1278 else
1279 w = NULL;
1280 if ((opcode-DELETE_SLICE) & 1)
1281 v = POP();
1282 else
1283 v = NULL;
1284 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 Py_DECREF(u);
1288 Py_XDECREF(v);
1289 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001290 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001292
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 case STORE_SUBSCR:
1294 w = POP();
1295 v = POP();
1296 u = POP();
1297 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001298 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 Py_DECREF(u);
1300 Py_DECREF(v);
1301 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001302 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001304
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 case DELETE_SUBSCR:
1306 w = POP();
1307 v = POP();
1308 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001309 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 Py_DECREF(v);
1311 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001312 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001314
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 case PRINT_EXPR:
1316 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001317 w = PySys_GetObject("displayhook");
1318 if (w == NULL) {
1319 PyErr_SetString(PyExc_RuntimeError,
1320 "lost sys.displayhook");
1321 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001322 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001323 }
1324 if (err == 0) {
1325 x = Py_BuildValue("(O)", v);
1326 if (x == NULL)
1327 err = -1;
1328 }
1329 if (err == 0) {
1330 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001331 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001332 if (w == NULL)
1333 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001335 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001336 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001338
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001339 case PRINT_ITEM_TO:
1340 w = stream = POP();
1341 /* fall through to PRINT_ITEM */
1342
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 case PRINT_ITEM:
1344 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001345 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001346 w = PySys_GetObject("stdout");
1347 if (w == NULL) {
1348 PyErr_SetString(PyExc_RuntimeError,
1349 "lost sys.stdout");
1350 err = -1;
1351 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001352 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001353 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001354 err = PyFile_WriteString(" ", w);
1355 if (err == 0)
1356 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001357 if (err == 0) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001358 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001359 if (PyString_Check(v)) {
1360 char *s = PyString_AS_STRING(v);
1361 int len = PyString_GET_SIZE(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001362 if (len > 0 &&
1363 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001364 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001365 PyFile_SoftSpace(w, 0);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001366 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001367#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001368 else if (PyUnicode_Check(v)) {
1369 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1370 int len = PyUnicode_GET_SIZE(v);
1371 if (len > 0 &&
1372 Py_UNICODE_ISSPACE(s[len-1]) &&
1373 s[len-1] != ' ')
1374 PyFile_SoftSpace(w, 0);
1375 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001376#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001378 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001379 Py_XDECREF(stream);
1380 stream = NULL;
1381 if (err == 0)
1382 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001384
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001385 case PRINT_NEWLINE_TO:
1386 w = stream = POP();
1387 /* fall through to PRINT_NEWLINE */
1388
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001390 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001391 w = PySys_GetObject("stdout");
1392 if (w == NULL)
1393 PyErr_SetString(PyExc_RuntimeError,
1394 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001395 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001396 if (w != NULL) {
1397 err = PyFile_WriteString("\n", w);
1398 if (err == 0)
1399 PyFile_SoftSpace(w, 0);
1400 }
1401 Py_XDECREF(stream);
1402 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001404
Thomas Wouters434d0822000-08-24 20:11:32 +00001405
1406#ifdef CASE_TOO_BIG
1407 default: switch (opcode) {
1408#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001409 case BREAK_LOOP:
1410 why = WHY_BREAK;
1411 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001412
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001413 case CONTINUE_LOOP:
1414 retval = PyInt_FromLong(oparg);
1415 why = WHY_CONTINUE;
1416 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001417
Guido van Rossumf10570b1995-07-07 22:53:21 +00001418 case RAISE_VARARGS:
1419 u = v = w = NULL;
1420 switch (oparg) {
1421 case 3:
1422 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001423 /* Fallthrough */
1424 case 2:
1425 v = POP(); /* value */
1426 /* Fallthrough */
1427 case 1:
1428 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001429 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001430 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001431 break;
1432 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001434 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001435 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001436 break;
1437 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001439
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001441 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001442 PyErr_SetString(PyExc_SystemError,
1443 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001444 break;
1445 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001446 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001447 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001449
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 case RETURN_VALUE:
1451 retval = POP();
1452 why = WHY_RETURN;
1453 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001454
Tim Peters5ca576e2001-06-18 22:08:13 +00001455 case YIELD_VALUE:
1456 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001457 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001458 f->f_lasti = INSTR_OFFSET();
1459 why = WHY_YIELD;
1460 break;
1461
1462
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001463 case EXEC_STMT:
1464 w = POP();
1465 v = POP();
1466 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001467 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 Py_DECREF(u);
1469 Py_DECREF(v);
1470 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001471 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001472
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 case POP_BLOCK:
1474 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001475 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 while (STACK_LEVEL() > b->b_level) {
1477 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001478 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 }
1480 }
1481 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001482
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 case END_FINALLY:
1484 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 if (PyInt_Check(v)) {
1486 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001487 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001488 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001489 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 retval = POP();
1491 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001494 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001497 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 else if (v != Py_None) {
1500 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 "'finally' pops bad exception");
1502 why = WHY_EXCEPTION;
1503 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001504 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001506
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001508 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001510 w = POP();
1511 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 Py_DECREF(u);
1514 Py_DECREF(v);
1515 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001517
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 case STORE_NAME:
1519 w = GETNAMEV(oparg);
1520 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001521 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001522 PyErr_Format(PyExc_SystemError,
1523 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001524 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001525 break;
1526 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 err = PyDict_SetItem(x, w, v);
1528 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001530
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001532 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001533 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001534 PyErr_Format(PyExc_SystemError,
1535 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001536 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001537 break;
1538 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001540 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001541 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001543
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001544 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001546 if (PyTuple_Check(v)) {
1547 if (PyTuple_Size(v) != oparg) {
1548 PyErr_SetString(PyExc_ValueError,
1549 "unpack tuple of wrong size");
1550 why = WHY_EXCEPTION;
1551 }
1552 else {
1553 for (; --oparg >= 0; ) {
1554 w = PyTuple_GET_ITEM(v, oparg);
1555 Py_INCREF(w);
1556 PUSH(w);
1557 }
1558 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001560 else if (PyList_Check(v)) {
1561 if (PyList_Size(v) != oparg) {
1562 PyErr_SetString(PyExc_ValueError,
1563 "unpack list of wrong size");
1564 why = WHY_EXCEPTION;
1565 }
1566 else {
1567 for (; --oparg >= 0; ) {
1568 w = PyList_GET_ITEM(v, oparg);
1569 Py_INCREF(w);
1570 PUSH(w);
1571 }
1572 }
1573 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001574 else if (unpack_iterable(v, oparg,
1575 stack_pointer + oparg))
1576 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001577 else {
1578 if (PyErr_ExceptionMatches(PyExc_TypeError))
1579 PyErr_SetString(PyExc_TypeError,
1580 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001581 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001585
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001587 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 v = POP();
1589 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1591 Py_DECREF(v);
1592 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001594
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001596 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001598 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1599 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001600 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001602
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001603 case STORE_GLOBAL:
1604 w = GETNAMEV(oparg);
1605 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 err = PyDict_SetItem(f->f_globals, w, v);
1607 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001608 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001610 case DELETE_GLOBAL:
1611 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001612 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001613 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001614 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001615 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001616
Guido van Rossum374a9221991-04-04 10:40:29 +00001617 case LOAD_CONST:
1618 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001619 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 PUSH(x);
1621 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001622
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001624 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001625 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001626 PyErr_Format(PyExc_SystemError,
1627 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001628 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001629 break;
1630 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001635 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001636 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001637 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001638 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001639 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 break;
1641 }
1642 }
1643 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 PUSH(x);
1646 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001647
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001649 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001650 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001652 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001654 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001655 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001656 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 break;
1658 }
1659 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 PUSH(x);
1662 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663
Guido van Rossum9bfef441993-03-29 10:43:31 +00001664 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001665 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001666 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001667 format_exc_check_arg(
1668 PyExc_UnboundLocalError,
1669 UNBOUNDLOCAL_ERROR_MSG,
1670 PyTuple_GetItem(co->co_varnames, oparg)
1671 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001672 break;
1673 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001675 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001676 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001677 break;
1678
1679 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001680 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001681 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001682 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001683
1684 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001685 x = GETLOCAL(oparg);
1686 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001687 format_exc_check_arg(
1688 PyExc_UnboundLocalError,
1689 UNBOUNDLOCAL_ERROR_MSG,
1690 PyTuple_GetItem(co->co_varnames, oparg)
1691 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001692 break;
1693 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001694 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001695 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001696
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001697 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001698 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001699 Py_INCREF(x);
1700 PUSH(x);
1701 break;
1702
1703 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001704 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001705 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001706 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001707 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001708 v = PyTuple_GetItem(co->co_cellvars,
1709 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001710 format_exc_check_arg(
1711 PyExc_UnboundLocalError,
1712 UNBOUNDLOCAL_ERROR_MSG,
1713 v);
1714 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001715 v = PyTuple_GetItem(
1716 co->co_freevars,
1717 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001718 format_exc_check_arg(
1719 PyExc_NameError,
1720 UNBOUNDFREE_ERROR_MSG,
1721 v);
1722 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001723 err = -1;
1724 break;
1725 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001726 PUSH(w);
1727 break;
1728
1729 case STORE_DEREF:
1730 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001731 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001732 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001733 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001734 continue;
1735
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001737 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 if (x != NULL) {
1739 for (; --oparg >= 0;) {
1740 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 }
1743 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001744 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 }
1746 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001747
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 if (x != NULL) {
1751 for (; --oparg >= 0;) {
1752 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001753 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 }
1755 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001756 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 }
1758 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001759
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001761 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001763 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001765
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001767 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001769 x = PyObject_GetAttr(v, w);
1770 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001772 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001774
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 case COMPARE_OP:
1776 w = POP();
1777 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001778 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001779 /* INLINE: cmp(int, int) */
1780 register long a, b;
1781 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001782 a = PyInt_AS_LONG(v);
1783 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001784 switch (oparg) {
1785 case LT: res = a < b; break;
1786 case LE: res = a <= b; break;
1787 case EQ: res = a == b; break;
1788 case NE: res = a != b; break;
1789 case GT: res = a > b; break;
1790 case GE: res = a >= b; break;
1791 case IS: res = v == w; break;
1792 case IS_NOT: res = v != w; break;
1793 default: goto slow_compare;
1794 }
1795 x = res ? Py_True : Py_False;
1796 Py_INCREF(x);
1797 }
1798 else {
1799 slow_compare:
1800 x = cmp_outcome(oparg, v, w);
1801 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 Py_DECREF(v);
1803 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001805 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001807
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001809 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001811 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001812 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001813 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001814 break;
1815 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001816 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001817 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001818 w,
1819 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001820 f->f_locals == NULL ?
1821 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001822 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001823 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001824 if (w == NULL) {
1825 x = NULL;
1826 break;
1827 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 x = PyEval_CallObject(x, w);
1829 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001830 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001831 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001833
Thomas Wouters52152252000-08-17 22:55:00 +00001834 case IMPORT_STAR:
1835 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001837 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001838 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001839 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001840 break;
1841 }
Thomas Wouters52152252000-08-17 22:55:00 +00001842 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001844 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001845 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001847
Thomas Wouters52152252000-08-17 22:55:00 +00001848 case IMPORT_FROM:
1849 w = GETNAMEV(oparg);
1850 v = TOP();
1851 x = import_from(v, w);
1852 PUSH(x);
1853 if (x != NULL) continue;
1854 break;
1855
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 case JUMP_FORWARD:
1857 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001858 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001859
Guido van Rossum374a9221991-04-04 10:40:29 +00001860 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001862 if (err > 0)
1863 err = 0;
1864 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001866 else
1867 break;
1868 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001869
Guido van Rossum374a9221991-04-04 10:40:29 +00001870 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001871 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001872 if (err > 0) {
1873 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001874 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001875 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001876 else if (err == 0)
1877 ;
1878 else
1879 break;
1880 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001881
Guido van Rossum374a9221991-04-04 10:40:29 +00001882 case JUMP_ABSOLUTE:
1883 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001884 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001885
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001886 case GET_ITER:
1887 /* before: [obj]; after [getiter(obj)] */
1888 v = POP();
1889 x = PyObject_GetIter(v);
1890 Py_DECREF(v);
1891 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001892 PUSH(x);
1893 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001894 }
1895 break;
1896
1897 case FOR_ITER:
1898 /* before: [iter]; after: [iter, iter()] *or* [] */
1899 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001900 x = PyIter_Next(v);
1901 if (x != NULL) {
1902 PUSH(x);
1903 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001904 }
Tim Petersf4848da2001-05-05 00:14:56 +00001905 if (!PyErr_Occurred()) {
1906 /* iterator ended normally */
1907 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001908 Py_DECREF(v);
1909 JUMPBY(oparg);
1910 continue;
1911 }
1912 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001913
Guido van Rossum374a9221991-04-04 10:40:29 +00001914 case FOR_LOOP:
1915 /* for v in s: ...
1916 On entry: stack contains s, i.
1917 On exit: stack contains s, i+1, s[i];
1918 but if loop exhausted:
1919 s, i are popped, and we jump */
1920 w = POP(); /* Loop index */
1921 v = POP(); /* Sequence object */
1922 u = loop_subscript(v, w);
1923 if (u != NULL) {
1924 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001925 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001926 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001927 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001928 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001929 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001930 }
1931 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001932 Py_DECREF(v);
1933 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001934 /* A NULL can mean "s exhausted"
1935 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001936 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001937 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001938 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001939 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001940 continue;
1941 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001942 }
1943 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001944
Guido van Rossum374a9221991-04-04 10:40:29 +00001945 case SETUP_LOOP:
1946 case SETUP_EXCEPT:
1947 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001948 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001949 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001950 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001951
Guido van Rossum374a9221991-04-04 10:40:29 +00001952 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001953#ifdef LLTRACE
1954 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001955 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001956#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001957 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001958 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001959 continue;
1960 /* Trace each line of code reached */
1961 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001962 /* Inline call_trace() for performance: */
1963 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001964 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001965 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1966 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001967 tstate->use_tracing = (tstate->c_tracefunc
1968 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001969 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001970 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001971
1972 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001973 {
1974 int na = oparg & 0xff;
1975 int nk = (oparg>>8) & 0xff;
1976 int n = na + 2 * nk;
1977 PyObject **pfunc = stack_pointer - n - 1;
1978 PyObject *func = *pfunc;
1979 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1980
1981 /* Always dispatch PyCFunction first, because
1982 these are presumed to be the most frequent
1983 callable object.
1984 */
1985 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001986 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001987 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001988 x = do_call(func, &stack_pointer,
1989 na, nk);
1990 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001991 PyObject *callargs;
1992 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001993 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001994 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001995 } else
1996 x = fast_cfunction(func,
1997 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001998 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001999 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002000 && PyMethod_GET_SELF(func) != NULL) {
2001 /* optimize access to bound methods */
2002 PyObject *self = PyMethod_GET_SELF(func);
2003 Py_INCREF(self);
2004 func = PyMethod_GET_FUNCTION(func);
2005 Py_INCREF(func);
2006 Py_DECREF(*pfunc);
2007 *pfunc = self;
2008 na++;
2009 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002010 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 Py_INCREF(func);
2012 if (PyFunction_Check(func)) {
2013 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002014 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002015 } else {
2016 x = do_call(func, &stack_pointer,
2017 na, nk);
2018 }
2019 Py_DECREF(func);
2020 }
2021
2022 while (stack_pointer > pfunc) {
2023 w = POP();
2024 Py_DECREF(w);
2025 }
2026 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002027 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002028 continue;
2029 break;
2030 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002031
Jeremy Hylton76901512000-03-28 23:49:17 +00002032 case CALL_FUNCTION_VAR:
2033 case CALL_FUNCTION_KW:
2034 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002035 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002036 int na = oparg & 0xff;
2037 int nk = (oparg>>8) & 0xff;
2038 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002039 int n = na + 2 * nk;
2040 PyObject **pfunc, *func;
2041 if (flags & CALL_FLAG_VAR)
2042 n++;
2043 if (flags & CALL_FLAG_KW)
2044 n++;
2045 pfunc = stack_pointer - n - 1;
2046 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002047 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002048
Guido van Rossumac7be682001-01-17 15:42:30 +00002049 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002050 && PyMethod_GET_SELF(func) != NULL) {
2051 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002052 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002053 func = PyMethod_GET_FUNCTION(func);
2054 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002055 Py_DECREF(*pfunc);
2056 *pfunc = self;
2057 na++;
2058 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002059 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002060 Py_INCREF(func);
2061 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002062 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002063
Jeremy Hylton76901512000-03-28 23:49:17 +00002064 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002065 w = POP();
2066 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002067 }
2068 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002069 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002070 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002071 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002072 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002073
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 case MAKE_FUNCTION:
2075 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002076 x = PyFunction_New(v, f->f_globals);
2077 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002078 /* XXX Maybe this should be a separate opcode? */
2079 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002081 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002082 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002083 x = NULL;
2084 break;
2085 }
2086 while (--oparg >= 0) {
2087 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002088 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002089 }
2090 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002091 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002092 }
2093 PUSH(x);
2094 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002095
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002096 case MAKE_CLOSURE:
2097 {
2098 int nfree;
2099 v = POP(); /* code object */
2100 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002101 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002102 Py_DECREF(v);
2103 /* XXX Maybe this should be a separate opcode? */
2104 if (x != NULL && nfree > 0) {
2105 v = PyTuple_New(nfree);
2106 if (v == NULL) {
2107 Py_DECREF(x);
2108 x = NULL;
2109 break;
2110 }
2111 while (--nfree >= 0) {
2112 w = POP();
2113 PyTuple_SET_ITEM(v, nfree, w);
2114 }
2115 err = PyFunction_SetClosure(x, v);
2116 Py_DECREF(v);
2117 }
2118 if (x != NULL && oparg > 0) {
2119 v = PyTuple_New(oparg);
2120 if (v == NULL) {
2121 Py_DECREF(x);
2122 x = NULL;
2123 break;
2124 }
2125 while (--oparg >= 0) {
2126 w = POP();
2127 PyTuple_SET_ITEM(v, oparg, w);
2128 }
2129 err = PyFunction_SetDefaults(x, v);
2130 Py_DECREF(v);
2131 }
2132 PUSH(x);
2133 break;
2134 }
2135
Guido van Rossum8861b741996-07-30 16:49:37 +00002136 case BUILD_SLICE:
2137 if (oparg == 3)
2138 w = POP();
2139 else
2140 w = NULL;
2141 v = POP();
2142 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002143 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 Py_DECREF(u);
2145 Py_DECREF(v);
2146 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002147 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002148 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002149 break;
2150
Fred Drakeef8ace32000-08-24 00:32:09 +00002151 case EXTENDED_ARG:
2152 opcode = NEXTOP();
2153 oparg = oparg<<16 | NEXTARG();
2154 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002155
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 default:
2157 fprintf(stderr,
2158 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002159 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002160 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 why = WHY_EXCEPTION;
2162 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002163
2164#ifdef CASE_TOO_BIG
2165 }
2166#endif
2167
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 } /* switch */
2169
2170 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002171
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002173
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002175 if (err == 0 && x != NULL) {
2176#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002177 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002178 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002179 fprintf(stderr,
2180 "XXX undetected error\n");
2181 else
2182#endif
2183 continue; /* Normal, fast path */
2184 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 err = 0;
2188 }
2189
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002191
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002193 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002194 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002195 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 why = WHY_EXCEPTION;
2197 }
2198 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002199#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002200 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002201 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002202 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002203 fprintf(stderr,
2204 "XXX undetected error (why=%d)\n",
2205 why);
2206 why = WHY_EXCEPTION;
2207 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 }
2209#endif
2210
2211 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002212
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002214 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002215 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002216 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002217 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002218
Fred Drake8f51f542001-10-04 14:48:42 +00002219 if (tstate->c_tracefunc != NULL)
2220 call_exc_trace(tstate->c_tracefunc,
2221 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002222 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002223
Guido van Rossum374a9221991-04-04 10:40:29 +00002224 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002225
Guido van Rossum374a9221991-04-04 10:40:29 +00002226 if (why == WHY_RERAISE)
2227 why = WHY_EXCEPTION;
2228
2229 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002230
Tim Peters5ca576e2001-06-18 22:08:13 +00002231 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002232 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002233
2234 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2235 /* For a continue inside a try block,
2236 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002237 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2238 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002239 why = WHY_NOT;
2240 JUMPTO(PyInt_AS_LONG(retval));
2241 Py_DECREF(retval);
2242 break;
2243 }
2244
Guido van Rossum374a9221991-04-04 10:40:29 +00002245 while (STACK_LEVEL() > b->b_level) {
2246 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002247 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 }
2249 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2250 why = WHY_NOT;
2251 JUMPTO(b->b_handler);
2252 break;
2253 }
2254 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002255 (b->b_type == SETUP_EXCEPT &&
2256 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002257 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002258 PyObject *exc, *val, *tb;
2259 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002261 val = Py_None;
2262 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002263 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002264 /* Make the raw exception data
2265 available to the handler,
2266 so a program can emulate the
2267 Python main loop. Don't do
2268 this for 'finally'. */
2269 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002270 PyErr_NormalizeException(
2271 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002272 set_exc_info(tstate,
2273 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002274 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002275 if (tb == NULL) {
2276 Py_INCREF(Py_None);
2277 PUSH(Py_None);
2278 } else
2279 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002280 PUSH(val);
2281 PUSH(exc);
2282 }
2283 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002284 if (why == WHY_RETURN ||
2285 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002286 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002287 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002288 PUSH(v);
2289 }
2290 why = WHY_NOT;
2291 JUMPTO(b->b_handler);
2292 break;
2293 }
2294 } /* unwind stack */
2295
2296 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002297
Guido van Rossum374a9221991-04-04 10:40:29 +00002298 if (why != WHY_NOT)
2299 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002300
Guido van Rossum374a9221991-04-04 10:40:29 +00002301 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002302
Guido van Rossum35974fb2001-12-06 21:28:18 +00002303 if (why != WHY_YIELD) {
2304 /* Pop remaining stack entries -- but when yielding */
2305 while (!EMPTY()) {
2306 v = POP();
2307 Py_XDECREF(v);
2308 }
2309 }
2310
Tim Peters5ca576e2001-06-18 22:08:13 +00002311 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002312 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002313
Fred Drake9e3ad782001-07-03 23:39:52 +00002314 if (tstate->use_tracing) {
2315 if (tstate->c_tracefunc
2316 && (why == WHY_RETURN || why == WHY_YIELD)) {
2317 if (call_trace(tstate->c_tracefunc,
2318 tstate->c_traceobj, f,
2319 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002321 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002322 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002323 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002324 }
Fred Drake8f51f542001-10-04 14:48:42 +00002325 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002326 if (why == WHY_EXCEPTION)
2327 call_trace_protected(tstate->c_profilefunc,
2328 tstate->c_profileobj, f,
2329 PyTrace_RETURN);
2330 else if (call_trace(tstate->c_profilefunc,
2331 tstate->c_profileobj, f,
2332 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002333 Py_XDECREF(retval);
2334 retval = NULL;
2335 why = WHY_EXCEPTION;
2336 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002337 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002338 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002339
Guido van Rossuma027efa1997-05-05 20:56:21 +00002340 reset_exc_info(tstate);
2341
Tim Peters5ca576e2001-06-18 22:08:13 +00002342 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002343 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002344 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002345
Guido van Rossum96a42c81992-01-12 02:29:51 +00002346 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002347}
2348
Tim Peters6d6c1a32001-08-02 04:15:00 +00002349PyObject *
2350PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002351 PyObject **args, int argcount, PyObject **kws, int kwcount,
2352 PyObject **defs, int defcount, PyObject *closure)
2353{
2354 register PyFrameObject *f;
2355 register PyObject *retval = NULL;
2356 register PyObject **fastlocals, **freevars;
2357 PyThreadState *tstate = PyThreadState_GET();
2358 PyObject *x, *u;
2359
2360 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002361 PyErr_SetString(PyExc_SystemError,
2362 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002363 return NULL;
2364 }
2365
2366 f = PyFrame_New(tstate, /*back*/
2367 co, /*code*/
2368 globals, locals);
2369 if (f == NULL)
2370 return NULL;
2371
2372 fastlocals = f->f_localsplus;
2373 freevars = f->f_localsplus + f->f_nlocals;
2374
2375 if (co->co_argcount > 0 ||
2376 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2377 int i;
2378 int n = argcount;
2379 PyObject *kwdict = NULL;
2380 if (co->co_flags & CO_VARKEYWORDS) {
2381 kwdict = PyDict_New();
2382 if (kwdict == NULL)
2383 goto fail;
2384 i = co->co_argcount;
2385 if (co->co_flags & CO_VARARGS)
2386 i++;
2387 SETLOCAL(i, kwdict);
2388 }
2389 if (argcount > co->co_argcount) {
2390 if (!(co->co_flags & CO_VARARGS)) {
2391 PyErr_Format(PyExc_TypeError,
2392 "%.200s() takes %s %d "
2393 "%sargument%s (%d given)",
2394 PyString_AsString(co->co_name),
2395 defcount ? "at most" : "exactly",
2396 co->co_argcount,
2397 kwcount ? "non-keyword " : "",
2398 co->co_argcount == 1 ? "" : "s",
2399 argcount);
2400 goto fail;
2401 }
2402 n = co->co_argcount;
2403 }
2404 for (i = 0; i < n; i++) {
2405 x = args[i];
2406 Py_INCREF(x);
2407 SETLOCAL(i, x);
2408 }
2409 if (co->co_flags & CO_VARARGS) {
2410 u = PyTuple_New(argcount - n);
2411 if (u == NULL)
2412 goto fail;
2413 SETLOCAL(co->co_argcount, u);
2414 for (i = n; i < argcount; i++) {
2415 x = args[i];
2416 Py_INCREF(x);
2417 PyTuple_SET_ITEM(u, i-n, x);
2418 }
2419 }
2420 for (i = 0; i < kwcount; i++) {
2421 PyObject *keyword = kws[2*i];
2422 PyObject *value = kws[2*i + 1];
2423 int j;
2424 if (keyword == NULL || !PyString_Check(keyword)) {
2425 PyErr_Format(PyExc_TypeError,
2426 "%.200s() keywords must be strings",
2427 PyString_AsString(co->co_name));
2428 goto fail;
2429 }
2430 /* XXX slow -- speed up using dictionary? */
2431 for (j = 0; j < co->co_argcount; j++) {
2432 PyObject *nm = PyTuple_GET_ITEM(
2433 co->co_varnames, j);
2434 int cmp = PyObject_RichCompareBool(
2435 keyword, nm, Py_EQ);
2436 if (cmp > 0)
2437 break;
2438 else if (cmp < 0)
2439 goto fail;
2440 }
2441 /* Check errors from Compare */
2442 if (PyErr_Occurred())
2443 goto fail;
2444 if (j >= co->co_argcount) {
2445 if (kwdict == NULL) {
2446 PyErr_Format(PyExc_TypeError,
2447 "%.200s() got an unexpected "
2448 "keyword argument '%.400s'",
2449 PyString_AsString(co->co_name),
2450 PyString_AsString(keyword));
2451 goto fail;
2452 }
2453 PyDict_SetItem(kwdict, keyword, value);
2454 }
2455 else {
2456 if (GETLOCAL(j) != NULL) {
2457 PyErr_Format(PyExc_TypeError,
2458 "%.200s() got multiple "
2459 "values for keyword "
2460 "argument '%.400s'",
2461 PyString_AsString(co->co_name),
2462 PyString_AsString(keyword));
2463 goto fail;
2464 }
2465 Py_INCREF(value);
2466 SETLOCAL(j, value);
2467 }
2468 }
2469 if (argcount < co->co_argcount) {
2470 int m = co->co_argcount - defcount;
2471 for (i = argcount; i < m; i++) {
2472 if (GETLOCAL(i) == NULL) {
2473 PyErr_Format(PyExc_TypeError,
2474 "%.200s() takes %s %d "
2475 "%sargument%s (%d given)",
2476 PyString_AsString(co->co_name),
2477 ((co->co_flags & CO_VARARGS) ||
2478 defcount) ? "at least"
2479 : "exactly",
2480 m, kwcount ? "non-keyword " : "",
2481 m == 1 ? "" : "s", i);
2482 goto fail;
2483 }
2484 }
2485 if (n > m)
2486 i = n - m;
2487 else
2488 i = 0;
2489 for (; i < defcount; i++) {
2490 if (GETLOCAL(m+i) == NULL) {
2491 PyObject *def = defs[i];
2492 Py_INCREF(def);
2493 SETLOCAL(m+i, def);
2494 }
2495 }
2496 }
2497 }
2498 else {
2499 if (argcount > 0 || kwcount > 0) {
2500 PyErr_Format(PyExc_TypeError,
2501 "%.200s() takes no arguments (%d given)",
2502 PyString_AsString(co->co_name),
2503 argcount + kwcount);
2504 goto fail;
2505 }
2506 }
2507 /* Allocate and initialize storage for cell vars, and copy free
2508 vars into frame. This isn't too efficient right now. */
2509 if (f->f_ncells) {
2510 int i = 0, j = 0, nargs, found;
2511 char *cellname, *argname;
2512 PyObject *c;
2513
2514 nargs = co->co_argcount;
2515 if (co->co_flags & CO_VARARGS)
2516 nargs++;
2517 if (co->co_flags & CO_VARKEYWORDS)
2518 nargs++;
2519
2520 /* Check for cells that shadow args */
2521 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2522 cellname = PyString_AS_STRING(
2523 PyTuple_GET_ITEM(co->co_cellvars, i));
2524 found = 0;
2525 while (j < nargs) {
2526 argname = PyString_AS_STRING(
2527 PyTuple_GET_ITEM(co->co_varnames, j));
2528 if (strcmp(cellname, argname) == 0) {
2529 c = PyCell_New(GETLOCAL(j));
2530 if (c == NULL)
2531 goto fail;
2532 GETLOCAL(f->f_nlocals + i) = c;
2533 found = 1;
2534 break;
2535 }
2536 j++;
2537 }
2538 if (found == 0) {
2539 c = PyCell_New(NULL);
2540 if (c == NULL)
2541 goto fail;
2542 SETLOCAL(f->f_nlocals + i, c);
2543 }
2544 }
2545 /* Initialize any that are left */
2546 while (i < f->f_ncells) {
2547 c = PyCell_New(NULL);
2548 if (c == NULL)
2549 goto fail;
2550 SETLOCAL(f->f_nlocals + i, c);
2551 i++;
2552 }
2553 }
2554 if (f->f_nfreevars) {
2555 int i;
2556 for (i = 0; i < f->f_nfreevars; ++i) {
2557 PyObject *o = PyTuple_GET_ITEM(closure, i);
2558 Py_INCREF(o);
2559 freevars[f->f_ncells + i] = o;
2560 }
2561 }
2562
Tim Peters5ca576e2001-06-18 22:08:13 +00002563 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002564 /* Don't need to keep the reference to f_back, it will be set
2565 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002566 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002567 f->f_back = NULL;
2568
2569 /* Create a new generator that owns the ready to run frame
2570 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002571 return gen_new(f);
2572 }
2573
2574 retval = eval_frame(f);
2575
2576 fail: /* Jump here from prelude on failure */
2577
Tim Petersb13680b2001-11-27 23:29:29 +00002578 /* decref'ing the frame can cause __del__ methods to get invoked,
2579 which can call back into Python. While we're done with the
2580 current Python frame (f), the associated C stack is still in use,
2581 so recursion_depth must be boosted for the duration.
2582 */
2583 assert(tstate != NULL);
2584 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002585 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002586 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002587 return retval;
2588}
2589
2590
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002592set_exc_info(PyThreadState *tstate,
2593 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594{
2595 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002596 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002597
Guido van Rossuma027efa1997-05-05 20:56:21 +00002598 frame = tstate->frame;
2599 if (frame->f_exc_type == NULL) {
2600 /* This frame didn't catch an exception before */
2601 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002602 if (tstate->exc_type == NULL) {
2603 Py_INCREF(Py_None);
2604 tstate->exc_type = Py_None;
2605 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002606 tmp_type = frame->f_exc_type;
2607 tmp_value = frame->f_exc_value;
2608 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002609 Py_XINCREF(tstate->exc_type);
2610 Py_XINCREF(tstate->exc_value);
2611 Py_XINCREF(tstate->exc_traceback);
2612 frame->f_exc_type = tstate->exc_type;
2613 frame->f_exc_value = tstate->exc_value;
2614 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002615 Py_XDECREF(tmp_type);
2616 Py_XDECREF(tmp_value);
2617 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002618 }
2619 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002620 tmp_type = tstate->exc_type;
2621 tmp_value = tstate->exc_value;
2622 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002623 Py_XINCREF(type);
2624 Py_XINCREF(value);
2625 Py_XINCREF(tb);
2626 tstate->exc_type = type;
2627 tstate->exc_value = value;
2628 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002629 Py_XDECREF(tmp_type);
2630 Py_XDECREF(tmp_value);
2631 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002632 /* For b/w compatibility */
2633 PySys_SetObject("exc_type", type);
2634 PySys_SetObject("exc_value", value);
2635 PySys_SetObject("exc_traceback", tb);
2636}
2637
2638static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002639reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640{
2641 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002642 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002643 frame = tstate->frame;
2644 if (frame->f_exc_type != NULL) {
2645 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002646 tmp_type = tstate->exc_type;
2647 tmp_value = tstate->exc_value;
2648 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002649 Py_XINCREF(frame->f_exc_type);
2650 Py_XINCREF(frame->f_exc_value);
2651 Py_XINCREF(frame->f_exc_traceback);
2652 tstate->exc_type = frame->f_exc_type;
2653 tstate->exc_value = frame->f_exc_value;
2654 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002655 Py_XDECREF(tmp_type);
2656 Py_XDECREF(tmp_value);
2657 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002658 /* For b/w compatibility */
2659 PySys_SetObject("exc_type", frame->f_exc_type);
2660 PySys_SetObject("exc_value", frame->f_exc_value);
2661 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2662 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002663 tmp_type = frame->f_exc_type;
2664 tmp_value = frame->f_exc_value;
2665 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002666 frame->f_exc_type = NULL;
2667 frame->f_exc_value = NULL;
2668 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002669 Py_XDECREF(tmp_type);
2670 Py_XDECREF(tmp_value);
2671 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002672}
2673
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002674/* Logic for the raise statement (too complicated for inlining).
2675 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002676static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002677do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002678{
Guido van Rossumd295f121998-04-09 21:39:57 +00002679 if (type == NULL) {
2680 /* Reraise */
2681 PyThreadState *tstate = PyThreadState_Get();
2682 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2683 value = tstate->exc_value;
2684 tb = tstate->exc_traceback;
2685 Py_XINCREF(type);
2686 Py_XINCREF(value);
2687 Py_XINCREF(tb);
2688 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002689
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002690 /* We support the following forms of raise:
2691 raise <class>, <classinstance>
2692 raise <class>, <argument tuple>
2693 raise <class>, None
2694 raise <class>, <argument>
2695 raise <classinstance>, None
2696 raise <string>, <object>
2697 raise <string>, None
2698
2699 An omitted second argument is the same as None.
2700
2701 In addition, raise <tuple>, <anything> is the same as
2702 raising the tuple's first item (and it better have one!);
2703 this rule is applied recursively.
2704
2705 Finally, an optional third argument can be supplied, which
2706 gives the traceback to be substituted (useful when
2707 re-raising an exception after examining it). */
2708
2709 /* First, check the traceback argument, replacing None with
2710 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 if (tb == Py_None) {
2712 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 tb = NULL;
2714 }
2715 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002717 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002718 goto raise_error;
2719 }
2720
2721 /* Next, replace a missing value with None */
2722 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 value = Py_None;
2724 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002725 }
2726
2727 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2729 PyObject *tmp = type;
2730 type = PyTuple_GET_ITEM(type, 0);
2731 Py_INCREF(type);
2732 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 }
2734
Barry Warsaw4249f541997-08-22 21:26:19 +00002735 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002737
2738 else if (PyClass_Check(type))
2739 PyErr_NormalizeException(&type, &value, &tb);
2740
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002742 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 if (value != Py_None) {
2744 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002745 "instance exception may not have a separate value");
2746 goto raise_error;
2747 }
2748 else {
2749 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002751 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2753 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002754 }
2755 }
2756 else {
2757 /* Not something you can raise. You get an exception
2758 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002759 PyErr_Format(PyExc_TypeError,
2760 "exceptions must be strings, classes, or "
2761 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002762 goto raise_error;
2763 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002765 if (tb == NULL)
2766 return WHY_EXCEPTION;
2767 else
2768 return WHY_RERAISE;
2769 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002770 Py_XDECREF(value);
2771 Py_XDECREF(type);
2772 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002773 return WHY_EXCEPTION;
2774}
2775
Tim Petersd6d010b2001-06-21 02:49:55 +00002776/* Iterate v argcnt times and store the results on the stack (via decreasing
2777 sp). Return 1 for success, 0 if error. */
2778
Barry Warsawe42b18f1997-08-25 22:13:04 +00002779static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002780unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002781{
Tim Petersd6d010b2001-06-21 02:49:55 +00002782 int i = 0;
2783 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002784 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002785
Tim Petersd6d010b2001-06-21 02:49:55 +00002786 assert(v != NULL);
2787
2788 it = PyObject_GetIter(v);
2789 if (it == NULL)
2790 goto Error;
2791
2792 for (; i < argcnt; i++) {
2793 w = PyIter_Next(it);
2794 if (w == NULL) {
2795 /* Iterator done, via error or exhaustion. */
2796 if (!PyErr_Occurred()) {
2797 PyErr_Format(PyExc_ValueError,
2798 "need more than %d value%s to unpack",
2799 i, i == 1 ? "" : "s");
2800 }
2801 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002802 }
2803 *--sp = w;
2804 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002805
2806 /* We better have exhausted the iterator now. */
2807 w = PyIter_Next(it);
2808 if (w == NULL) {
2809 if (PyErr_Occurred())
2810 goto Error;
2811 Py_DECREF(it);
2812 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002813 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002814 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002815 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002816 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002817Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002818 for (; i > 0; i--, sp++)
2819 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002820 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002821 return 0;
2822}
2823
2824
Guido van Rossum96a42c81992-01-12 02:29:51 +00002825#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002826static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002827prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002829 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002830 if (PyObject_Print(v, stdout, 0) != 0)
2831 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002832 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002833 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002835#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002837static void
Fred Drake5755ce62001-06-27 19:19:46 +00002838call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002839{
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002841 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002843 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002844 value = Py_None;
2845 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002846 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002847 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002848 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002849 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002850 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002851 }
Fred Drake5755ce62001-06-27 19:19:46 +00002852 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002853 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002854 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002855 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002856 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002857 Py_XDECREF(type);
2858 Py_XDECREF(value);
2859 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002860 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002861}
2862
Fred Drake4ec5d562001-10-04 19:26:43 +00002863static void
2864call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2865 int what)
2866{
2867 PyObject *type, *value, *traceback;
2868 int err;
2869 PyErr_Fetch(&type, &value, &traceback);
2870 err = call_trace(func, obj, frame, what, NULL);
2871 if (err == 0)
2872 PyErr_Restore(type, value, traceback);
2873 else {
2874 Py_XDECREF(type);
2875 Py_XDECREF(value);
2876 Py_XDECREF(traceback);
2877 }
2878}
2879
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002880static int
Fred Drake5755ce62001-06-27 19:19:46 +00002881call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2882 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002883{
Fred Drake5755ce62001-06-27 19:19:46 +00002884 register PyThreadState *tstate = frame->f_tstate;
2885 int result;
2886 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002887 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002888 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002889 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002890 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002891 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2892 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002893 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002894 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002895}
2896
Fred Drake5755ce62001-06-27 19:19:46 +00002897void
2898PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002899{
Fred Drake5755ce62001-06-27 19:19:46 +00002900 PyThreadState *tstate = PyThreadState_Get();
2901 PyObject *temp = tstate->c_profileobj;
2902 Py_XINCREF(arg);
2903 tstate->c_profilefunc = NULL;
2904 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002905 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002906 Py_XDECREF(temp);
2907 tstate->c_profilefunc = func;
2908 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002909 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002910}
2911
2912void
2913PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2914{
2915 PyThreadState *tstate = PyThreadState_Get();
2916 PyObject *temp = tstate->c_traceobj;
2917 Py_XINCREF(arg);
2918 tstate->c_tracefunc = NULL;
2919 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002920 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002921 Py_XDECREF(temp);
2922 tstate->c_tracefunc = func;
2923 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002924 tstate->use_tracing = ((func != NULL)
2925 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002926}
2927
Guido van Rossumb209a111997-04-29 18:18:01 +00002928PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002929PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002930{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002931 PyThreadState *tstate = PyThreadState_Get();
2932 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002933 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002934 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002935 else
2936 return current_frame->f_builtins;
2937}
2938
Guido van Rossumb209a111997-04-29 18:18:01 +00002939PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002940PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002941{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002942 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002943 if (current_frame == NULL)
2944 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002945 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002946 return current_frame->f_locals;
2947}
2948
Guido van Rossumb209a111997-04-29 18:18:01 +00002949PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002950PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002951{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002952 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002953 if (current_frame == NULL)
2954 return NULL;
2955 else
2956 return current_frame->f_globals;
2957}
2958
Guido van Rossumb209a111997-04-29 18:18:01 +00002959PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002960PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002961{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002962 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002963 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002964}
2965
Guido van Rossum6135a871995-01-09 17:53:26 +00002966int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002967PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002968{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002969 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002970 return current_frame == NULL ? 0 : current_frame->f_restricted;
2971}
2972
Guido van Rossumbe270261997-05-22 22:26:18 +00002973int
Tim Peters5ba58662001-07-16 02:29:45 +00002974PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002975{
2976 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002977 int result = 0;
2978
2979 if (current_frame != NULL) {
2980 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002981 const int compilerflags = codeflags & PyCF_MASK;
2982 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002983 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002984 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002985 }
2986 }
2987 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002988}
2989
2990int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002991Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992{
Guido van Rossumb209a111997-04-29 18:18:01 +00002993 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002994 if (f == NULL)
2995 return 0;
2996 if (!PyFile_SoftSpace(f, 0))
2997 return 0;
2998 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002999}
3000
Guido van Rossum3f5da241990-12-20 15:06:42 +00003001
Guido van Rossum681d79a1995-07-18 14:51:37 +00003002/* External interface to call any callable object.
3003 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003004
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003005#undef PyEval_CallObject
3006/* for backward compatibility: export this interface */
3007
Guido van Rossumb209a111997-04-29 18:18:01 +00003008PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003009PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003010{
Guido van Rossumb209a111997-04-29 18:18:01 +00003011 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003012}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003013#define PyEval_CallObject(func,arg) \
3014 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003015
Guido van Rossumb209a111997-04-29 18:18:01 +00003016PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003017PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018{
Jeremy Hylton52820442001-01-03 23:52:36 +00003019 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003020
3021 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003022 arg = PyTuple_New(0);
3023 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003024 PyErr_SetString(PyExc_TypeError,
3025 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 return NULL;
3027 }
3028 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003029 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003030
Guido van Rossumb209a111997-04-29 18:18:01 +00003031 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003032 PyErr_SetString(PyExc_TypeError,
3033 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003034 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003035 return NULL;
3036 }
3037
Tim Peters6d6c1a32001-08-02 04:15:00 +00003038 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003039 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003040 return result;
3041}
3042
Tim Peters6d6c1a32001-08-02 04:15:00 +00003043char *
3044PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003045{
3046 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003047 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003048 else if (PyFunction_Check(func))
3049 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3050 else if (PyCFunction_Check(func))
3051 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3052 else if (PyClass_Check(func))
3053 return PyString_AsString(((PyClassObject*)func)->cl_name);
3054 else if (PyInstance_Check(func)) {
3055 return PyString_AsString(
3056 ((PyInstanceObject*)func)->in_class->cl_name);
3057 } else {
3058 return func->ob_type->tp_name;
3059 }
3060}
3061
Tim Peters6d6c1a32001-08-02 04:15:00 +00003062char *
3063PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003064{
3065 if (PyMethod_Check(func))
3066 return "()";
3067 else if (PyFunction_Check(func))
3068 return "()";
3069 else if (PyCFunction_Check(func))
3070 return "()";
3071 else if (PyClass_Check(func))
3072 return " constructor";
3073 else if (PyInstance_Check(func)) {
3074 return " instance";
3075 } else {
3076 return " object";
3077 }
3078}
3079
Jeremy Hylton52820442001-01-03 23:52:36 +00003080#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3081
3082/* The two fast_xxx() functions optimize calls for which no argument
3083 tuple is necessary; the objects are passed directly from the stack.
3084 fast_cfunction() is called for METH_OLDARGS functions.
3085 fast_function() is for functions with no special argument handling.
3086*/
3087
3088static PyObject *
3089fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3090{
3091 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3092 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003093 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003094
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003095 switch (flags) {
3096 case METH_OLDARGS:
3097 if (na == 0)
3098 return (*meth)(self, NULL);
3099 else if (na == 1) {
3100 PyObject *arg = EXT_POP(*pp_stack);
3101 PyObject *result = (*meth)(self, arg);
3102 Py_DECREF(arg);
3103 return result;
3104 } else {
3105 PyObject *args = load_args(pp_stack, na);
3106 PyObject *result = (*meth)(self, args);
3107 Py_DECREF(args);
3108 return result;
3109 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003110 case METH_NOARGS:
3111 if (na == 0)
3112 return (*meth)(self, NULL);
3113 PyErr_Format(PyExc_TypeError,
3114 "%.200s() takes no arguments (%d given)",
3115 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3116 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003117 case METH_O:
3118 if (na == 1) {
3119 PyObject *arg = EXT_POP(*pp_stack);
3120 PyObject *result = (*meth)(self, arg);
3121 Py_DECREF(arg);
3122 return result;
3123 }
3124 PyErr_Format(PyExc_TypeError,
3125 "%.200s() takes exactly one argument (%d given)",
3126 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3127 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003128 default:
3129 fprintf(stderr, "%.200s() flags = %d\n",
3130 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3131 PyErr_BadInternalCall();
3132 return NULL;
3133 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003134}
3135
3136static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003137fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003138{
3139 PyObject *co = PyFunction_GET_CODE(func);
3140 PyObject *globals = PyFunction_GET_GLOBALS(func);
3141 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003142 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003143 PyObject **d = NULL;
3144 int nd = 0;
3145
3146 if (argdefs != NULL) {
3147 d = &PyTuple_GET_ITEM(argdefs, 0);
3148 nd = ((PyTupleObject *)argdefs)->ob_size;
3149 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003150 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003151 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003152 (*pp_stack)-2*nk, nk, d, nd,
3153 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003154}
3155
3156static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003157update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3158 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003159{
3160 PyObject *kwdict = NULL;
3161 if (orig_kwdict == NULL)
3162 kwdict = PyDict_New();
3163 else {
3164 kwdict = PyDict_Copy(orig_kwdict);
3165 Py_DECREF(orig_kwdict);
3166 }
3167 if (kwdict == NULL)
3168 return NULL;
3169 while (--nk >= 0) {
3170 int err;
3171 PyObject *value = EXT_POP(*pp_stack);
3172 PyObject *key = EXT_POP(*pp_stack);
3173 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003174 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003175 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003176 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003177 PyEval_GetFuncName(func),
3178 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003179 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003180 Py_DECREF(key);
3181 Py_DECREF(value);
3182 Py_DECREF(kwdict);
3183 return NULL;
3184 }
3185 err = PyDict_SetItem(kwdict, key, value);
3186 Py_DECREF(key);
3187 Py_DECREF(value);
3188 if (err) {
3189 Py_DECREF(kwdict);
3190 return NULL;
3191 }
3192 }
3193 return kwdict;
3194}
3195
3196static PyObject *
3197update_star_args(int nstack, int nstar, PyObject *stararg,
3198 PyObject ***pp_stack)
3199{
3200 PyObject *callargs, *w;
3201
3202 callargs = PyTuple_New(nstack + nstar);
3203 if (callargs == NULL) {
3204 return NULL;
3205 }
3206 if (nstar) {
3207 int i;
3208 for (i = 0; i < nstar; i++) {
3209 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3210 Py_INCREF(a);
3211 PyTuple_SET_ITEM(callargs, nstack + i, a);
3212 }
3213 }
3214 while (--nstack >= 0) {
3215 w = EXT_POP(*pp_stack);
3216 PyTuple_SET_ITEM(callargs, nstack, w);
3217 }
3218 return callargs;
3219}
3220
3221static PyObject *
3222load_args(PyObject ***pp_stack, int na)
3223{
3224 PyObject *args = PyTuple_New(na);
3225 PyObject *w;
3226
3227 if (args == NULL)
3228 return NULL;
3229 while (--na >= 0) {
3230 w = EXT_POP(*pp_stack);
3231 PyTuple_SET_ITEM(args, na, w);
3232 }
3233 return args;
3234}
3235
3236static PyObject *
3237do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3238{
3239 PyObject *callargs = NULL;
3240 PyObject *kwdict = NULL;
3241 PyObject *result = NULL;
3242
3243 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003244 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003245 if (kwdict == NULL)
3246 goto call_fail;
3247 }
3248 callargs = load_args(pp_stack, na);
3249 if (callargs == NULL)
3250 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003251 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003252 call_fail:
3253 Py_XDECREF(callargs);
3254 Py_XDECREF(kwdict);
3255 return result;
3256}
3257
3258static PyObject *
3259ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3260{
3261 int nstar = 0;
3262 PyObject *callargs = NULL;
3263 PyObject *stararg = NULL;
3264 PyObject *kwdict = NULL;
3265 PyObject *result = NULL;
3266
3267 if (flags & CALL_FLAG_KW) {
3268 kwdict = EXT_POP(*pp_stack);
3269 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003270 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003271 "%s%s argument after ** "
3272 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003273 PyEval_GetFuncName(func),
3274 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003275 goto ext_call_fail;
3276 }
3277 }
3278 if (flags & CALL_FLAG_VAR) {
3279 stararg = EXT_POP(*pp_stack);
3280 if (!PyTuple_Check(stararg)) {
3281 PyObject *t = NULL;
3282 t = PySequence_Tuple(stararg);
3283 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003284 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3285 PyErr_Format(PyExc_TypeError,
3286 "%s%s argument after * "
3287 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003288 PyEval_GetFuncName(func),
3289 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003290 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003291 goto ext_call_fail;
3292 }
3293 Py_DECREF(stararg);
3294 stararg = t;
3295 }
3296 nstar = PyTuple_GET_SIZE(stararg);
3297 }
3298 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003299 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003300 if (kwdict == NULL)
3301 goto ext_call_fail;
3302 }
3303 callargs = update_star_args(na, nstar, stararg, pp_stack);
3304 if (callargs == NULL)
3305 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003306 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003307 ext_call_fail:
3308 Py_XDECREF(callargs);
3309 Py_XDECREF(kwdict);
3310 Py_XDECREF(stararg);
3311 return result;
3312}
3313
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003314#define SLICE_ERROR_MSG \
3315 "standard sequence type does not support step size other than one"
3316
Guido van Rossumb209a111997-04-29 18:18:01 +00003317static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003318loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003319{
Guido van Rossumb209a111997-04-29 18:18:01 +00003320 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003321 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003322 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003323 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 return NULL;
3325 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003326 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003327 v = (*sq->sq_item)(v, i);
3328 if (v)
3329 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003330 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003331 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003332 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333}
3334
Tim Peterscb479e72001-12-16 19:11:44 +00003335/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3336 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3337 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3338*/
Tim Petersb5196382001-12-16 19:44:20 +00003339/* Note: If v is NULL, return success without storing into *pi. This
3340 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3341 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003342*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003343int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003344_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345{
Tim Petersb5196382001-12-16 19:44:20 +00003346 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003347 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003348 if (PyInt_Check(v)) {
3349 x = PyInt_AsLong(v);
3350 } else if (PyLong_Check(v)) {
3351 x = PyLong_AsLong(v);
3352 if (x==-1 && PyErr_Occurred()) {
3353 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003354 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003355
Guido van Rossumac7be682001-01-17 15:42:30 +00003356 if (!PyErr_ExceptionMatches(
3357 PyExc_OverflowError)) {
3358 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003359 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003360 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003361 }
3362
Guido van Rossumac7be682001-01-17 15:42:30 +00003363 /* Clear the OverflowError */
3364 PyErr_Clear();
3365
3366 /* It's an overflow error, so we need to
3367 check the sign of the long integer,
3368 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003369 the error. */
3370
3371 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003372 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003373 if (long_zero == NULL)
3374 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003375
3376 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003377 cmp = PyObject_RichCompareBool(v, long_zero,
3378 Py_GT);
3379 Py_DECREF(long_zero);
3380 if (cmp < 0)
3381 return 0;
3382 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003383 x = INT_MAX;
3384 else
3385 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003386 }
3387 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003388 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003389 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003390 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003391 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003392 /* Truncate -- very long indices are truncated anyway */
3393 if (x > INT_MAX)
3394 x = INT_MAX;
3395 else if (x < -INT_MAX)
3396 x = 0;
3397 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003399 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400}
3401
Guido van Rossum50d756e2001-08-18 17:43:36 +00003402#undef ISINT
3403#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3404
Guido van Rossumb209a111997-04-29 18:18:01 +00003405static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003406apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003408 PyTypeObject *tp = u->ob_type;
3409 PySequenceMethods *sq = tp->tp_as_sequence;
3410
3411 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3412 int ilow = 0, ihigh = INT_MAX;
3413 if (!_PyEval_SliceIndex(v, &ilow))
3414 return NULL;
3415 if (!_PyEval_SliceIndex(w, &ihigh))
3416 return NULL;
3417 return PySequence_GetSlice(u, ilow, ihigh);
3418 }
3419 else {
3420 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003421 if (slice != NULL) {
3422 PyObject *res = PyObject_GetItem(u, slice);
3423 Py_DECREF(slice);
3424 return res;
3425 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003426 else
3427 return NULL;
3428 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003430
3431static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003432assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3433 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003434{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003435 PyTypeObject *tp = u->ob_type;
3436 PySequenceMethods *sq = tp->tp_as_sequence;
3437
3438 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3439 int ilow = 0, ihigh = INT_MAX;
3440 if (!_PyEval_SliceIndex(v, &ilow))
3441 return -1;
3442 if (!_PyEval_SliceIndex(w, &ihigh))
3443 return -1;
3444 if (x == NULL)
3445 return PySequence_DelSlice(u, ilow, ihigh);
3446 else
3447 return PySequence_SetSlice(u, ilow, ihigh, x);
3448 }
3449 else {
3450 PyObject *slice = PySlice_New(v, w, NULL);
3451 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003452 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003453 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003454 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003455 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003456 res = PyObject_DelItem(u, slice);
3457 Py_DECREF(slice);
3458 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003459 }
3460 else
3461 return -1;
3462 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463}
3464
Guido van Rossumb209a111997-04-29 18:18:01 +00003465static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003466cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003467{
Guido van Rossumac7be682001-01-17 15:42:30 +00003468 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003469 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003470 case IS:
3471 case IS_NOT:
3472 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003473 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003474 res = !res;
3475 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003476 case IN:
3477 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003478 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003479 if (res < 0)
3480 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003481 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003482 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003483 break;
3484 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003485 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 break;
3487 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003488 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003490 v = res ? Py_True : Py_False;
3491 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 return v;
3493}
3494
Thomas Wouters52152252000-08-17 22:55:00 +00003495static PyObject *
3496import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003497{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003498 PyObject *x;
3499
3500 x = PyObject_GetAttr(v, name);
3501 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003502 PyErr_Format(PyExc_ImportError,
3503 "cannot import name %.230s",
3504 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003505 }
Thomas Wouters52152252000-08-17 22:55:00 +00003506 return x;
3507}
Guido van Rossumac7be682001-01-17 15:42:30 +00003508
Thomas Wouters52152252000-08-17 22:55:00 +00003509static int
3510import_all_from(PyObject *locals, PyObject *v)
3511{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003512 PyObject *all = PyObject_GetAttrString(v, "__all__");
3513 PyObject *dict, *name, *value;
3514 int skip_leading_underscores = 0;
3515 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003516
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003517 if (all == NULL) {
3518 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3519 return -1; /* Unexpected error */
3520 PyErr_Clear();
3521 dict = PyObject_GetAttrString(v, "__dict__");
3522 if (dict == NULL) {
3523 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3524 return -1;
3525 PyErr_SetString(PyExc_ImportError,
3526 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003527 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003528 }
3529 all = PyMapping_Keys(dict);
3530 Py_DECREF(dict);
3531 if (all == NULL)
3532 return -1;
3533 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003534 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003535
3536 for (pos = 0, err = 0; ; pos++) {
3537 name = PySequence_GetItem(all, pos);
3538 if (name == NULL) {
3539 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3540 err = -1;
3541 else
3542 PyErr_Clear();
3543 break;
3544 }
3545 if (skip_leading_underscores &&
3546 PyString_Check(name) &&
3547 PyString_AS_STRING(name)[0] == '_')
3548 {
3549 Py_DECREF(name);
3550 continue;
3551 }
3552 value = PyObject_GetAttr(v, name);
3553 if (value == NULL)
3554 err = -1;
3555 else
3556 err = PyDict_SetItem(locals, name, value);
3557 Py_DECREF(name);
3558 Py_XDECREF(value);
3559 if (err != 0)
3560 break;
3561 }
3562 Py_DECREF(all);
3563 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003564}
3565
Guido van Rossumb209a111997-04-29 18:18:01 +00003566static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003567build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003568{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003569 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003570
3571 if (PyDict_Check(methods))
3572 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003573 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003574 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003575 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3576 base = PyTuple_GET_ITEM(bases, 0);
3577 metaclass = PyObject_GetAttrString(base, "__class__");
3578 if (metaclass == NULL) {
3579 PyErr_Clear();
3580 metaclass = (PyObject *)base->ob_type;
3581 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003582 }
3583 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003584 else {
3585 PyObject *g = PyEval_GetGlobals();
3586 if (g != NULL && PyDict_Check(g))
3587 metaclass = PyDict_GetItemString(g, "__metaclass__");
3588 if (metaclass == NULL)
3589 metaclass = (PyObject *) &PyClass_Type;
3590 Py_INCREF(metaclass);
3591 }
3592 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3593 Py_DECREF(metaclass);
3594 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003595}
3596
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003597static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003598exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3599 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003600{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003601 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003602 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003603 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003604
Guido van Rossumb209a111997-04-29 18:18:01 +00003605 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3606 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003607 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003608 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003609 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003610 locals = PyTuple_GetItem(prog, 2);
3611 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003612 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003613 if (globals == Py_None) {
3614 globals = PyEval_GetGlobals();
3615 if (locals == Py_None) {
3616 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003617 plain = 1;
3618 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003620 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003621 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003622 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003623 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003624 !PyCode_Check(prog) &&
3625 !PyFile_Check(prog)) {
3626 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003627 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003628 return -1;
3629 }
Fred Drake661ea262000-10-24 19:57:45 +00003630 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003631 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003632 "exec: arg 2 must be a dictionary or None");
3633 return -1;
3634 }
3635 if (!PyDict_Check(locals)) {
3636 PyErr_SetString(PyExc_TypeError,
3637 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003638 return -1;
3639 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003640 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003641 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003642 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003643 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3644 PyErr_SetString(PyExc_TypeError,
3645 "code object passed to exec may not contain free variables");
3646 return -1;
3647 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003648 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003649 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003650 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003651 FILE *fp = PyFile_AsFile(prog);
3652 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003653 PyCompilerFlags cf;
3654 cf.cf_flags = 0;
3655 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003656 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3657 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003658 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003659 v = PyRun_File(fp, name, Py_file_input, globals,
3660 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003661 }
3662 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003663 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003664 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003665 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003666 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003667 cf.cf_flags = 0;
3668 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003669 v = PyRun_StringFlags(str, Py_file_input, globals,
3670 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003671 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003672 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003673 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003674 if (plain)
3675 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003676 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003677 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003678 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003679 return 0;
3680}
Guido van Rossum24c13741995-02-14 09:42:43 +00003681
Guido van Rossumac7be682001-01-17 15:42:30 +00003682static void
Paul Prescode68140d2000-08-30 20:25:01 +00003683format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3684{
3685 char *obj_str;
3686
3687 if (!obj)
3688 return;
3689
3690 obj_str = PyString_AsString(obj);
3691 if (!obj_str)
3692 return;
3693
3694 PyErr_Format(exc, format_str, obj_str);
3695}
Guido van Rossum950361c1997-01-24 13:49:28 +00003696
3697#ifdef DYNAMIC_EXECUTION_PROFILE
3698
Skip Montanarof118cb12001-10-15 20:51:38 +00003699static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003700getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003701{
3702 int i;
3703 PyObject *l = PyList_New(256);
3704 if (l == NULL) return NULL;
3705 for (i = 0; i < 256; i++) {
3706 PyObject *x = PyInt_FromLong(a[i]);
3707 if (x == NULL) {
3708 Py_DECREF(l);
3709 return NULL;
3710 }
3711 PyList_SetItem(l, i, x);
3712 }
3713 for (i = 0; i < 256; i++)
3714 a[i] = 0;
3715 return l;
3716}
3717
3718PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003719_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003720{
3721#ifndef DXPAIRS
3722 return getarray(dxp);
3723#else
3724 int i;
3725 PyObject *l = PyList_New(257);
3726 if (l == NULL) return NULL;
3727 for (i = 0; i < 257; i++) {
3728 PyObject *x = getarray(dxpairs[i]);
3729 if (x == NULL) {
3730 Py_DECREF(l);
3731 return NULL;
3732 }
3733 PyList_SetItem(l, i, x);
3734 }
3735 return l;
3736#endif
3737}
3738
3739#endif