blob: 6def4229172c4da16a01d89a97e082eb278e73d1 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static PyObject *loop_subscript(PyObject *, PyObject *);
55static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
56static int assign_slice(PyObject *, PyObject *,
57 PyObject *, PyObject *);
58static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000059static PyObject *import_from(PyObject *, PyObject *);
60static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static PyObject *build_class(PyObject *, PyObject *, PyObject *);
62static int exec_statement(PyFrameObject *,
63 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
65static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000066static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Paul Prescode68140d2000-08-30 20:25:01 +000068#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000069 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000070#define GLOBAL_NAME_ERROR_MSG \
71 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000072#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000073 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000074#define UNBOUNDFREE_ERROR_MSG \
75 "free variable '%.200s' referenced before assignment" \
76 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Guido van Rossum950361c1997-01-24 13:49:28 +000078/* Dynamic execution profile */
79#ifdef DYNAMIC_EXECUTION_PROFILE
80#ifdef DXPAIRS
81static long dxpairs[257][256];
82#define dxp dxpairs[256]
83#else
84static long dxp[256];
85#endif
86#endif
87
Tim Peters5ca576e2001-06-18 22:08:13 +000088staticforward PyTypeObject gentype;
89
90typedef struct {
91 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000092 /* The gi_ prefix is intended to remind of generator-iterator. */
93
94 PyFrameObject *gi_frame;
95
Tim Peterse77f2e22001-06-26 22:24:51 +000096 /* True if generator is being executed. */
97 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000098} genobject;
99
100static PyObject *
101gen_new(PyFrameObject *f)
102{
103 genobject *gen = PyObject_New(genobject, &gentype);
104 if (gen == NULL) {
105 Py_DECREF(f);
106 return NULL;
107 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000108 gen->gi_frame = f;
109 gen->gi_running = 0;
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000110 PyObject_GC_Init(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000111 return (PyObject *)gen;
112}
113
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000114static int
115gen_traverse(genobject *gen, visitproc visit, void *arg)
116{
117 return visit((PyObject *)gen->gi_frame, arg);
118}
119
Tim Peters5ca576e2001-06-18 22:08:13 +0000120static void
121gen_dealloc(genobject *gen)
122{
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000123 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000124 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000125 PyObject_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000126}
127
128static PyObject *
129gen_iternext(genobject *gen)
130{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000131 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000133 PyObject *result;
134
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000135 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000136 PyErr_SetString(PyExc_ValueError,
137 "generator already executing");
138 return NULL;
139 }
Tim Peters8c963692001-06-23 05:26:56 +0000140 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000142
143 /* Generators always return to their most recent caller, not
144 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000145 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000146 assert(f->f_back == NULL);
147 f->f_back = tstate->frame;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000151 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000152
153 /* Don't keep the reference to f_back any longer than necessary. It
154 * may keep a chain of frames alive or it could create a reference
155 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000156 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000157 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000158
Tim Petersad1a18b2001-06-23 06:19:16 +0000159 /* If the generator just returned (as opposed to yielding), signal
160 * that the generator is exhausted. */
161 if (result == Py_None && f->f_stacktop == NULL) {
162 Py_DECREF(result);
163 result = NULL;
164 }
165
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000167}
168
169static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000170gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000171{
172 PyObject *result;
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000175
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000176 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000177 PyErr_SetObject(PyExc_StopIteration, Py_None);
178 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000179 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000180
181 return result;
182}
183
184static PyObject *
185gen_getiter(PyObject *gen)
186{
187 Py_INCREF(gen);
188 return gen;
189}
190
191static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000192 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000193 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 {NULL, NULL} /* Sentinel */
195};
196
Guido van Rossum6f799372001-09-20 20:46:19 +0000197static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000198 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
199 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
200 {NULL} /* Sentinel */
201};
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
203statichere PyTypeObject gentype = {
204 PyObject_HEAD_INIT(&PyType_Type)
205 0, /* ob_size */
206 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000207 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000208 0, /* tp_itemsize */
209 /* methods */
210 (destructor)gen_dealloc, /* tp_dealloc */
211 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_setattr */
214 0, /* tp_compare */
215 0, /* tp_repr */
216 0, /* tp_as_number */
217 0, /* tp_as_sequence */
218 0, /* tp_as_mapping */
219 0, /* tp_hash */
220 0, /* tp_call */
221 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000223 0, /* tp_setattro */
224 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000226 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000227 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000228 0, /* tp_clear */
229 0, /* tp_richcompare */
230 0, /* tp_weaklistoffset */
231 (getiterfunc)gen_getiter, /* tp_iter */
232 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000233 gen_methods, /* tp_methods */
234 gen_memberlist, /* tp_members */
235 0, /* tp_getset */
236 0, /* tp_base */
237 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000238};
239
240
Guido van Rossume59214e1994-08-30 08:01:59 +0000241#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000242
Guido van Rossum2571cc81999-04-07 16:07:23 +0000243#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000245#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000246#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248extern int _PyThread_Started; /* Flag for Py_Exit */
249
Guido van Rossum65d5b571998-12-21 19:32:43 +0000250static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252
253void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000257 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000259 interpreter_lock = PyThread_allocate_lock();
260 PyThread_acquire_lock(interpreter_lock, 1);
261 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000262}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000263
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000264void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268}
269
270void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274}
275
276void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000278{
279 if (tstate == NULL)
280 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282 if (PyThreadState_Swap(tstate) != NULL)
283 Py_FatalError(
284 "PyEval_AcquireThread: non-NULL old thread state");
285}
286
287void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000288PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289{
290 if (tstate == NULL)
291 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
292 if (PyThreadState_Swap(NULL) != tstate)
293 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000294 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000295}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000296
297/* This function is called from PyOS_AfterFork to ensure that newly
298 created child processes don't hold locks referring to threads which
299 are not running in the child process. (This could also be done using
300 pthread_atfork mechanism, at least for the pthreads implementation.) */
301
302void
303PyEval_ReInitThreads(void)
304{
305 if (!interpreter_lock)
306 return;
307 /*XXX Can't use PyThread_free_lock here because it does too
308 much error-checking. Doing this cleanly would require
309 adding a new function to each thread_*.h. Instead, just
310 create a new lock and waste a little bit of memory */
311 interpreter_lock = PyThread_allocate_lock();
312 PyThread_acquire_lock(interpreter_lock, 1);
313 main_thread = PyThread_get_thread_ident();
314}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315#endif
316
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317/* Functions save_thread and restore_thread are always defined so
318 dynamically loaded modules needn't be compiled separately for use
319 with and without threads: */
320
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000321PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 PyThreadState *tstate = PyThreadState_Swap(NULL);
325 if (tstate == NULL)
326 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000327#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000331 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332}
333
334void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000335PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000337 if (tstate == NULL)
338 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000339#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000341 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000342 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 }
345#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000346 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347}
348
349
Guido van Rossuma9672091994-09-14 13:31:22 +0000350/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
351 signal handlers or Mac I/O completion routines) can schedule calls
352 to a function to be called synchronously.
353 The synchronous function is called with one void* argument.
354 It should return 0 for success or -1 for failure -- failure should
355 be accompanied by an exception.
356
357 If registry succeeds, the registry function returns 0; if it fails
358 (e.g. due to too many pending calls) it returns -1 (without setting
359 an exception condition).
360
361 Note that because registry may occur from within signal handlers,
362 or other asynchronous events, calling malloc() is unsafe!
363
364#ifdef WITH_THREAD
365 Any thread can schedule pending calls, but only the main thread
366 will execute them.
367#endif
368
369 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
370 There are two possible race conditions:
371 (1) nested asynchronous registry calls;
372 (2) registry calls made while pending calls are being processed.
373 While (1) is very unlikely, (2) is a real possibility.
374 The current code is safe against (2), but not against (1).
375 The safety against (2) is derived from the fact that only one
376 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378 XXX Darn! With the advent of thread state, we should have an array
379 of pending calls per thread in the thread state! Later...
380*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000381
Guido van Rossuma9672091994-09-14 13:31:22 +0000382#define NPENDINGCALLS 32
383static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000384 int (*func)(void *);
385 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000386} pendingcalls[NPENDINGCALLS];
387static volatile int pendingfirst = 0;
388static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390
391int
Thomas Wouters334fb892000-07-25 12:56:38 +0000392Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000393{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000394 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 int i, j;
396 /* XXX Begin critical section */
397 /* XXX If you want this to be safe against nested
398 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000399 if (busy)
400 return -1;
401 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendinglast;
403 j = (i + 1) % NPENDINGCALLS;
404 if (j == pendingfirst)
405 return -1; /* Queue full */
406 pendingcalls[i].func = func;
407 pendingcalls[i].arg = arg;
408 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000409 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000410 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 /* XXX End critical section */
412 return 0;
413}
414
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000417{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000418 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000420 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000421 return 0;
422#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000423 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 return 0;
425 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 for (;;) {
428 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000429 int (*func)(void *);
430 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 i = pendingfirst;
432 if (i == pendinglast)
433 break; /* Queue empty */
434 func = pendingcalls[i].func;
435 arg = pendingcalls[i].arg;
436 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000437 if (func(arg) < 0) {
438 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000439 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000440 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000441 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 return 0;
445}
446
447
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000448/* The interpreter's recursion limit */
449
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000450static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000452int
453Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000454{
455 return recursion_limit;
456}
457
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000458void
459Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000460{
461 recursion_limit = new_limit;
462}
463
Guido van Rossum374a9221991-04-04 10:40:29 +0000464/* Status code for main loop (reason for stack unwind) */
465
466enum why_code {
467 WHY_NOT, /* No error */
468 WHY_EXCEPTION, /* Exception occurred */
469 WHY_RERAISE, /* Exception re-raised by 'finally' */
470 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000471 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000472 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000473 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000474};
475
Tim Petersdbd9ba62000-07-09 03:09:57 +0000476static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000477static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000478
Guido van Rossum374a9221991-04-04 10:40:29 +0000479
Guido van Rossumb209a111997-04-29 18:18:01 +0000480PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000481PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 (PyObject **)NULL, 0,
486 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000487 (PyObject **)NULL, 0,
488 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489}
490
491
492/* Interpreter main loop */
493
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000495eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000496{
Guido van Rossum950361c1997-01-24 13:49:28 +0000497#ifdef DXPAIRS
498 int lastopcode = 0;
499#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000500 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000501 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000502 register int opcode=0; /* Current opcode */
503 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000504 register enum why_code why; /* Reason for block stack unwind */
505 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000506 register PyObject *x; /* Result object -- NULL if error */
507 register PyObject *v; /* Temporary objects popped off stack */
508 register PyObject *w;
509 register PyObject *u;
510 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000511 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000512 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000513 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000514 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000515 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000518 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000520#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000522 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000523#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000524
525/* Code access macros */
526
527#define GETCONST(i) Getconst(f, i)
528#define GETNAME(i) Getname(f, i)
529#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000530#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000531#define NEXTOP() (*next_instr++)
532#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000533#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#define JUMPBY(x) (next_instr += (x))
535
536/* Stack manipulation macros */
537
538#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
539#define EMPTY() (STACK_LEVEL() == 0)
540#define TOP() (stack_pointer[-1])
541#define BASIC_PUSH(v) (*stack_pointer++ = (v))
542#define BASIC_POP() (*--stack_pointer)
543
Guido van Rossum96a42c81992-01-12 02:29:51 +0000544#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000545#define PUSH(v) { (void)(BASIC_PUSH(v), \
546 lltrace && prtrace(TOP(), "push")); \
547 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000548#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000549#else
550#define PUSH(v) BASIC_PUSH(v)
551#define POP() BASIC_POP()
552#endif
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000557#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 GETLOCAL(i) = value; } while (0)
559
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560/* Start of code */
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 if (f == NULL)
563 return NULL;
564
Guido van Rossum8861b741996-07-30 16:49:37 +0000565#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000567 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570#endif
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000573 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000576 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000577 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 co = f->f_code;
583 fastlocals = f->f_localsplus;
584 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000585 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000587 stack_pointer = f->f_stacktop;
588 assert(stack_pointer != NULL);
589 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000590
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000591 if (tstate->use_tracing) {
592 if (tstate->c_tracefunc != NULL) {
593 /* tstate->c_tracefunc, if defined, is a
594 function that will be called on *every* entry
595 to a code block. Its return value, if not
596 None, is a function that will be called at
597 the start of each executed line of code.
598 (Actually, the function must return itself
599 in order to continue tracing.) The trace
600 functions are called with three arguments:
601 a pointer to the current frame, a string
602 indicating why the function is called, and
603 an argument which depends on the situation.
604 The global trace function is also called
605 whenever an exception is detected. */
606 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
607 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000608 /* Trace function raised an error */
609 return NULL;
610 }
611 }
612 if (tstate->c_profilefunc != NULL) {
613 /* Similar for c_profilefunc, except it needn't
614 return itself and isn't called for "line" events */
615 if (call_trace(tstate->c_profilefunc,
616 tstate->c_profileobj,
617 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000618 /* Profile function raised an error */
619 return NULL;
620 }
621 }
622 }
623
Tim Peters5ca576e2001-06-18 22:08:13 +0000624#ifdef LLTRACE
625 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
626#endif
627#if defined(Py_DEBUG) || defined(LLTRACE)
628 filename = PyString_AsString(co->co_filename);
629#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000630
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 why = WHY_NOT;
632 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000633 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000634 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000637 /* Do periodic things. Doing this every time through
638 the loop would add too much overhead, so we do it
639 only every Nth instruction. We also do it if
640 ``things_to_do'' is set, i.e. when an asynchronous
641 event needs attention (e.g. a signal handler or
642 async I/O handler); see Py_AddPendingCall() and
643 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000644
Guido van Rossuma027efa1997-05-05 20:56:21 +0000645 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000646 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000648 if (Py_MakePendingCalls() < 0) {
649 why = WHY_EXCEPTION;
650 goto on_error;
651 }
652 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000653#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000654 /* If we have true signals, the signal handler
655 will call Py_AddPendingCall() so we don't
656 have to call sigcheck(). On the Mac and
657 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000658 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 goto on_error;
661 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000662#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663
Guido van Rossume59214e1994-08-30 08:01:59 +0000664#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665 if (interpreter_lock) {
666 /* Give another thread a chance */
667
Guido van Rossum25ce5661997-08-02 03:10:38 +0000668 if (PyThreadState_Swap(NULL) != tstate)
669 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000670 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671
672 /* Other threads may run now */
673
Guido van Rossum65d5b571998-12-21 19:32:43 +0000674 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000675 if (PyThreadState_Swap(tstate) != NULL)
676 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 }
678#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000682
Guido van Rossum408027e1996-12-30 16:17:54 +0000683#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000684 f->f_lasti = INSTR_OFFSET();
685#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000686
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 opcode = NEXTOP();
688 if (HAS_ARG(opcode))
689 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000690 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000691#ifdef DYNAMIC_EXECUTION_PROFILE
692#ifdef DXPAIRS
693 dxpairs[lastopcode][opcode]++;
694 lastopcode = opcode;
695#endif
696 dxp[opcode]++;
697#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000698
Guido van Rossum96a42c81992-01-12 02:29:51 +0000699#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000701
Guido van Rossum96a42c81992-01-12 02:29:51 +0000702 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 if (HAS_ARG(opcode)) {
704 printf("%d: %d, %d\n",
705 (int) (INSTR_OFFSET() - 3),
706 opcode, oparg);
707 }
708 else {
709 printf("%d: %d\n",
710 (int) (INSTR_OFFSET() - 1), opcode);
711 }
712 }
713#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000717
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 /* BEWARE!
719 It is essential that any operation that fails sets either
720 x to NULL, err to nonzero, or why to anything but WHY_NOT,
721 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000724
Guido van Rossum374a9221991-04-04 10:40:29 +0000725 case POP_TOP:
726 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000727 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000728 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000729
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 case ROT_TWO:
731 v = POP();
732 w = POP();
733 PUSH(v);
734 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000735 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000736
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 case ROT_THREE:
738 v = POP();
739 w = POP();
740 x = POP();
741 PUSH(v);
742 PUSH(x);
743 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000744 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000745
Thomas Wouters434d0822000-08-24 20:11:32 +0000746 case ROT_FOUR:
747 u = POP();
748 v = POP();
749 w = POP();
750 x = POP();
751 PUSH(u);
752 PUSH(x);
753 PUSH(w);
754 PUSH(v);
755 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000756
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 case DUP_TOP:
758 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000759 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000761 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000762
Thomas Wouters434d0822000-08-24 20:11:32 +0000763 case DUP_TOPX:
764 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000765 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000766 x = TOP();
767 Py_INCREF(x);
768 PUSH(x);
769 continue;
770 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000771 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000772 Py_INCREF(x);
773 w = TOP();
774 Py_INCREF(w);
775 PUSH(x);
776 PUSH(w);
777 PUSH(x);
778 continue;
779 case 3:
780 x = POP();
781 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000782 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000783 Py_INCREF(w);
784 v = TOP();
785 Py_INCREF(v);
786 PUSH(w);
787 PUSH(x);
788 PUSH(v);
789 PUSH(w);
790 PUSH(x);
791 continue;
792 case 4:
793 x = POP();
794 Py_INCREF(x);
795 w = POP();
796 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000797 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000798 Py_INCREF(v);
799 u = TOP();
800 Py_INCREF(u);
801 PUSH(v);
802 PUSH(w);
803 PUSH(x);
804 PUSH(u);
805 PUSH(v);
806 PUSH(w);
807 PUSH(x);
808 continue;
809 case 5:
810 x = POP();
811 Py_INCREF(x);
812 w = POP();
813 Py_INCREF(w);
814 v = POP();
815 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000816 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000817 Py_INCREF(u);
818 t = TOP();
819 Py_INCREF(t);
820 PUSH(u);
821 PUSH(v);
822 PUSH(w);
823 PUSH(x);
824 PUSH(t);
825 PUSH(u);
826 PUSH(v);
827 PUSH(w);
828 PUSH(x);
829 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000830 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000831 Py_FatalError("invalid argument to DUP_TOPX"
832 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000833 }
Tim Peters35ba6892000-10-11 07:04:49 +0000834 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case UNARY_POSITIVE:
837 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000838 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000839 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000841 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000843
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 case UNARY_NEGATIVE:
845 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000851
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 case UNARY_NOT:
853 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000855 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 if (err == 0) {
857 Py_INCREF(Py_True);
858 PUSH(Py_True);
859 continue;
860 }
861 else if (err > 0) {
862 Py_INCREF(Py_False);
863 PUSH(Py_False);
864 err = 0;
865 continue;
866 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000868
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 case UNARY_CONVERT:
870 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000871 x = PyObject_Repr(v);
872 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000874 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000876
Guido van Rossum7928cd71991-10-24 14:59:31 +0000877 case UNARY_INVERT:
878 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000879 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000880 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000882 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000884
Guido van Rossum50564e81996-01-12 01:13:16 +0000885 case BINARY_POWER:
886 w = POP();
887 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000888 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000889 Py_DECREF(v);
890 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000891 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000893 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000894
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 case BINARY_MULTIPLY:
896 w = POP();
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
900 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000904
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000906 if (!_Py_QnewFlag) {
907 w = POP();
908 v = POP();
909 x = PyNumber_Divide(v, w);
910 Py_DECREF(v);
911 Py_DECREF(w);
912 PUSH(x);
913 if (x != NULL) continue;
914 break;
915 }
916 /* -Qnew is in effect: fall through to
917 BINARY_TRUE_DIVIDE */
918 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 w = POP();
920 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000921 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000922 Py_DECREF(v);
923 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000925 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000927
Guido van Rossum4668b002001-08-08 05:00:18 +0000928 case BINARY_FLOOR_DIVIDE:
929 w = POP();
930 v = POP();
931 x = PyNumber_FloorDivide(v, w);
932 Py_DECREF(v);
933 Py_DECREF(w);
934 PUSH(x);
935 if (x != NULL) continue;
936 break;
937
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 case BINARY_MODULO:
939 w = POP();
940 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000941 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_ADD:
949 w = POP();
950 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000951 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000952 /* INLINE: int + int */
953 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000954 a = PyInt_AS_LONG(v);
955 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000956 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000957 if ((i^a) < 0 && (i^b) < 0)
958 goto slow_add;
959 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000960 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000961 else {
962 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000963 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000964 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000965 Py_DECREF(v);
966 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000968 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000970
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 case BINARY_SUBTRACT:
972 w = POP();
973 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000974 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 /* INLINE: int - int */
976 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000977 a = PyInt_AS_LONG(v);
978 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000979 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000980 if ((i^a) < 0 && (i^~b) < 0)
981 goto slow_sub;
982 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000983 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000984 else {
985 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000986 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000987 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(v);
989 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000991 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000993
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 case BINARY_SUBSCR:
995 w = POP();
996 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +0000997 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000998 /* INLINE: list[int] */
999 long i = PyInt_AsLong(w);
1000 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001001 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001002 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001003 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001004 PyErr_SetString(PyExc_IndexError,
1005 "list index out of range");
1006 x = NULL;
1007 }
1008 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001009 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001010 Py_INCREF(x);
1011 }
1012 }
1013 else
1014 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001015 Py_DECREF(v);
1016 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001018 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001020
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 case BINARY_LSHIFT:
1022 w = POP();
1023 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001024 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 Py_DECREF(v);
1026 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001028 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001030
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 case BINARY_RSHIFT:
1032 w = POP();
1033 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001034 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 Py_DECREF(v);
1036 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001037 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001038 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001040
Guido van Rossum7928cd71991-10-24 14:59:31 +00001041 case BINARY_AND:
1042 w = POP();
1043 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001044 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001045 Py_DECREF(v);
1046 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001047 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001048 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001050
Guido van Rossum7928cd71991-10-24 14:59:31 +00001051 case BINARY_XOR:
1052 w = POP();
1053 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001054 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001055 Py_DECREF(v);
1056 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001057 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001058 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001059 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001060
Guido van Rossum7928cd71991-10-24 14:59:31 +00001061 case BINARY_OR:
1062 w = POP();
1063 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001064 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001065 Py_DECREF(v);
1066 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001067 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001068 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001069 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001070
1071 case INPLACE_POWER:
1072 w = POP();
1073 v = POP();
1074 x = PyNumber_InPlacePower(v, w, Py_None);
1075 Py_DECREF(v);
1076 Py_DECREF(w);
1077 PUSH(x);
1078 if (x != NULL) continue;
1079 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001080
Thomas Wouters434d0822000-08-24 20:11:32 +00001081 case INPLACE_MULTIPLY:
1082 w = POP();
1083 v = POP();
1084 x = PyNumber_InPlaceMultiply(v, w);
1085 Py_DECREF(v);
1086 Py_DECREF(w);
1087 PUSH(x);
1088 if (x != NULL) continue;
1089 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001090
Thomas Wouters434d0822000-08-24 20:11:32 +00001091 case INPLACE_DIVIDE:
1092 w = POP();
1093 v = POP();
1094 x = PyNumber_InPlaceDivide(v, w);
1095 Py_DECREF(v);
1096 Py_DECREF(w);
1097 PUSH(x);
1098 if (x != NULL) continue;
1099 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001100
Guido van Rossum4668b002001-08-08 05:00:18 +00001101 case INPLACE_FLOOR_DIVIDE:
1102 w = POP();
1103 v = POP();
1104 x = PyNumber_InPlaceFloorDivide(v, w);
1105 Py_DECREF(v);
1106 Py_DECREF(w);
1107 PUSH(x);
1108 if (x != NULL) continue;
1109 break;
1110
1111 case INPLACE_TRUE_DIVIDE:
1112 w = POP();
1113 v = POP();
1114 x = PyNumber_InPlaceTrueDivide(v, w);
1115 Py_DECREF(v);
1116 Py_DECREF(w);
1117 PUSH(x);
1118 if (x != NULL) continue;
1119 break;
1120
Thomas Wouters434d0822000-08-24 20:11:32 +00001121 case INPLACE_MODULO:
1122 w = POP();
1123 v = POP();
1124 x = PyNumber_InPlaceRemainder(v, w);
1125 Py_DECREF(v);
1126 Py_DECREF(w);
1127 PUSH(x);
1128 if (x != NULL) continue;
1129 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001130
Thomas Wouters434d0822000-08-24 20:11:32 +00001131 case INPLACE_ADD:
1132 w = POP();
1133 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001134 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 /* INLINE: int + int */
1136 register long a, b, i;
1137 a = PyInt_AS_LONG(v);
1138 b = PyInt_AS_LONG(w);
1139 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001140 if ((i^a) < 0 && (i^b) < 0)
1141 goto slow_iadd;
1142 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001143 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001144 else {
1145 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001146 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001147 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 Py_DECREF(v);
1149 Py_DECREF(w);
1150 PUSH(x);
1151 if (x != NULL) continue;
1152 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001153
Thomas Wouters434d0822000-08-24 20:11:32 +00001154 case INPLACE_SUBTRACT:
1155 w = POP();
1156 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001157 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001158 /* INLINE: int - int */
1159 register long a, b, i;
1160 a = PyInt_AS_LONG(v);
1161 b = PyInt_AS_LONG(w);
1162 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001163 if ((i^a) < 0 && (i^~b) < 0)
1164 goto slow_isub;
1165 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001166 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001167 else {
1168 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001169 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001170 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001171 Py_DECREF(v);
1172 Py_DECREF(w);
1173 PUSH(x);
1174 if (x != NULL) continue;
1175 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001176
Thomas Wouters434d0822000-08-24 20:11:32 +00001177 case INPLACE_LSHIFT:
1178 w = POP();
1179 v = POP();
1180 x = PyNumber_InPlaceLshift(v, w);
1181 Py_DECREF(v);
1182 Py_DECREF(w);
1183 PUSH(x);
1184 if (x != NULL) continue;
1185 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001186
Thomas Wouters434d0822000-08-24 20:11:32 +00001187 case INPLACE_RSHIFT:
1188 w = POP();
1189 v = POP();
1190 x = PyNumber_InPlaceRshift(v, w);
1191 Py_DECREF(v);
1192 Py_DECREF(w);
1193 PUSH(x);
1194 if (x != NULL) continue;
1195 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001196
Thomas Wouters434d0822000-08-24 20:11:32 +00001197 case INPLACE_AND:
1198 w = POP();
1199 v = POP();
1200 x = PyNumber_InPlaceAnd(v, w);
1201 Py_DECREF(v);
1202 Py_DECREF(w);
1203 PUSH(x);
1204 if (x != NULL) continue;
1205 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001206
Thomas Wouters434d0822000-08-24 20:11:32 +00001207 case INPLACE_XOR:
1208 w = POP();
1209 v = POP();
1210 x = PyNumber_InPlaceXor(v, w);
1211 Py_DECREF(v);
1212 Py_DECREF(w);
1213 PUSH(x);
1214 if (x != NULL) continue;
1215 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001216
Thomas Wouters434d0822000-08-24 20:11:32 +00001217 case INPLACE_OR:
1218 w = POP();
1219 v = POP();
1220 x = PyNumber_InPlaceOr(v, w);
1221 Py_DECREF(v);
1222 Py_DECREF(w);
1223 PUSH(x);
1224 if (x != NULL) continue;
1225 break;
1226
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 case SLICE+0:
1228 case SLICE+1:
1229 case SLICE+2:
1230 case SLICE+3:
1231 if ((opcode-SLICE) & 2)
1232 w = POP();
1233 else
1234 w = NULL;
1235 if ((opcode-SLICE) & 1)
1236 v = POP();
1237 else
1238 v = NULL;
1239 u = POP();
1240 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001241 Py_DECREF(u);
1242 Py_XDECREF(v);
1243 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001245 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001247
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 case STORE_SLICE+0:
1249 case STORE_SLICE+1:
1250 case STORE_SLICE+2:
1251 case STORE_SLICE+3:
1252 if ((opcode-STORE_SLICE) & 2)
1253 w = POP();
1254 else
1255 w = NULL;
1256 if ((opcode-STORE_SLICE) & 1)
1257 v = POP();
1258 else
1259 v = NULL;
1260 u = POP();
1261 t = POP();
1262 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_DECREF(t);
1264 Py_DECREF(u);
1265 Py_XDECREF(v);
1266 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001267 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001269
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 case DELETE_SLICE+0:
1271 case DELETE_SLICE+1:
1272 case DELETE_SLICE+2:
1273 case DELETE_SLICE+3:
1274 if ((opcode-DELETE_SLICE) & 2)
1275 w = POP();
1276 else
1277 w = NULL;
1278 if ((opcode-DELETE_SLICE) & 1)
1279 v = POP();
1280 else
1281 v = NULL;
1282 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001283 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 Py_DECREF(u);
1286 Py_XDECREF(v);
1287 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001288 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001290
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 case STORE_SUBSCR:
1292 w = POP();
1293 v = POP();
1294 u = POP();
1295 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001296 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 Py_DECREF(u);
1298 Py_DECREF(v);
1299 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001300 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001302
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 case DELETE_SUBSCR:
1304 w = POP();
1305 v = POP();
1306 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001307 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001308 Py_DECREF(v);
1309 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001310 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001312
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 case PRINT_EXPR:
1314 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001315 w = PySys_GetObject("displayhook");
1316 if (w == NULL) {
1317 PyErr_SetString(PyExc_RuntimeError,
1318 "lost sys.displayhook");
1319 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001320 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001321 }
1322 if (err == 0) {
1323 x = Py_BuildValue("(O)", v);
1324 if (x == NULL)
1325 err = -1;
1326 }
1327 if (err == 0) {
1328 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001329 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001330 if (w == NULL)
1331 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001333 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001334 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001336
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001337 case PRINT_ITEM_TO:
1338 w = stream = POP();
1339 /* fall through to PRINT_ITEM */
1340
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 case PRINT_ITEM:
1342 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001343 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001344 w = PySys_GetObject("stdout");
1345 if (w == NULL) {
1346 PyErr_SetString(PyExc_RuntimeError,
1347 "lost sys.stdout");
1348 err = -1;
1349 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001350 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001351 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001352 err = PyFile_WriteString(" ", w);
1353 if (err == 0)
1354 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001355 if (err == 0) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001356 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001357 if (PyString_Check(v)) {
1358 char *s = PyString_AS_STRING(v);
1359 int len = PyString_GET_SIZE(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001360 if (len > 0 &&
1361 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001362 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 PyFile_SoftSpace(w, 0);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001364 }
1365 else if (PyUnicode_Check(v)) {
1366 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1367 int len = PyUnicode_GET_SIZE(v);
1368 if (len > 0 &&
1369 Py_UNICODE_ISSPACE(s[len-1]) &&
1370 s[len-1] != ' ')
1371 PyFile_SoftSpace(w, 0);
1372 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001374 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001375 Py_XDECREF(stream);
1376 stream = NULL;
1377 if (err == 0)
1378 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001380
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001381 case PRINT_NEWLINE_TO:
1382 w = stream = POP();
1383 /* fall through to PRINT_NEWLINE */
1384
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001386 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001387 w = PySys_GetObject("stdout");
1388 if (w == NULL)
1389 PyErr_SetString(PyExc_RuntimeError,
1390 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001391 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001392 if (w != NULL) {
1393 err = PyFile_WriteString("\n", w);
1394 if (err == 0)
1395 PyFile_SoftSpace(w, 0);
1396 }
1397 Py_XDECREF(stream);
1398 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001400
Thomas Wouters434d0822000-08-24 20:11:32 +00001401
1402#ifdef CASE_TOO_BIG
1403 default: switch (opcode) {
1404#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 case BREAK_LOOP:
1406 why = WHY_BREAK;
1407 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001408
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001409 case CONTINUE_LOOP:
1410 retval = PyInt_FromLong(oparg);
1411 why = WHY_CONTINUE;
1412 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001413
Guido van Rossumf10570b1995-07-07 22:53:21 +00001414 case RAISE_VARARGS:
1415 u = v = w = NULL;
1416 switch (oparg) {
1417 case 3:
1418 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001419 /* Fallthrough */
1420 case 2:
1421 v = POP(); /* value */
1422 /* Fallthrough */
1423 case 1:
1424 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001425 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001426 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001427 break;
1428 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001429 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001430 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001431 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001432 break;
1433 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001435
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001438 PyErr_SetString(PyExc_SystemError,
1439 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 break;
1441 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001442 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001443 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001445
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 case RETURN_VALUE:
1447 retval = POP();
1448 why = WHY_RETURN;
1449 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001450
Tim Peters5ca576e2001-06-18 22:08:13 +00001451 case YIELD_VALUE:
1452 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001453 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001454 f->f_lasti = INSTR_OFFSET();
1455 why = WHY_YIELD;
1456 break;
1457
1458
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001459 case EXEC_STMT:
1460 w = POP();
1461 v = POP();
1462 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001463 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001464 Py_DECREF(u);
1465 Py_DECREF(v);
1466 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001467 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001468
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 case POP_BLOCK:
1470 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001471 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 while (STACK_LEVEL() > b->b_level) {
1473 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 }
1476 }
1477 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001478
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 case END_FINALLY:
1480 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 if (PyInt_Check(v)) {
1482 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001483 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001484 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001485 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 retval = POP();
1487 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001490 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001493 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 else if (v != Py_None) {
1496 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 "'finally' pops bad exception");
1498 why = WHY_EXCEPTION;
1499 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001500 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001502
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001504 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001506 w = POP();
1507 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 Py_DECREF(u);
1510 Py_DECREF(v);
1511 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001513
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 case STORE_NAME:
1515 w = GETNAMEV(oparg);
1516 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001517 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001518 PyErr_Format(PyExc_SystemError,
1519 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001520 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001521 break;
1522 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001523 err = PyDict_SetItem(x, w, v);
1524 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001526
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001528 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001529 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001530 PyErr_Format(PyExc_SystemError,
1531 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001532 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001533 break;
1534 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001535 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001536 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001537 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001539
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001540 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001542 if (PyTuple_Check(v)) {
1543 if (PyTuple_Size(v) != oparg) {
1544 PyErr_SetString(PyExc_ValueError,
1545 "unpack tuple of wrong size");
1546 why = WHY_EXCEPTION;
1547 }
1548 else {
1549 for (; --oparg >= 0; ) {
1550 w = PyTuple_GET_ITEM(v, oparg);
1551 Py_INCREF(w);
1552 PUSH(w);
1553 }
1554 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001556 else if (PyList_Check(v)) {
1557 if (PyList_Size(v) != oparg) {
1558 PyErr_SetString(PyExc_ValueError,
1559 "unpack list of wrong size");
1560 why = WHY_EXCEPTION;
1561 }
1562 else {
1563 for (; --oparg >= 0; ) {
1564 w = PyList_GET_ITEM(v, oparg);
1565 Py_INCREF(w);
1566 PUSH(w);
1567 }
1568 }
1569 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001570 else if (unpack_iterable(v, oparg,
1571 stack_pointer + oparg))
1572 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001573 else {
1574 if (PyErr_ExceptionMatches(PyExc_TypeError))
1575 PyErr_SetString(PyExc_TypeError,
1576 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001577 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001578 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001581
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001583 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 v = POP();
1585 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1587 Py_DECREF(v);
1588 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001590
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001592 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001594 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1595 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001598
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001599 case STORE_GLOBAL:
1600 w = GETNAMEV(oparg);
1601 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 err = PyDict_SetItem(f->f_globals, w, v);
1603 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001604 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001605
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001606 case DELETE_GLOBAL:
1607 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001608 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001609 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001610 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001611 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001612
Guido van Rossum374a9221991-04-04 10:40:29 +00001613 case LOAD_CONST:
1614 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001615 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 PUSH(x);
1617 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001618
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001620 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001622 PyErr_Format(PyExc_SystemError,
1623 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001624 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001625 break;
1626 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001627 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001629 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001633 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001634 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001635 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001636 break;
1637 }
1638 }
1639 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001640 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 PUSH(x);
1642 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001643
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001645 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001647 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001648 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001650 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001651 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001652 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 break;
1654 }
1655 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 PUSH(x);
1658 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001659
Guido van Rossum9bfef441993-03-29 10:43:31 +00001660 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001662 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001663 format_exc_check_arg(
1664 PyExc_UnboundLocalError,
1665 UNBOUNDLOCAL_ERROR_MSG,
1666 PyTuple_GetItem(co->co_varnames, oparg)
1667 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001668 break;
1669 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001670 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001671 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001672 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001673 break;
1674
1675 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001676 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001677 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001678 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001679
1680 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001681 x = GETLOCAL(oparg);
1682 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001683 format_exc_check_arg(
1684 PyExc_UnboundLocalError,
1685 UNBOUNDLOCAL_ERROR_MSG,
1686 PyTuple_GetItem(co->co_varnames, oparg)
1687 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001688 break;
1689 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001690 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001691 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001692
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001693 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001694 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001695 Py_INCREF(x);
1696 PUSH(x);
1697 break;
1698
1699 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001700 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001701 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001702 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001703 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001704 v = PyTuple_GetItem(co->co_cellvars,
1705 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001706 format_exc_check_arg(
1707 PyExc_UnboundLocalError,
1708 UNBOUNDLOCAL_ERROR_MSG,
1709 v);
1710 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001711 v = PyTuple_GetItem(
1712 co->co_freevars,
1713 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001714 format_exc_check_arg(
1715 PyExc_NameError,
1716 UNBOUNDFREE_ERROR_MSG,
1717 v);
1718 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001719 err = -1;
1720 break;
1721 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001722 PUSH(w);
1723 break;
1724
1725 case STORE_DEREF:
1726 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001727 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001728 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001729 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001730 continue;
1731
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 if (x != NULL) {
1735 for (; --oparg >= 0;) {
1736 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001737 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 }
1739 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001740 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 }
1742 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001743
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001745 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 if (x != NULL) {
1747 for (; --oparg >= 0;) {
1748 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001749 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 }
1751 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001752 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 }
1754 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001755
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001757 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001759 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001761
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001763 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 x = PyObject_GetAttr(v, w);
1766 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001768 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001770
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 case COMPARE_OP:
1772 w = POP();
1773 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001774 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001775 /* INLINE: cmp(int, int) */
1776 register long a, b;
1777 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001778 a = PyInt_AS_LONG(v);
1779 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001780 switch (oparg) {
1781 case LT: res = a < b; break;
1782 case LE: res = a <= b; break;
1783 case EQ: res = a == b; break;
1784 case NE: res = a != b; break;
1785 case GT: res = a > b; break;
1786 case GE: res = a >= b; break;
1787 case IS: res = v == w; break;
1788 case IS_NOT: res = v != w; break;
1789 default: goto slow_compare;
1790 }
1791 x = res ? Py_True : Py_False;
1792 Py_INCREF(x);
1793 }
1794 else {
1795 slow_compare:
1796 x = cmp_outcome(oparg, v, w);
1797 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001798 Py_DECREF(v);
1799 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001801 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001803
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001805 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001806 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001809 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001810 break;
1811 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001812 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001813 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001814 w,
1815 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001816 f->f_locals == NULL ?
1817 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001818 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001819 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001820 if (w == NULL) {
1821 x = NULL;
1822 break;
1823 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 x = PyEval_CallObject(x, w);
1825 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001826 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001827 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001828 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001829
Thomas Wouters52152252000-08-17 22:55:00 +00001830 case IMPORT_STAR:
1831 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001832 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001833 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001834 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001835 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001836 break;
1837 }
Thomas Wouters52152252000-08-17 22:55:00 +00001838 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001839 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001840 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001841 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001843
Thomas Wouters52152252000-08-17 22:55:00 +00001844 case IMPORT_FROM:
1845 w = GETNAMEV(oparg);
1846 v = TOP();
1847 x = import_from(v, w);
1848 PUSH(x);
1849 if (x != NULL) continue;
1850 break;
1851
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 case JUMP_FORWARD:
1853 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001854 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001855
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001857 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001858 if (err > 0)
1859 err = 0;
1860 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001861 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001862 else
1863 break;
1864 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001865
Guido van Rossum374a9221991-04-04 10:40:29 +00001866 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001867 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001868 if (err > 0) {
1869 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001870 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001871 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001872 else if (err == 0)
1873 ;
1874 else
1875 break;
1876 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001877
Guido van Rossum374a9221991-04-04 10:40:29 +00001878 case JUMP_ABSOLUTE:
1879 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001880 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001881
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001882 case GET_ITER:
1883 /* before: [obj]; after [getiter(obj)] */
1884 v = POP();
1885 x = PyObject_GetIter(v);
1886 Py_DECREF(v);
1887 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001888 PUSH(x);
1889 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001890 }
1891 break;
1892
1893 case FOR_ITER:
1894 /* before: [iter]; after: [iter, iter()] *or* [] */
1895 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001896 x = PyIter_Next(v);
1897 if (x != NULL) {
1898 PUSH(x);
1899 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001900 }
Tim Petersf4848da2001-05-05 00:14:56 +00001901 if (!PyErr_Occurred()) {
1902 /* iterator ended normally */
1903 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001904 Py_DECREF(v);
1905 JUMPBY(oparg);
1906 continue;
1907 }
1908 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001909
Guido van Rossum374a9221991-04-04 10:40:29 +00001910 case FOR_LOOP:
1911 /* for v in s: ...
1912 On entry: stack contains s, i.
1913 On exit: stack contains s, i+1, s[i];
1914 but if loop exhausted:
1915 s, i are popped, and we jump */
1916 w = POP(); /* Loop index */
1917 v = POP(); /* Sequence object */
1918 u = loop_subscript(v, w);
1919 if (u != NULL) {
1920 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001921 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001922 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001923 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001924 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001925 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001926 }
1927 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001928 Py_DECREF(v);
1929 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001930 /* A NULL can mean "s exhausted"
1931 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001932 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001934 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001936 continue;
1937 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001938 }
1939 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001940
Guido van Rossum374a9221991-04-04 10:40:29 +00001941 case SETUP_LOOP:
1942 case SETUP_EXCEPT:
1943 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001944 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001945 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001946 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001947
Guido van Rossum374a9221991-04-04 10:40:29 +00001948 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001949#ifdef LLTRACE
1950 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001952#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001953 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001954 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001955 continue;
1956 /* Trace each line of code reached */
1957 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001958 /* Inline call_trace() for performance: */
1959 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001960 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001961 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1962 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001963 tstate->use_tracing = (tstate->c_tracefunc
1964 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001965 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001966 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001967
1968 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001969 {
1970 int na = oparg & 0xff;
1971 int nk = (oparg>>8) & 0xff;
1972 int n = na + 2 * nk;
1973 PyObject **pfunc = stack_pointer - n - 1;
1974 PyObject *func = *pfunc;
1975 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1976
1977 /* Always dispatch PyCFunction first, because
1978 these are presumed to be the most frequent
1979 callable object.
1980 */
1981 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001982 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001983 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001984 x = do_call(func, &stack_pointer,
1985 na, nk);
1986 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001987 PyObject *callargs;
1988 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001989 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001990 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001991 } else
1992 x = fast_cfunction(func,
1993 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001994 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001995 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 && PyMethod_GET_SELF(func) != NULL) {
1997 /* optimize access to bound methods */
1998 PyObject *self = PyMethod_GET_SELF(func);
1999 Py_INCREF(self);
2000 func = PyMethod_GET_FUNCTION(func);
2001 Py_INCREF(func);
2002 Py_DECREF(*pfunc);
2003 *pfunc = self;
2004 na++;
2005 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002006 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002007 Py_INCREF(func);
2008 if (PyFunction_Check(func)) {
2009 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002010 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 } else {
2012 x = do_call(func, &stack_pointer,
2013 na, nk);
2014 }
2015 Py_DECREF(func);
2016 }
2017
2018 while (stack_pointer > pfunc) {
2019 w = POP();
2020 Py_DECREF(w);
2021 }
2022 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002023 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002024 continue;
2025 break;
2026 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002027
Jeremy Hylton76901512000-03-28 23:49:17 +00002028 case CALL_FUNCTION_VAR:
2029 case CALL_FUNCTION_KW:
2030 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002031 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002032 int na = oparg & 0xff;
2033 int nk = (oparg>>8) & 0xff;
2034 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002035 int n = na + 2 * nk;
2036 PyObject **pfunc, *func;
2037 if (flags & CALL_FLAG_VAR)
2038 n++;
2039 if (flags & CALL_FLAG_KW)
2040 n++;
2041 pfunc = stack_pointer - n - 1;
2042 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002043 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002044
Guido van Rossumac7be682001-01-17 15:42:30 +00002045 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002046 && PyMethod_GET_SELF(func) != NULL) {
2047 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002048 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002049 func = PyMethod_GET_FUNCTION(func);
2050 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002051 Py_DECREF(*pfunc);
2052 *pfunc = self;
2053 na++;
2054 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002055 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002056 Py_INCREF(func);
2057 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002058 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002059
Jeremy Hylton76901512000-03-28 23:49:17 +00002060 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002061 w = POP();
2062 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002063 }
2064 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002065 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002066 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002067 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002068 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002069
Guido van Rossum681d79a1995-07-18 14:51:37 +00002070 case MAKE_FUNCTION:
2071 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 x = PyFunction_New(v, f->f_globals);
2073 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 /* XXX Maybe this should be a separate opcode? */
2075 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002076 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002077 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002078 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002079 x = NULL;
2080 break;
2081 }
2082 while (--oparg >= 0) {
2083 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002084 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002085 }
2086 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002088 }
2089 PUSH(x);
2090 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002091
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002092 case MAKE_CLOSURE:
2093 {
2094 int nfree;
2095 v = POP(); /* code object */
2096 x = PyFunction_New(v, f->f_globals);
2097 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2098 Py_DECREF(v);
2099 /* XXX Maybe this should be a separate opcode? */
2100 if (x != NULL && nfree > 0) {
2101 v = PyTuple_New(nfree);
2102 if (v == NULL) {
2103 Py_DECREF(x);
2104 x = NULL;
2105 break;
2106 }
2107 while (--nfree >= 0) {
2108 w = POP();
2109 PyTuple_SET_ITEM(v, nfree, w);
2110 }
2111 err = PyFunction_SetClosure(x, v);
2112 Py_DECREF(v);
2113 }
2114 if (x != NULL && oparg > 0) {
2115 v = PyTuple_New(oparg);
2116 if (v == NULL) {
2117 Py_DECREF(x);
2118 x = NULL;
2119 break;
2120 }
2121 while (--oparg >= 0) {
2122 w = POP();
2123 PyTuple_SET_ITEM(v, oparg, w);
2124 }
2125 err = PyFunction_SetDefaults(x, v);
2126 Py_DECREF(v);
2127 }
2128 PUSH(x);
2129 break;
2130 }
2131
Guido van Rossum8861b741996-07-30 16:49:37 +00002132 case BUILD_SLICE:
2133 if (oparg == 3)
2134 w = POP();
2135 else
2136 w = NULL;
2137 v = POP();
2138 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002139 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 Py_DECREF(u);
2141 Py_DECREF(v);
2142 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002143 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002144 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002145 break;
2146
Fred Drakeef8ace32000-08-24 00:32:09 +00002147 case EXTENDED_ARG:
2148 opcode = NEXTOP();
2149 oparg = oparg<<16 | NEXTARG();
2150 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002151
Guido van Rossum374a9221991-04-04 10:40:29 +00002152 default:
2153 fprintf(stderr,
2154 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002155 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 why = WHY_EXCEPTION;
2158 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002159
2160#ifdef CASE_TOO_BIG
2161 }
2162#endif
2163
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 } /* switch */
2165
2166 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002167
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002169
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002171 if (err == 0 && x != NULL) {
2172#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002173 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002175 fprintf(stderr,
2176 "XXX undetected error\n");
2177 else
2178#endif
2179 continue; /* Normal, fast path */
2180 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002182 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 err = 0;
2184 }
2185
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002187
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002190 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002191 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 why = WHY_EXCEPTION;
2193 }
2194 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002195#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002197 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002198 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002199 fprintf(stderr,
2200 "XXX undetected error (why=%d)\n",
2201 why);
2202 why = WHY_EXCEPTION;
2203 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 }
2205#endif
2206
2207 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002208
Guido van Rossum374a9221991-04-04 10:40:29 +00002209 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002210 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002212 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002213 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002214
Fred Drake8f51f542001-10-04 14:48:42 +00002215 if (tstate->c_tracefunc != NULL)
2216 call_exc_trace(tstate->c_tracefunc,
2217 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002218 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002219
Guido van Rossum374a9221991-04-04 10:40:29 +00002220 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002221
Guido van Rossum374a9221991-04-04 10:40:29 +00002222 if (why == WHY_RERAISE)
2223 why = WHY_EXCEPTION;
2224
2225 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002226
Tim Peters5ca576e2001-06-18 22:08:13 +00002227 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002229
2230 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2231 /* For a continue inside a try block,
2232 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002233 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2234 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002235 why = WHY_NOT;
2236 JUMPTO(PyInt_AS_LONG(retval));
2237 Py_DECREF(retval);
2238 break;
2239 }
2240
Guido van Rossum374a9221991-04-04 10:40:29 +00002241 while (STACK_LEVEL() > b->b_level) {
2242 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002243 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002244 }
2245 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2246 why = WHY_NOT;
2247 JUMPTO(b->b_handler);
2248 break;
2249 }
2250 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002251 (b->b_type == SETUP_EXCEPT &&
2252 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 PyObject *exc, *val, *tb;
2255 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002257 val = Py_None;
2258 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002259 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 /* Make the raw exception data
2261 available to the handler,
2262 so a program can emulate the
2263 Python main loop. Don't do
2264 this for 'finally'. */
2265 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002266 PyErr_NormalizeException(
2267 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002268 set_exc_info(tstate,
2269 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002270 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002271 if (tb == NULL) {
2272 Py_INCREF(Py_None);
2273 PUSH(Py_None);
2274 } else
2275 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002276 PUSH(val);
2277 PUSH(exc);
2278 }
2279 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002280 if (why == WHY_RETURN ||
2281 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002282 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002283 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002284 PUSH(v);
2285 }
2286 why = WHY_NOT;
2287 JUMPTO(b->b_handler);
2288 break;
2289 }
2290 } /* unwind stack */
2291
2292 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002293
Guido van Rossum374a9221991-04-04 10:40:29 +00002294 if (why != WHY_NOT)
2295 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002296
Guido van Rossum374a9221991-04-04 10:40:29 +00002297 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002298
Tim Peters5ca576e2001-06-18 22:08:13 +00002299 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002300 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002301
Fred Drake9e3ad782001-07-03 23:39:52 +00002302 if (tstate->use_tracing) {
2303 if (tstate->c_tracefunc
2304 && (why == WHY_RETURN || why == WHY_YIELD)) {
2305 if (call_trace(tstate->c_tracefunc,
2306 tstate->c_traceobj, f,
2307 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002308 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002309 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002310 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002311 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002312 }
Fred Drake8f51f542001-10-04 14:48:42 +00002313 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002314 if (why == WHY_EXCEPTION)
2315 call_trace_protected(tstate->c_profilefunc,
2316 tstate->c_profileobj, f,
2317 PyTrace_RETURN);
2318 else if (call_trace(tstate->c_profilefunc,
2319 tstate->c_profileobj, f,
2320 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002321 Py_XDECREF(retval);
2322 retval = NULL;
2323 why = WHY_EXCEPTION;
2324 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002325 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002326 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002327
Guido van Rossuma027efa1997-05-05 20:56:21 +00002328 reset_exc_info(tstate);
2329
Tim Peters5ca576e2001-06-18 22:08:13 +00002330 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002331 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002332 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002333
Guido van Rossum96a42c81992-01-12 02:29:51 +00002334 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002335}
2336
Tim Peters6d6c1a32001-08-02 04:15:00 +00002337PyObject *
2338PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002339 PyObject **args, int argcount, PyObject **kws, int kwcount,
2340 PyObject **defs, int defcount, PyObject *closure)
2341{
2342 register PyFrameObject *f;
2343 register PyObject *retval = NULL;
2344 register PyObject **fastlocals, **freevars;
2345 PyThreadState *tstate = PyThreadState_GET();
2346 PyObject *x, *u;
2347
2348 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002349 PyErr_SetString(PyExc_SystemError,
2350 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002351 return NULL;
2352 }
2353
2354 f = PyFrame_New(tstate, /*back*/
2355 co, /*code*/
2356 globals, locals);
2357 if (f == NULL)
2358 return NULL;
2359
2360 fastlocals = f->f_localsplus;
2361 freevars = f->f_localsplus + f->f_nlocals;
2362
2363 if (co->co_argcount > 0 ||
2364 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2365 int i;
2366 int n = argcount;
2367 PyObject *kwdict = NULL;
2368 if (co->co_flags & CO_VARKEYWORDS) {
2369 kwdict = PyDict_New();
2370 if (kwdict == NULL)
2371 goto fail;
2372 i = co->co_argcount;
2373 if (co->co_flags & CO_VARARGS)
2374 i++;
2375 SETLOCAL(i, kwdict);
2376 }
2377 if (argcount > co->co_argcount) {
2378 if (!(co->co_flags & CO_VARARGS)) {
2379 PyErr_Format(PyExc_TypeError,
2380 "%.200s() takes %s %d "
2381 "%sargument%s (%d given)",
2382 PyString_AsString(co->co_name),
2383 defcount ? "at most" : "exactly",
2384 co->co_argcount,
2385 kwcount ? "non-keyword " : "",
2386 co->co_argcount == 1 ? "" : "s",
2387 argcount);
2388 goto fail;
2389 }
2390 n = co->co_argcount;
2391 }
2392 for (i = 0; i < n; i++) {
2393 x = args[i];
2394 Py_INCREF(x);
2395 SETLOCAL(i, x);
2396 }
2397 if (co->co_flags & CO_VARARGS) {
2398 u = PyTuple_New(argcount - n);
2399 if (u == NULL)
2400 goto fail;
2401 SETLOCAL(co->co_argcount, u);
2402 for (i = n; i < argcount; i++) {
2403 x = args[i];
2404 Py_INCREF(x);
2405 PyTuple_SET_ITEM(u, i-n, x);
2406 }
2407 }
2408 for (i = 0; i < kwcount; i++) {
2409 PyObject *keyword = kws[2*i];
2410 PyObject *value = kws[2*i + 1];
2411 int j;
2412 if (keyword == NULL || !PyString_Check(keyword)) {
2413 PyErr_Format(PyExc_TypeError,
2414 "%.200s() keywords must be strings",
2415 PyString_AsString(co->co_name));
2416 goto fail;
2417 }
2418 /* XXX slow -- speed up using dictionary? */
2419 for (j = 0; j < co->co_argcount; j++) {
2420 PyObject *nm = PyTuple_GET_ITEM(
2421 co->co_varnames, j);
2422 int cmp = PyObject_RichCompareBool(
2423 keyword, nm, Py_EQ);
2424 if (cmp > 0)
2425 break;
2426 else if (cmp < 0)
2427 goto fail;
2428 }
2429 /* Check errors from Compare */
2430 if (PyErr_Occurred())
2431 goto fail;
2432 if (j >= co->co_argcount) {
2433 if (kwdict == NULL) {
2434 PyErr_Format(PyExc_TypeError,
2435 "%.200s() got an unexpected "
2436 "keyword argument '%.400s'",
2437 PyString_AsString(co->co_name),
2438 PyString_AsString(keyword));
2439 goto fail;
2440 }
2441 PyDict_SetItem(kwdict, keyword, value);
2442 }
2443 else {
2444 if (GETLOCAL(j) != NULL) {
2445 PyErr_Format(PyExc_TypeError,
2446 "%.200s() got multiple "
2447 "values for keyword "
2448 "argument '%.400s'",
2449 PyString_AsString(co->co_name),
2450 PyString_AsString(keyword));
2451 goto fail;
2452 }
2453 Py_INCREF(value);
2454 SETLOCAL(j, value);
2455 }
2456 }
2457 if (argcount < co->co_argcount) {
2458 int m = co->co_argcount - defcount;
2459 for (i = argcount; i < m; i++) {
2460 if (GETLOCAL(i) == NULL) {
2461 PyErr_Format(PyExc_TypeError,
2462 "%.200s() takes %s %d "
2463 "%sargument%s (%d given)",
2464 PyString_AsString(co->co_name),
2465 ((co->co_flags & CO_VARARGS) ||
2466 defcount) ? "at least"
2467 : "exactly",
2468 m, kwcount ? "non-keyword " : "",
2469 m == 1 ? "" : "s", i);
2470 goto fail;
2471 }
2472 }
2473 if (n > m)
2474 i = n - m;
2475 else
2476 i = 0;
2477 for (; i < defcount; i++) {
2478 if (GETLOCAL(m+i) == NULL) {
2479 PyObject *def = defs[i];
2480 Py_INCREF(def);
2481 SETLOCAL(m+i, def);
2482 }
2483 }
2484 }
2485 }
2486 else {
2487 if (argcount > 0 || kwcount > 0) {
2488 PyErr_Format(PyExc_TypeError,
2489 "%.200s() takes no arguments (%d given)",
2490 PyString_AsString(co->co_name),
2491 argcount + kwcount);
2492 goto fail;
2493 }
2494 }
2495 /* Allocate and initialize storage for cell vars, and copy free
2496 vars into frame. This isn't too efficient right now. */
2497 if (f->f_ncells) {
2498 int i = 0, j = 0, nargs, found;
2499 char *cellname, *argname;
2500 PyObject *c;
2501
2502 nargs = co->co_argcount;
2503 if (co->co_flags & CO_VARARGS)
2504 nargs++;
2505 if (co->co_flags & CO_VARKEYWORDS)
2506 nargs++;
2507
2508 /* Check for cells that shadow args */
2509 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2510 cellname = PyString_AS_STRING(
2511 PyTuple_GET_ITEM(co->co_cellvars, i));
2512 found = 0;
2513 while (j < nargs) {
2514 argname = PyString_AS_STRING(
2515 PyTuple_GET_ITEM(co->co_varnames, j));
2516 if (strcmp(cellname, argname) == 0) {
2517 c = PyCell_New(GETLOCAL(j));
2518 if (c == NULL)
2519 goto fail;
2520 GETLOCAL(f->f_nlocals + i) = c;
2521 found = 1;
2522 break;
2523 }
2524 j++;
2525 }
2526 if (found == 0) {
2527 c = PyCell_New(NULL);
2528 if (c == NULL)
2529 goto fail;
2530 SETLOCAL(f->f_nlocals + i, c);
2531 }
2532 }
2533 /* Initialize any that are left */
2534 while (i < f->f_ncells) {
2535 c = PyCell_New(NULL);
2536 if (c == NULL)
2537 goto fail;
2538 SETLOCAL(f->f_nlocals + i, c);
2539 i++;
2540 }
2541 }
2542 if (f->f_nfreevars) {
2543 int i;
2544 for (i = 0; i < f->f_nfreevars; ++i) {
2545 PyObject *o = PyTuple_GET_ITEM(closure, i);
2546 Py_INCREF(o);
2547 freevars[f->f_ncells + i] = o;
2548 }
2549 }
2550
Tim Peters5ca576e2001-06-18 22:08:13 +00002551 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002552 /* Don't need to keep the reference to f_back, it will be set
2553 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002554 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002555 f->f_back = NULL;
2556
2557 /* Create a new generator that owns the ready to run frame
2558 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002559 return gen_new(f);
2560 }
2561
2562 retval = eval_frame(f);
2563
2564 fail: /* Jump here from prelude on failure */
2565
Tim Petersb13680b2001-11-27 23:29:29 +00002566 /* decref'ing the frame can cause __del__ methods to get invoked,
2567 which can call back into Python. While we're done with the
2568 current Python frame (f), the associated C stack is still in use,
2569 so recursion_depth must be boosted for the duration.
2570 */
2571 assert(tstate != NULL);
2572 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002573 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002574 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002575 return retval;
2576}
2577
2578
Guido van Rossuma027efa1997-05-05 20:56:21 +00002579static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002580set_exc_info(PyThreadState *tstate,
2581 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002582{
2583 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002584 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002585
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 frame = tstate->frame;
2587 if (frame->f_exc_type == NULL) {
2588 /* This frame didn't catch an exception before */
2589 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002590 if (tstate->exc_type == NULL) {
2591 Py_INCREF(Py_None);
2592 tstate->exc_type = Py_None;
2593 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002594 tmp_type = frame->f_exc_type;
2595 tmp_value = frame->f_exc_value;
2596 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597 Py_XINCREF(tstate->exc_type);
2598 Py_XINCREF(tstate->exc_value);
2599 Py_XINCREF(tstate->exc_traceback);
2600 frame->f_exc_type = tstate->exc_type;
2601 frame->f_exc_value = tstate->exc_value;
2602 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002603 Py_XDECREF(tmp_type);
2604 Py_XDECREF(tmp_value);
2605 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002606 }
2607 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002608 tmp_type = tstate->exc_type;
2609 tmp_value = tstate->exc_value;
2610 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 Py_XINCREF(type);
2612 Py_XINCREF(value);
2613 Py_XINCREF(tb);
2614 tstate->exc_type = type;
2615 tstate->exc_value = value;
2616 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002617 Py_XDECREF(tmp_type);
2618 Py_XDECREF(tmp_value);
2619 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002620 /* For b/w compatibility */
2621 PySys_SetObject("exc_type", type);
2622 PySys_SetObject("exc_value", value);
2623 PySys_SetObject("exc_traceback", tb);
2624}
2625
2626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002627reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002628{
2629 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002630 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002631 frame = tstate->frame;
2632 if (frame->f_exc_type != NULL) {
2633 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002634 tmp_type = tstate->exc_type;
2635 tmp_value = tstate->exc_value;
2636 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002637 Py_XINCREF(frame->f_exc_type);
2638 Py_XINCREF(frame->f_exc_value);
2639 Py_XINCREF(frame->f_exc_traceback);
2640 tstate->exc_type = frame->f_exc_type;
2641 tstate->exc_value = frame->f_exc_value;
2642 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002643 Py_XDECREF(tmp_type);
2644 Py_XDECREF(tmp_value);
2645 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002646 /* For b/w compatibility */
2647 PySys_SetObject("exc_type", frame->f_exc_type);
2648 PySys_SetObject("exc_value", frame->f_exc_value);
2649 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2650 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002651 tmp_type = frame->f_exc_type;
2652 tmp_value = frame->f_exc_value;
2653 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002654 frame->f_exc_type = NULL;
2655 frame->f_exc_value = NULL;
2656 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002657 Py_XDECREF(tmp_type);
2658 Py_XDECREF(tmp_value);
2659 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002660}
2661
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002662/* Logic for the raise statement (too complicated for inlining).
2663 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002664static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002665do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002666{
Guido van Rossumd295f121998-04-09 21:39:57 +00002667 if (type == NULL) {
2668 /* Reraise */
2669 PyThreadState *tstate = PyThreadState_Get();
2670 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2671 value = tstate->exc_value;
2672 tb = tstate->exc_traceback;
2673 Py_XINCREF(type);
2674 Py_XINCREF(value);
2675 Py_XINCREF(tb);
2676 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002677
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002678 /* We support the following forms of raise:
2679 raise <class>, <classinstance>
2680 raise <class>, <argument tuple>
2681 raise <class>, None
2682 raise <class>, <argument>
2683 raise <classinstance>, None
2684 raise <string>, <object>
2685 raise <string>, None
2686
2687 An omitted second argument is the same as None.
2688
2689 In addition, raise <tuple>, <anything> is the same as
2690 raising the tuple's first item (and it better have one!);
2691 this rule is applied recursively.
2692
2693 Finally, an optional third argument can be supplied, which
2694 gives the traceback to be substituted (useful when
2695 re-raising an exception after examining it). */
2696
2697 /* First, check the traceback argument, replacing None with
2698 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 if (tb == Py_None) {
2700 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002701 tb = NULL;
2702 }
2703 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002705 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002706 goto raise_error;
2707 }
2708
2709 /* Next, replace a missing value with None */
2710 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 value = Py_None;
2712 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 }
2714
2715 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2717 PyObject *tmp = type;
2718 type = PyTuple_GET_ITEM(type, 0);
2719 Py_INCREF(type);
2720 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002721 }
2722
Barry Warsaw4249f541997-08-22 21:26:19 +00002723 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002724 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002725
2726 else if (PyClass_Check(type))
2727 PyErr_NormalizeException(&type, &value, &tb);
2728
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002730 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 if (value != Py_None) {
2732 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 "instance exception may not have a separate value");
2734 goto raise_error;
2735 }
2736 else {
2737 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002739 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2741 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002742 }
2743 }
2744 else {
2745 /* Not something you can raise. You get an exception
2746 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002747 PyErr_Format(PyExc_TypeError,
2748 "exceptions must be strings, classes, or "
2749 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002750 goto raise_error;
2751 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002753 if (tb == NULL)
2754 return WHY_EXCEPTION;
2755 else
2756 return WHY_RERAISE;
2757 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002758 Py_XDECREF(value);
2759 Py_XDECREF(type);
2760 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002761 return WHY_EXCEPTION;
2762}
2763
Tim Petersd6d010b2001-06-21 02:49:55 +00002764/* Iterate v argcnt times and store the results on the stack (via decreasing
2765 sp). Return 1 for success, 0 if error. */
2766
Barry Warsawe42b18f1997-08-25 22:13:04 +00002767static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002768unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002769{
Tim Petersd6d010b2001-06-21 02:49:55 +00002770 int i = 0;
2771 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002772 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002773
Tim Petersd6d010b2001-06-21 02:49:55 +00002774 assert(v != NULL);
2775
2776 it = PyObject_GetIter(v);
2777 if (it == NULL)
2778 goto Error;
2779
2780 for (; i < argcnt; i++) {
2781 w = PyIter_Next(it);
2782 if (w == NULL) {
2783 /* Iterator done, via error or exhaustion. */
2784 if (!PyErr_Occurred()) {
2785 PyErr_Format(PyExc_ValueError,
2786 "need more than %d value%s to unpack",
2787 i, i == 1 ? "" : "s");
2788 }
2789 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002790 }
2791 *--sp = w;
2792 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002793
2794 /* We better have exhausted the iterator now. */
2795 w = PyIter_Next(it);
2796 if (w == NULL) {
2797 if (PyErr_Occurred())
2798 goto Error;
2799 Py_DECREF(it);
2800 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002801 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002802 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002803 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002804 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002805Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002806 for (; i > 0; i--, sp++)
2807 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002808 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002809 return 0;
2810}
2811
2812
Guido van Rossum96a42c81992-01-12 02:29:51 +00002813#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002815prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002817 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 if (PyObject_Print(v, stdout, 0) != 0)
2819 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002820 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002821 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002823#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002825static void
Fred Drake5755ce62001-06-27 19:19:46 +00002826call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002827{
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002829 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002830 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002831 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 value = Py_None;
2833 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002834 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002835 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002836 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002837 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002838 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002839 }
Fred Drake5755ce62001-06-27 19:19:46 +00002840 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002841 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002842 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002843 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002844 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002845 Py_XDECREF(type);
2846 Py_XDECREF(value);
2847 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002848 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002849}
2850
Fred Drake4ec5d562001-10-04 19:26:43 +00002851static void
2852call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2853 int what)
2854{
2855 PyObject *type, *value, *traceback;
2856 int err;
2857 PyErr_Fetch(&type, &value, &traceback);
2858 err = call_trace(func, obj, frame, what, NULL);
2859 if (err == 0)
2860 PyErr_Restore(type, value, traceback);
2861 else {
2862 Py_XDECREF(type);
2863 Py_XDECREF(value);
2864 Py_XDECREF(traceback);
2865 }
2866}
2867
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002868static int
Fred Drake5755ce62001-06-27 19:19:46 +00002869call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2870 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002871{
Fred Drake5755ce62001-06-27 19:19:46 +00002872 register PyThreadState *tstate = frame->f_tstate;
2873 int result;
2874 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002875 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002876 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002877 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002878 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002879 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2880 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002881 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002882 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002883}
2884
Fred Drake5755ce62001-06-27 19:19:46 +00002885void
2886PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002887{
Fred Drake5755ce62001-06-27 19:19:46 +00002888 PyThreadState *tstate = PyThreadState_Get();
2889 PyObject *temp = tstate->c_profileobj;
2890 Py_XINCREF(arg);
2891 tstate->c_profilefunc = NULL;
2892 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002893 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002894 Py_XDECREF(temp);
2895 tstate->c_profilefunc = func;
2896 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002897 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002898}
2899
2900void
2901PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2902{
2903 PyThreadState *tstate = PyThreadState_Get();
2904 PyObject *temp = tstate->c_traceobj;
2905 Py_XINCREF(arg);
2906 tstate->c_tracefunc = NULL;
2907 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002908 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002909 Py_XDECREF(temp);
2910 tstate->c_tracefunc = func;
2911 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002912 tstate->use_tracing = ((func != NULL)
2913 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002914}
2915
Guido van Rossumb209a111997-04-29 18:18:01 +00002916PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002917PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002918{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002919 PyThreadState *tstate = PyThreadState_Get();
2920 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002921 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002922 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002923 else
2924 return current_frame->f_builtins;
2925}
2926
Guido van Rossumb209a111997-04-29 18:18:01 +00002927PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002928PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002929{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002930 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002931 if (current_frame == NULL)
2932 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002933 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002934 return current_frame->f_locals;
2935}
2936
Guido van Rossumb209a111997-04-29 18:18:01 +00002937PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002938PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002939{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002940 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002941 if (current_frame == NULL)
2942 return NULL;
2943 else
2944 return current_frame->f_globals;
2945}
2946
Guido van Rossumb209a111997-04-29 18:18:01 +00002947PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002948PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002949{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002950 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002951 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002952}
2953
Guido van Rossum6135a871995-01-09 17:53:26 +00002954int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002955PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002956{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002957 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002958 return current_frame == NULL ? 0 : current_frame->f_restricted;
2959}
2960
Guido van Rossumbe270261997-05-22 22:26:18 +00002961int
Tim Peters5ba58662001-07-16 02:29:45 +00002962PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002963{
2964 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002965 int result = 0;
2966
2967 if (current_frame != NULL) {
2968 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002969 const int compilerflags = codeflags & PyCF_MASK;
2970 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002971 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002972 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002973 }
2974 }
2975 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002976}
2977
2978int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002979Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980{
Guido van Rossumb209a111997-04-29 18:18:01 +00002981 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002982 if (f == NULL)
2983 return 0;
2984 if (!PyFile_SoftSpace(f, 0))
2985 return 0;
2986 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002987}
2988
Guido van Rossum3f5da241990-12-20 15:06:42 +00002989
Guido van Rossum681d79a1995-07-18 14:51:37 +00002990/* External interface to call any callable object.
2991 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002992
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002993#undef PyEval_CallObject
2994/* for backward compatibility: export this interface */
2995
Guido van Rossumb209a111997-04-29 18:18:01 +00002996PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002997PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002998{
Guido van Rossumb209a111997-04-29 18:18:01 +00002999 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003000}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003001#define PyEval_CallObject(func,arg) \
3002 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003003
Guido van Rossumb209a111997-04-29 18:18:01 +00003004PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003005PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003006{
Jeremy Hylton52820442001-01-03 23:52:36 +00003007 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003008
3009 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003010 arg = PyTuple_New(0);
3011 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003012 PyErr_SetString(PyExc_TypeError,
3013 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003014 return NULL;
3015 }
3016 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003017 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018
Guido van Rossumb209a111997-04-29 18:18:01 +00003019 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003020 PyErr_SetString(PyExc_TypeError,
3021 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003022 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003023 return NULL;
3024 }
3025
Tim Peters6d6c1a32001-08-02 04:15:00 +00003026 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003027 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003028 return result;
3029}
3030
Tim Peters6d6c1a32001-08-02 04:15:00 +00003031char *
3032PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003033{
3034 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003035 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003036 else if (PyFunction_Check(func))
3037 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3038 else if (PyCFunction_Check(func))
3039 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3040 else if (PyClass_Check(func))
3041 return PyString_AsString(((PyClassObject*)func)->cl_name);
3042 else if (PyInstance_Check(func)) {
3043 return PyString_AsString(
3044 ((PyInstanceObject*)func)->in_class->cl_name);
3045 } else {
3046 return func->ob_type->tp_name;
3047 }
3048}
3049
Tim Peters6d6c1a32001-08-02 04:15:00 +00003050char *
3051PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003052{
3053 if (PyMethod_Check(func))
3054 return "()";
3055 else if (PyFunction_Check(func))
3056 return "()";
3057 else if (PyCFunction_Check(func))
3058 return "()";
3059 else if (PyClass_Check(func))
3060 return " constructor";
3061 else if (PyInstance_Check(func)) {
3062 return " instance";
3063 } else {
3064 return " object";
3065 }
3066}
3067
Jeremy Hylton52820442001-01-03 23:52:36 +00003068#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3069
3070/* The two fast_xxx() functions optimize calls for which no argument
3071 tuple is necessary; the objects are passed directly from the stack.
3072 fast_cfunction() is called for METH_OLDARGS functions.
3073 fast_function() is for functions with no special argument handling.
3074*/
3075
3076static PyObject *
3077fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3078{
3079 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3080 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003081 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003082
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003083 switch (flags) {
3084 case METH_OLDARGS:
3085 if (na == 0)
3086 return (*meth)(self, NULL);
3087 else if (na == 1) {
3088 PyObject *arg = EXT_POP(*pp_stack);
3089 PyObject *result = (*meth)(self, arg);
3090 Py_DECREF(arg);
3091 return result;
3092 } else {
3093 PyObject *args = load_args(pp_stack, na);
3094 PyObject *result = (*meth)(self, args);
3095 Py_DECREF(args);
3096 return result;
3097 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003098 case METH_NOARGS:
3099 if (na == 0)
3100 return (*meth)(self, NULL);
3101 PyErr_Format(PyExc_TypeError,
3102 "%.200s() takes no arguments (%d given)",
3103 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3104 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003105 case METH_O:
3106 if (na == 1) {
3107 PyObject *arg = EXT_POP(*pp_stack);
3108 PyObject *result = (*meth)(self, arg);
3109 Py_DECREF(arg);
3110 return result;
3111 }
3112 PyErr_Format(PyExc_TypeError,
3113 "%.200s() takes exactly one argument (%d given)",
3114 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3115 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003116 default:
3117 fprintf(stderr, "%.200s() flags = %d\n",
3118 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3119 PyErr_BadInternalCall();
3120 return NULL;
3121 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003122}
3123
3124static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003125fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003126{
3127 PyObject *co = PyFunction_GET_CODE(func);
3128 PyObject *globals = PyFunction_GET_GLOBALS(func);
3129 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003130 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003131 PyObject **d = NULL;
3132 int nd = 0;
3133
3134 if (argdefs != NULL) {
3135 d = &PyTuple_GET_ITEM(argdefs, 0);
3136 nd = ((PyTupleObject *)argdefs)->ob_size;
3137 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003138 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003139 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003140 (*pp_stack)-2*nk, nk, d, nd,
3141 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003142}
3143
3144static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003145update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3146 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003147{
3148 PyObject *kwdict = NULL;
3149 if (orig_kwdict == NULL)
3150 kwdict = PyDict_New();
3151 else {
3152 kwdict = PyDict_Copy(orig_kwdict);
3153 Py_DECREF(orig_kwdict);
3154 }
3155 if (kwdict == NULL)
3156 return NULL;
3157 while (--nk >= 0) {
3158 int err;
3159 PyObject *value = EXT_POP(*pp_stack);
3160 PyObject *key = EXT_POP(*pp_stack);
3161 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003162 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003163 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003164 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003165 PyEval_GetFuncName(func),
3166 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003167 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003168 Py_DECREF(key);
3169 Py_DECREF(value);
3170 Py_DECREF(kwdict);
3171 return NULL;
3172 }
3173 err = PyDict_SetItem(kwdict, key, value);
3174 Py_DECREF(key);
3175 Py_DECREF(value);
3176 if (err) {
3177 Py_DECREF(kwdict);
3178 return NULL;
3179 }
3180 }
3181 return kwdict;
3182}
3183
3184static PyObject *
3185update_star_args(int nstack, int nstar, PyObject *stararg,
3186 PyObject ***pp_stack)
3187{
3188 PyObject *callargs, *w;
3189
3190 callargs = PyTuple_New(nstack + nstar);
3191 if (callargs == NULL) {
3192 return NULL;
3193 }
3194 if (nstar) {
3195 int i;
3196 for (i = 0; i < nstar; i++) {
3197 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3198 Py_INCREF(a);
3199 PyTuple_SET_ITEM(callargs, nstack + i, a);
3200 }
3201 }
3202 while (--nstack >= 0) {
3203 w = EXT_POP(*pp_stack);
3204 PyTuple_SET_ITEM(callargs, nstack, w);
3205 }
3206 return callargs;
3207}
3208
3209static PyObject *
3210load_args(PyObject ***pp_stack, int na)
3211{
3212 PyObject *args = PyTuple_New(na);
3213 PyObject *w;
3214
3215 if (args == NULL)
3216 return NULL;
3217 while (--na >= 0) {
3218 w = EXT_POP(*pp_stack);
3219 PyTuple_SET_ITEM(args, na, w);
3220 }
3221 return args;
3222}
3223
3224static PyObject *
3225do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3226{
3227 PyObject *callargs = NULL;
3228 PyObject *kwdict = NULL;
3229 PyObject *result = NULL;
3230
3231 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003232 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003233 if (kwdict == NULL)
3234 goto call_fail;
3235 }
3236 callargs = load_args(pp_stack, na);
3237 if (callargs == NULL)
3238 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003239 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003240 call_fail:
3241 Py_XDECREF(callargs);
3242 Py_XDECREF(kwdict);
3243 return result;
3244}
3245
3246static PyObject *
3247ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3248{
3249 int nstar = 0;
3250 PyObject *callargs = NULL;
3251 PyObject *stararg = NULL;
3252 PyObject *kwdict = NULL;
3253 PyObject *result = NULL;
3254
3255 if (flags & CALL_FLAG_KW) {
3256 kwdict = EXT_POP(*pp_stack);
3257 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003258 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003259 "%s%s argument after ** "
3260 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003261 PyEval_GetFuncName(func),
3262 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003263 goto ext_call_fail;
3264 }
3265 }
3266 if (flags & CALL_FLAG_VAR) {
3267 stararg = EXT_POP(*pp_stack);
3268 if (!PyTuple_Check(stararg)) {
3269 PyObject *t = NULL;
3270 t = PySequence_Tuple(stararg);
3271 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003272 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3273 PyErr_Format(PyExc_TypeError,
3274 "%s%s argument after * "
3275 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003276 PyEval_GetFuncName(func),
3277 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003278 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003279 goto ext_call_fail;
3280 }
3281 Py_DECREF(stararg);
3282 stararg = t;
3283 }
3284 nstar = PyTuple_GET_SIZE(stararg);
3285 }
3286 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003287 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003288 if (kwdict == NULL)
3289 goto ext_call_fail;
3290 }
3291 callargs = update_star_args(na, nstar, stararg, pp_stack);
3292 if (callargs == NULL)
3293 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003294 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003295 ext_call_fail:
3296 Py_XDECREF(callargs);
3297 Py_XDECREF(kwdict);
3298 Py_XDECREF(stararg);
3299 return result;
3300}
3301
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003302#define SLICE_ERROR_MSG \
3303 "standard sequence type does not support step size other than one"
3304
Guido van Rossumb209a111997-04-29 18:18:01 +00003305static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003306loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307{
Guido van Rossumb209a111997-04-29 18:18:01 +00003308 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003309 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003310 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003311 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003312 return NULL;
3313 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003314 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003315 v = (*sq->sq_item)(v, i);
3316 if (v)
3317 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003318 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003319 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003320 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321}
3322
Guido van Rossum20c6add2000-05-08 14:06:50 +00003323/* Extract a slice index from a PyInt or PyLong, the index is bound to
3324 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3325 and error. Returns 1 on success.*/
3326
3327int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003328_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003329{
3330 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003331 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003332 if (PyInt_Check(v)) {
3333 x = PyInt_AsLong(v);
3334 } else if (PyLong_Check(v)) {
3335 x = PyLong_AsLong(v);
3336 if (x==-1 && PyErr_Occurred()) {
3337 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003338 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003339
Guido van Rossumac7be682001-01-17 15:42:30 +00003340 if (!PyErr_ExceptionMatches(
3341 PyExc_OverflowError)) {
3342 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003343 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003344 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003345 }
3346
Guido van Rossumac7be682001-01-17 15:42:30 +00003347 /* Clear the OverflowError */
3348 PyErr_Clear();
3349
3350 /* It's an overflow error, so we need to
3351 check the sign of the long integer,
3352 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003353 the error. */
3354
3355 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003356 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003357 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003358
3359 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003360 cmp = PyObject_RichCompareBool(v, long_zero,
3361 Py_GT);
3362 Py_DECREF(long_zero);
3363 if (cmp < 0)
3364 return 0;
3365 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003366 x = INT_MAX;
3367 else
3368 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003369 }
3370 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003371 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003372 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003373 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003375 /* Truncate -- very long indices are truncated anyway */
3376 if (x > INT_MAX)
3377 x = INT_MAX;
3378 else if (x < -INT_MAX)
3379 x = 0;
3380 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003382 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383}
3384
Guido van Rossum50d756e2001-08-18 17:43:36 +00003385#undef ISINT
3386#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3387
Guido van Rossumb209a111997-04-29 18:18:01 +00003388static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003389apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003391 PyTypeObject *tp = u->ob_type;
3392 PySequenceMethods *sq = tp->tp_as_sequence;
3393
3394 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3395 int ilow = 0, ihigh = INT_MAX;
3396 if (!_PyEval_SliceIndex(v, &ilow))
3397 return NULL;
3398 if (!_PyEval_SliceIndex(w, &ihigh))
3399 return NULL;
3400 return PySequence_GetSlice(u, ilow, ihigh);
3401 }
3402 else {
3403 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003404 if (slice != NULL) {
3405 PyObject *res = PyObject_GetItem(u, slice);
3406 Py_DECREF(slice);
3407 return res;
3408 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003409 else
3410 return NULL;
3411 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413
3414static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003415assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3416 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003418 PyTypeObject *tp = u->ob_type;
3419 PySequenceMethods *sq = tp->tp_as_sequence;
3420
3421 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3422 int ilow = 0, ihigh = INT_MAX;
3423 if (!_PyEval_SliceIndex(v, &ilow))
3424 return -1;
3425 if (!_PyEval_SliceIndex(w, &ihigh))
3426 return -1;
3427 if (x == NULL)
3428 return PySequence_DelSlice(u, ilow, ihigh);
3429 else
3430 return PySequence_SetSlice(u, ilow, ihigh, x);
3431 }
3432 else {
3433 PyObject *slice = PySlice_New(v, w, NULL);
3434 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003435 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003436 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003437 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003438 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003439 res = PyObject_DelItem(u, slice);
3440 Py_DECREF(slice);
3441 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003442 }
3443 else
3444 return -1;
3445 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446}
3447
Guido van Rossumb209a111997-04-29 18:18:01 +00003448static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003449cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450{
Guido van Rossumac7be682001-01-17 15:42:30 +00003451 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003452 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003453 case IS:
3454 case IS_NOT:
3455 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003456 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003457 res = !res;
3458 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459 case IN:
3460 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003461 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003462 if (res < 0)
3463 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003464 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003465 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003466 break;
3467 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003468 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003469 break;
3470 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003471 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003473 v = res ? Py_True : Py_False;
3474 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003475 return v;
3476}
3477
Thomas Wouters52152252000-08-17 22:55:00 +00003478static PyObject *
3479import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003480{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003481 PyObject *x;
3482
3483 x = PyObject_GetAttr(v, name);
3484 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003485 PyErr_Format(PyExc_ImportError,
3486 "cannot import name %.230s",
3487 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003488 }
Thomas Wouters52152252000-08-17 22:55:00 +00003489 return x;
3490}
Guido van Rossumac7be682001-01-17 15:42:30 +00003491
Thomas Wouters52152252000-08-17 22:55:00 +00003492static int
3493import_all_from(PyObject *locals, PyObject *v)
3494{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003495 PyObject *all = PyObject_GetAttrString(v, "__all__");
3496 PyObject *dict, *name, *value;
3497 int skip_leading_underscores = 0;
3498 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003499
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003500 if (all == NULL) {
3501 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3502 return -1; /* Unexpected error */
3503 PyErr_Clear();
3504 dict = PyObject_GetAttrString(v, "__dict__");
3505 if (dict == NULL) {
3506 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3507 return -1;
3508 PyErr_SetString(PyExc_ImportError,
3509 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003510 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003511 }
3512 all = PyMapping_Keys(dict);
3513 Py_DECREF(dict);
3514 if (all == NULL)
3515 return -1;
3516 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003517 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003518
3519 for (pos = 0, err = 0; ; pos++) {
3520 name = PySequence_GetItem(all, pos);
3521 if (name == NULL) {
3522 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3523 err = -1;
3524 else
3525 PyErr_Clear();
3526 break;
3527 }
3528 if (skip_leading_underscores &&
3529 PyString_Check(name) &&
3530 PyString_AS_STRING(name)[0] == '_')
3531 {
3532 Py_DECREF(name);
3533 continue;
3534 }
3535 value = PyObject_GetAttr(v, name);
3536 if (value == NULL)
3537 err = -1;
3538 else
3539 err = PyDict_SetItem(locals, name, value);
3540 Py_DECREF(name);
3541 Py_XDECREF(value);
3542 if (err != 0)
3543 break;
3544 }
3545 Py_DECREF(all);
3546 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003547}
3548
Guido van Rossumb209a111997-04-29 18:18:01 +00003549static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003550build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003551{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003552 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003553
3554 if (PyDict_Check(methods))
3555 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003556 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003557 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003558 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3559 base = PyTuple_GET_ITEM(bases, 0);
3560 metaclass = PyObject_GetAttrString(base, "__class__");
3561 if (metaclass == NULL) {
3562 PyErr_Clear();
3563 metaclass = (PyObject *)base->ob_type;
3564 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003565 }
3566 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003567 else {
3568 PyObject *g = PyEval_GetGlobals();
3569 if (g != NULL && PyDict_Check(g))
3570 metaclass = PyDict_GetItemString(g, "__metaclass__");
3571 if (metaclass == NULL)
3572 metaclass = (PyObject *) &PyClass_Type;
3573 Py_INCREF(metaclass);
3574 }
3575 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3576 Py_DECREF(metaclass);
3577 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003578}
3579
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003580static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003581exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3582 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003583{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003584 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003585 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003586 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003587
Guido van Rossumb209a111997-04-29 18:18:01 +00003588 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3589 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003590 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003591 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003592 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003593 locals = PyTuple_GetItem(prog, 2);
3594 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003595 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003596 if (globals == Py_None) {
3597 globals = PyEval_GetGlobals();
3598 if (locals == Py_None) {
3599 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003600 plain = 1;
3601 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003603 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003604 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003605 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003606 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003607 !PyCode_Check(prog) &&
3608 !PyFile_Check(prog)) {
3609 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003610 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003611 return -1;
3612 }
Fred Drake661ea262000-10-24 19:57:45 +00003613 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003614 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003615 "exec: arg 2 must be a dictionary or None");
3616 return -1;
3617 }
3618 if (!PyDict_Check(locals)) {
3619 PyErr_SetString(PyExc_TypeError,
3620 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003621 return -1;
3622 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003623 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003624 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003625 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003626 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003627 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003628 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003629 FILE *fp = PyFile_AsFile(prog);
3630 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003631 PyCompilerFlags cf;
3632 cf.cf_flags = 0;
3633 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003634 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3635 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003636 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003637 v = PyRun_File(fp, name, Py_file_input, globals,
3638 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003639 }
3640 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003641 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003642 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003643 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003644 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003645 cf.cf_flags = 0;
3646 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003647 v = PyRun_StringFlags(str, Py_file_input, globals,
3648 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003649 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003650 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003651 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003652 if (plain)
3653 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003654 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003655 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003656 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003657 return 0;
3658}
Guido van Rossum24c13741995-02-14 09:42:43 +00003659
Guido van Rossumac7be682001-01-17 15:42:30 +00003660static void
Paul Prescode68140d2000-08-30 20:25:01 +00003661format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3662{
3663 char *obj_str;
3664
3665 if (!obj)
3666 return;
3667
3668 obj_str = PyString_AsString(obj);
3669 if (!obj_str)
3670 return;
3671
3672 PyErr_Format(exc, format_str, obj_str);
3673}
Guido van Rossum950361c1997-01-24 13:49:28 +00003674
3675#ifdef DYNAMIC_EXECUTION_PROFILE
3676
Skip Montanarof118cb12001-10-15 20:51:38 +00003677static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003678getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003679{
3680 int i;
3681 PyObject *l = PyList_New(256);
3682 if (l == NULL) return NULL;
3683 for (i = 0; i < 256; i++) {
3684 PyObject *x = PyInt_FromLong(a[i]);
3685 if (x == NULL) {
3686 Py_DECREF(l);
3687 return NULL;
3688 }
3689 PyList_SetItem(l, i, x);
3690 }
3691 for (i = 0; i < 256; i++)
3692 a[i] = 0;
3693 return l;
3694}
3695
3696PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003697_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003698{
3699#ifndef DXPAIRS
3700 return getarray(dxp);
3701#else
3702 int i;
3703 PyObject *l = PyList_New(257);
3704 if (l == NULL) return NULL;
3705 for (i = 0; i < 257; i++) {
3706 PyObject *x = getarray(dxpairs[i]);
3707 if (x == NULL) {
3708 Py_DECREF(l);
3709 return NULL;
3710 }
3711 PyList_SetItem(l, i, x);
3712 }
3713 return l;
3714#endif
3715}
3716
3717#endif