blob: bccd90d76e475ff2898530909b4fef40896126b3 [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 */
473 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
545#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
546#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000547#else
548#define PUSH(v) BASIC_PUSH(v)
549#define POP() BASIC_POP()
550#endif
551
Guido van Rossum46add982001-08-30 16:06:23 +0000552/* Strict int check macros */
553#define ISSTRICTINT(v) ((v)->ob_type == &PyInt_Type)
554
Guido van Rossum681d79a1995-07-18 14:51:37 +0000555/* Local variable macros */
556
557#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000558#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000559 GETLOCAL(i) = value; } while (0)
560
Guido van Rossuma027efa1997-05-05 20:56:21 +0000561/* Start of code */
562
Tim Peters5ca576e2001-06-18 22:08:13 +0000563 if (f == NULL)
564 return NULL;
565
Guido van Rossum8861b741996-07-30 16:49:37 +0000566#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000568 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000569 return NULL;
570 }
571#endif
572
Tim Peters5ca576e2001-06-18 22:08:13 +0000573 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000574 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000575 --tstate->recursion_depth;
576 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000577 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000578 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000579 return NULL;
580 }
581
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000583 co = f->f_code;
584 fastlocals = f->f_localsplus;
585 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000586 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000587 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000588 stack_pointer = f->f_stacktop;
589 assert(stack_pointer != NULL);
590 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000591
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000592 if (tstate->use_tracing) {
593 if (tstate->c_tracefunc != NULL) {
594 /* tstate->c_tracefunc, if defined, is a
595 function that will be called on *every* entry
596 to a code block. Its return value, if not
597 None, is a function that will be called at
598 the start of each executed line of code.
599 (Actually, the function must return itself
600 in order to continue tracing.) The trace
601 functions are called with three arguments:
602 a pointer to the current frame, a string
603 indicating why the function is called, and
604 an argument which depends on the situation.
605 The global trace function is also called
606 whenever an exception is detected. */
607 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
608 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000609 /* Trace function raised an error */
610 return NULL;
611 }
612 }
613 if (tstate->c_profilefunc != NULL) {
614 /* Similar for c_profilefunc, except it needn't
615 return itself and isn't called for "line" events */
616 if (call_trace(tstate->c_profilefunc,
617 tstate->c_profileobj,
618 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000619 /* Profile function raised an error */
620 return NULL;
621 }
622 }
623 }
624
Tim Peters5ca576e2001-06-18 22:08:13 +0000625#ifdef LLTRACE
626 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
627#endif
628#if defined(Py_DEBUG) || defined(LLTRACE)
629 filename = PyString_AsString(co->co_filename);
630#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000631
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 why = WHY_NOT;
633 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000634 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000635 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000636
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000638 /* Do periodic things. Doing this every time through
639 the loop would add too much overhead, so we do it
640 only every Nth instruction. We also do it if
641 ``things_to_do'' is set, i.e. when an asynchronous
642 event needs attention (e.g. a signal handler or
643 async I/O handler); see Py_AddPendingCall() and
644 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000645
Guido van Rossuma027efa1997-05-05 20:56:21 +0000646 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000647 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000648 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000649 if (Py_MakePendingCalls() < 0) {
650 why = WHY_EXCEPTION;
651 goto on_error;
652 }
653 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000654#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000655 /* If we have true signals, the signal handler
656 will call Py_AddPendingCall() so we don't
657 have to call sigcheck(). On the Mac and
658 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000659 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 goto on_error;
662 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000663#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664
Guido van Rossume59214e1994-08-30 08:01:59 +0000665#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666 if (interpreter_lock) {
667 /* Give another thread a chance */
668
Guido van Rossum25ce5661997-08-02 03:10:38 +0000669 if (PyThreadState_Swap(NULL) != tstate)
670 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000671 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672
673 /* Other threads may run now */
674
Guido van Rossum65d5b571998-12-21 19:32:43 +0000675 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000676 if (PyThreadState_Swap(tstate) != NULL)
677 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000678 }
679#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000683
Guido van Rossum408027e1996-12-30 16:17:54 +0000684#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000685 f->f_lasti = INSTR_OFFSET();
686#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000687
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 opcode = NEXTOP();
689 if (HAS_ARG(opcode))
690 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000691 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000692#ifdef DYNAMIC_EXECUTION_PROFILE
693#ifdef DXPAIRS
694 dxpairs[lastopcode][opcode]++;
695 lastopcode = opcode;
696#endif
697 dxp[opcode]++;
698#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000699
Guido van Rossum96a42c81992-01-12 02:29:51 +0000700#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000702
Guido van Rossum96a42c81992-01-12 02:29:51 +0000703 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 if (HAS_ARG(opcode)) {
705 printf("%d: %d, %d\n",
706 (int) (INSTR_OFFSET() - 3),
707 opcode, oparg);
708 }
709 else {
710 printf("%d: %d\n",
711 (int) (INSTR_OFFSET() - 1), opcode);
712 }
713 }
714#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000716
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 /* BEWARE!
720 It is essential that any operation that fails sets either
721 x to NULL, err to nonzero, or why to anything but WHY_NOT,
722 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000723
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 case POP_TOP:
727 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000728 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000729 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000730
Guido van Rossum374a9221991-04-04 10:40:29 +0000731 case ROT_TWO:
732 v = POP();
733 w = POP();
734 PUSH(v);
735 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000736 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000737
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 case ROT_THREE:
739 v = POP();
740 w = POP();
741 x = POP();
742 PUSH(v);
743 PUSH(x);
744 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000745 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000746
Thomas Wouters434d0822000-08-24 20:11:32 +0000747 case ROT_FOUR:
748 u = POP();
749 v = POP();
750 w = POP();
751 x = POP();
752 PUSH(u);
753 PUSH(x);
754 PUSH(w);
755 PUSH(v);
756 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000757
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 case DUP_TOP:
759 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000762 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000763
Thomas Wouters434d0822000-08-24 20:11:32 +0000764 case DUP_TOPX:
765 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000766 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000767 x = TOP();
768 Py_INCREF(x);
769 PUSH(x);
770 continue;
771 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000772 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000773 Py_INCREF(x);
774 w = TOP();
775 Py_INCREF(w);
776 PUSH(x);
777 PUSH(w);
778 PUSH(x);
779 continue;
780 case 3:
781 x = POP();
782 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000783 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000784 Py_INCREF(w);
785 v = TOP();
786 Py_INCREF(v);
787 PUSH(w);
788 PUSH(x);
789 PUSH(v);
790 PUSH(w);
791 PUSH(x);
792 continue;
793 case 4:
794 x = POP();
795 Py_INCREF(x);
796 w = POP();
797 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000798 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000799 Py_INCREF(v);
800 u = TOP();
801 Py_INCREF(u);
802 PUSH(v);
803 PUSH(w);
804 PUSH(x);
805 PUSH(u);
806 PUSH(v);
807 PUSH(w);
808 PUSH(x);
809 continue;
810 case 5:
811 x = POP();
812 Py_INCREF(x);
813 w = POP();
814 Py_INCREF(w);
815 v = POP();
816 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000817 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000818 Py_INCREF(u);
819 t = TOP();
820 Py_INCREF(t);
821 PUSH(u);
822 PUSH(v);
823 PUSH(w);
824 PUSH(x);
825 PUSH(t);
826 PUSH(u);
827 PUSH(v);
828 PUSH(w);
829 PUSH(x);
830 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000831 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000832 Py_FatalError("invalid argument to DUP_TOPX"
833 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000834 }
Tim Peters35ba6892000-10-11 07:04:49 +0000835 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000836
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 case UNARY_POSITIVE:
838 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000839 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000840 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000842 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000844
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 case UNARY_NEGATIVE:
846 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000847 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000848 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000852
Guido van Rossum374a9221991-04-04 10:40:29 +0000853 case UNARY_NOT:
854 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000857 if (err == 0) {
858 Py_INCREF(Py_True);
859 PUSH(Py_True);
860 continue;
861 }
862 else if (err > 0) {
863 Py_INCREF(Py_False);
864 PUSH(Py_False);
865 err = 0;
866 continue;
867 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000869
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 case UNARY_CONVERT:
871 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000872 x = PyObject_Repr(v);
873 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000875 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000877
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878 case UNARY_INVERT:
879 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000880 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000881 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000883 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000884 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000885
Guido van Rossum50564e81996-01-12 01:13:16 +0000886 case BINARY_POWER:
887 w = POP();
888 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000889 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000890 Py_DECREF(v);
891 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000892 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000893 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000894 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000895
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 case BINARY_MULTIPLY:
897 w = POP();
898 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000899 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000900 Py_DECREF(v);
901 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000903 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000905
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 case BINARY_DIVIDE:
907 w = POP();
908 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000909 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000910 Py_DECREF(v);
911 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000913 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000915
Guido van Rossum4668b002001-08-08 05:00:18 +0000916 case BINARY_FLOOR_DIVIDE:
917 w = POP();
918 v = POP();
919 x = PyNumber_FloorDivide(v, w);
920 Py_DECREF(v);
921 Py_DECREF(w);
922 PUSH(x);
923 if (x != NULL) continue;
924 break;
925
926 case BINARY_TRUE_DIVIDE:
927 w = POP();
928 v = POP();
929 x = PyNumber_TrueDivide(v, w);
930 Py_DECREF(v);
931 Py_DECREF(w);
932 PUSH(x);
933 if (x != NULL) continue;
934 break;
935
Guido van Rossum374a9221991-04-04 10:40:29 +0000936 case BINARY_MODULO:
937 w = POP();
938 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000939 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000940 Py_DECREF(v);
941 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000943 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000945
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 case BINARY_ADD:
947 w = POP();
948 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000949 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000950 /* INLINE: int + int */
951 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000952 a = PyInt_AS_LONG(v);
953 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000954 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000955 if ((i^a) < 0 && (i^b) < 0)
956 goto slow_add;
957 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000958 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000959 else {
960 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000961 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000962 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 Py_DECREF(v);
964 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000966 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000968
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 case BINARY_SUBTRACT:
970 w = POP();
971 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000972 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000973 /* INLINE: int - int */
974 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000975 a = PyInt_AS_LONG(v);
976 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000977 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000978 if ((i^a) < 0 && (i^~b) < 0)
979 goto slow_sub;
980 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000981 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000982 else {
983 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000984 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000985 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 Py_DECREF(v);
987 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000989 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000991
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 case BINARY_SUBSCR:
993 w = POP();
994 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000995 if (v->ob_type == &PyList_Type && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000996 /* INLINE: list[int] */
997 long i = PyInt_AsLong(w);
998 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000999 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001000 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 PyErr_SetString(PyExc_IndexError,
1003 "list index out of range");
1004 x = NULL;
1005 }
1006 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001007 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001008 Py_INCREF(x);
1009 }
1010 }
1011 else
1012 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 Py_DECREF(v);
1014 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001016 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001018
Guido van Rossum7928cd71991-10-24 14:59:31 +00001019 case BINARY_LSHIFT:
1020 w = POP();
1021 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001022 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001023 Py_DECREF(v);
1024 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001025 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001026 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001028
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 case BINARY_RSHIFT:
1030 w = POP();
1031 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001032 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001033 Py_DECREF(v);
1034 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001035 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001036 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001037 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001038
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 case BINARY_AND:
1040 w = POP();
1041 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001042 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001043 Py_DECREF(v);
1044 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001045 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001046 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001047 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001048
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 case BINARY_XOR:
1050 w = POP();
1051 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001052 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001053 Py_DECREF(v);
1054 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001055 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001056 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001057 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001058
Guido van Rossum7928cd71991-10-24 14:59:31 +00001059 case BINARY_OR:
1060 w = POP();
1061 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001062 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001063 Py_DECREF(v);
1064 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001065 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001066 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001067 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001068
1069 case INPLACE_POWER:
1070 w = POP();
1071 v = POP();
1072 x = PyNumber_InPlacePower(v, w, Py_None);
1073 Py_DECREF(v);
1074 Py_DECREF(w);
1075 PUSH(x);
1076 if (x != NULL) continue;
1077 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001078
Thomas Wouters434d0822000-08-24 20:11:32 +00001079 case INPLACE_MULTIPLY:
1080 w = POP();
1081 v = POP();
1082 x = PyNumber_InPlaceMultiply(v, w);
1083 Py_DECREF(v);
1084 Py_DECREF(w);
1085 PUSH(x);
1086 if (x != NULL) continue;
1087 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001088
Thomas Wouters434d0822000-08-24 20:11:32 +00001089 case INPLACE_DIVIDE:
1090 w = POP();
1091 v = POP();
1092 x = PyNumber_InPlaceDivide(v, w);
1093 Py_DECREF(v);
1094 Py_DECREF(w);
1095 PUSH(x);
1096 if (x != NULL) continue;
1097 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001098
Guido van Rossum4668b002001-08-08 05:00:18 +00001099 case INPLACE_FLOOR_DIVIDE:
1100 w = POP();
1101 v = POP();
1102 x = PyNumber_InPlaceFloorDivide(v, w);
1103 Py_DECREF(v);
1104 Py_DECREF(w);
1105 PUSH(x);
1106 if (x != NULL) continue;
1107 break;
1108
1109 case INPLACE_TRUE_DIVIDE:
1110 w = POP();
1111 v = POP();
1112 x = PyNumber_InPlaceTrueDivide(v, w);
1113 Py_DECREF(v);
1114 Py_DECREF(w);
1115 PUSH(x);
1116 if (x != NULL) continue;
1117 break;
1118
Thomas Wouters434d0822000-08-24 20:11:32 +00001119 case INPLACE_MODULO:
1120 w = POP();
1121 v = POP();
1122 x = PyNumber_InPlaceRemainder(v, w);
1123 Py_DECREF(v);
1124 Py_DECREF(w);
1125 PUSH(x);
1126 if (x != NULL) continue;
1127 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001128
Thomas Wouters434d0822000-08-24 20:11:32 +00001129 case INPLACE_ADD:
1130 w = POP();
1131 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001132 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001133 /* INLINE: int + int */
1134 register long a, b, i;
1135 a = PyInt_AS_LONG(v);
1136 b = PyInt_AS_LONG(w);
1137 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001138 if ((i^a) < 0 && (i^b) < 0)
1139 goto slow_iadd;
1140 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001141 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001142 else {
1143 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001144 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001145 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001146 Py_DECREF(v);
1147 Py_DECREF(w);
1148 PUSH(x);
1149 if (x != NULL) continue;
1150 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001151
Thomas Wouters434d0822000-08-24 20:11:32 +00001152 case INPLACE_SUBTRACT:
1153 w = POP();
1154 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001155 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001156 /* INLINE: int - int */
1157 register long a, b, i;
1158 a = PyInt_AS_LONG(v);
1159 b = PyInt_AS_LONG(w);
1160 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001161 if ((i^a) < 0 && (i^~b) < 0)
1162 goto slow_isub;
1163 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001164 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001165 else {
1166 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001167 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001168 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001169 Py_DECREF(v);
1170 Py_DECREF(w);
1171 PUSH(x);
1172 if (x != NULL) continue;
1173 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001174
Thomas Wouters434d0822000-08-24 20:11:32 +00001175 case INPLACE_LSHIFT:
1176 w = POP();
1177 v = POP();
1178 x = PyNumber_InPlaceLshift(v, w);
1179 Py_DECREF(v);
1180 Py_DECREF(w);
1181 PUSH(x);
1182 if (x != NULL) continue;
1183 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001184
Thomas Wouters434d0822000-08-24 20:11:32 +00001185 case INPLACE_RSHIFT:
1186 w = POP();
1187 v = POP();
1188 x = PyNumber_InPlaceRshift(v, w);
1189 Py_DECREF(v);
1190 Py_DECREF(w);
1191 PUSH(x);
1192 if (x != NULL) continue;
1193 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001194
Thomas Wouters434d0822000-08-24 20:11:32 +00001195 case INPLACE_AND:
1196 w = POP();
1197 v = POP();
1198 x = PyNumber_InPlaceAnd(v, w);
1199 Py_DECREF(v);
1200 Py_DECREF(w);
1201 PUSH(x);
1202 if (x != NULL) continue;
1203 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001204
Thomas Wouters434d0822000-08-24 20:11:32 +00001205 case INPLACE_XOR:
1206 w = POP();
1207 v = POP();
1208 x = PyNumber_InPlaceXor(v, w);
1209 Py_DECREF(v);
1210 Py_DECREF(w);
1211 PUSH(x);
1212 if (x != NULL) continue;
1213 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001214
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 case INPLACE_OR:
1216 w = POP();
1217 v = POP();
1218 x = PyNumber_InPlaceOr(v, w);
1219 Py_DECREF(v);
1220 Py_DECREF(w);
1221 PUSH(x);
1222 if (x != NULL) continue;
1223 break;
1224
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 case SLICE+0:
1226 case SLICE+1:
1227 case SLICE+2:
1228 case SLICE+3:
1229 if ((opcode-SLICE) & 2)
1230 w = POP();
1231 else
1232 w = NULL;
1233 if ((opcode-SLICE) & 1)
1234 v = POP();
1235 else
1236 v = NULL;
1237 u = POP();
1238 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 Py_DECREF(u);
1240 Py_XDECREF(v);
1241 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001243 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001245
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 case STORE_SLICE+0:
1247 case STORE_SLICE+1:
1248 case STORE_SLICE+2:
1249 case STORE_SLICE+3:
1250 if ((opcode-STORE_SLICE) & 2)
1251 w = POP();
1252 else
1253 w = NULL;
1254 if ((opcode-STORE_SLICE) & 1)
1255 v = POP();
1256 else
1257 v = NULL;
1258 u = POP();
1259 t = POP();
1260 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 Py_DECREF(t);
1262 Py_DECREF(u);
1263 Py_XDECREF(v);
1264 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001265 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001267
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 case DELETE_SLICE+0:
1269 case DELETE_SLICE+1:
1270 case DELETE_SLICE+2:
1271 case DELETE_SLICE+3:
1272 if ((opcode-DELETE_SLICE) & 2)
1273 w = POP();
1274 else
1275 w = NULL;
1276 if ((opcode-DELETE_SLICE) & 1)
1277 v = POP();
1278 else
1279 v = NULL;
1280 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001281 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001283 Py_DECREF(u);
1284 Py_XDECREF(v);
1285 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001286 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001288
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 case STORE_SUBSCR:
1290 w = POP();
1291 v = POP();
1292 u = POP();
1293 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001294 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 Py_DECREF(u);
1296 Py_DECREF(v);
1297 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001298 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001300
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 case DELETE_SUBSCR:
1302 w = POP();
1303 v = POP();
1304 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001305 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001306 Py_DECREF(v);
1307 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001308 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001310
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 case PRINT_EXPR:
1312 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001313 w = PySys_GetObject("displayhook");
1314 if (w == NULL) {
1315 PyErr_SetString(PyExc_RuntimeError,
1316 "lost sys.displayhook");
1317 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001318 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001319 }
1320 if (err == 0) {
1321 x = Py_BuildValue("(O)", v);
1322 if (x == NULL)
1323 err = -1;
1324 }
1325 if (err == 0) {
1326 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001327 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001328 if (w == NULL)
1329 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001331 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001332 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001334
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001335 case PRINT_ITEM_TO:
1336 w = stream = POP();
1337 /* fall through to PRINT_ITEM */
1338
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 case PRINT_ITEM:
1340 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001341 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001342 w = PySys_GetObject("stdout");
1343 if (w == NULL) {
1344 PyErr_SetString(PyExc_RuntimeError,
1345 "lost sys.stdout");
1346 err = -1;
1347 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001348 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001349 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001350 err = PyFile_WriteString(" ", w);
1351 if (err == 0)
1352 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001354 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001355 char *s = PyString_AsString(v);
1356 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001357 if (len > 0 &&
1358 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001359 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001362 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001363 Py_XDECREF(stream);
1364 stream = NULL;
1365 if (err == 0)
1366 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001368
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001369 case PRINT_NEWLINE_TO:
1370 w = stream = POP();
1371 /* fall through to PRINT_NEWLINE */
1372
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001374 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001375 w = PySys_GetObject("stdout");
1376 if (w == NULL)
1377 PyErr_SetString(PyExc_RuntimeError,
1378 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001379 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001380 if (w != NULL) {
1381 err = PyFile_WriteString("\n", w);
1382 if (err == 0)
1383 PyFile_SoftSpace(w, 0);
1384 }
1385 Py_XDECREF(stream);
1386 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001388
Thomas Wouters434d0822000-08-24 20:11:32 +00001389
1390#ifdef CASE_TOO_BIG
1391 default: switch (opcode) {
1392#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 case BREAK_LOOP:
1394 why = WHY_BREAK;
1395 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001396
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001397 case CONTINUE_LOOP:
1398 retval = PyInt_FromLong(oparg);
1399 why = WHY_CONTINUE;
1400 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001401
Guido van Rossumf10570b1995-07-07 22:53:21 +00001402 case RAISE_VARARGS:
1403 u = v = w = NULL;
1404 switch (oparg) {
1405 case 3:
1406 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001407 /* Fallthrough */
1408 case 2:
1409 v = POP(); /* value */
1410 /* Fallthrough */
1411 case 1:
1412 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001413 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001414 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001415 break;
1416 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001417 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001418 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001419 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001420 break;
1421 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001423
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001425 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001426 PyErr_SetString(PyExc_SystemError,
1427 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001428 break;
1429 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001431 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001432 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001433
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 case RETURN_VALUE:
1435 retval = POP();
1436 why = WHY_RETURN;
1437 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001438
Tim Peters5ca576e2001-06-18 22:08:13 +00001439 case YIELD_VALUE:
1440 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001441 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001442 f->f_lasti = INSTR_OFFSET();
1443 why = WHY_YIELD;
1444 break;
1445
1446
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001447 case EXEC_STMT:
1448 w = POP();
1449 v = POP();
1450 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001451 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001452 Py_DECREF(u);
1453 Py_DECREF(v);
1454 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001455 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001456
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 case POP_BLOCK:
1458 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001459 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 while (STACK_LEVEL() > b->b_level) {
1461 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 }
1464 }
1465 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001466
Guido van Rossum374a9221991-04-04 10:40:29 +00001467 case END_FINALLY:
1468 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001469 if (PyInt_Check(v)) {
1470 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001471 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001472 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001473 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 retval = POP();
1475 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001476 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001478 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001481 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 else if (v != Py_None) {
1484 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 "'finally' pops bad exception");
1486 why = WHY_EXCEPTION;
1487 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001490
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001492 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001494 w = POP();
1495 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 Py_DECREF(u);
1498 Py_DECREF(v);
1499 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001501
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 case STORE_NAME:
1503 w = GETNAMEV(oparg);
1504 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001505 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001506 PyErr_Format(PyExc_SystemError,
1507 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001508 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001509 break;
1510 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 err = PyDict_SetItem(x, w, v);
1512 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001514
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001516 w = GETNAMEV(oparg);
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 when deleting %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 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001524 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001525 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001527
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001528 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001530 if (PyTuple_Check(v)) {
1531 if (PyTuple_Size(v) != oparg) {
1532 PyErr_SetString(PyExc_ValueError,
1533 "unpack tuple of wrong size");
1534 why = WHY_EXCEPTION;
1535 }
1536 else {
1537 for (; --oparg >= 0; ) {
1538 w = PyTuple_GET_ITEM(v, oparg);
1539 Py_INCREF(w);
1540 PUSH(w);
1541 }
1542 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001544 else if (PyList_Check(v)) {
1545 if (PyList_Size(v) != oparg) {
1546 PyErr_SetString(PyExc_ValueError,
1547 "unpack list of wrong size");
1548 why = WHY_EXCEPTION;
1549 }
1550 else {
1551 for (; --oparg >= 0; ) {
1552 w = PyList_GET_ITEM(v, oparg);
1553 Py_INCREF(w);
1554 PUSH(w);
1555 }
1556 }
1557 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001558 else if (unpack_iterable(v, oparg,
1559 stack_pointer + oparg))
1560 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001561 else {
1562 if (PyErr_ExceptionMatches(PyExc_TypeError))
1563 PyErr_SetString(PyExc_TypeError,
1564 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001565 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001566 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001567 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001569
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001571 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 v = POP();
1573 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1575 Py_DECREF(v);
1576 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001578
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001580 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001582 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1583 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001584 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001586
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001587 case STORE_GLOBAL:
1588 w = GETNAMEV(oparg);
1589 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 err = PyDict_SetItem(f->f_globals, w, v);
1591 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001592 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001593
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001594 case DELETE_GLOBAL:
1595 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001597 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001598 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001599 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001600
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 case LOAD_CONST:
1602 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 PUSH(x);
1605 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001606
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001608 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001609 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001610 PyErr_Format(PyExc_SystemError,
1611 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001612 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001613 break;
1614 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001615 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001619 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001621 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001622 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001623 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001624 break;
1625 }
1626 }
1627 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001628 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 PUSH(x);
1630 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001631
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001633 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001638 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001639 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001640 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 break;
1642 }
1643 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 PUSH(x);
1646 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001647
Guido van Rossum9bfef441993-03-29 10:43:31 +00001648 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001649 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001650 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001651 format_exc_check_arg(
1652 PyExc_UnboundLocalError,
1653 UNBOUNDLOCAL_ERROR_MSG,
1654 PyTuple_GetItem(co->co_varnames, oparg)
1655 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001656 break;
1657 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001659 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001660 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001661 break;
1662
1663 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001664 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001665 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001666 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001667
1668 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001669 x = GETLOCAL(oparg);
1670 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001671 format_exc_check_arg(
1672 PyExc_UnboundLocalError,
1673 UNBOUNDLOCAL_ERROR_MSG,
1674 PyTuple_GetItem(co->co_varnames, oparg)
1675 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001676 break;
1677 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001678 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001679 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001680
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001681 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001682 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001683 Py_INCREF(x);
1684 PUSH(x);
1685 break;
1686
1687 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001688 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001689 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001690 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001691 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001692 v = PyTuple_GetItem(co->co_cellvars,
1693 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001694 format_exc_check_arg(
1695 PyExc_UnboundLocalError,
1696 UNBOUNDLOCAL_ERROR_MSG,
1697 v);
1698 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001699 v = PyTuple_GetItem(
1700 co->co_freevars,
1701 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001702 format_exc_check_arg(
1703 PyExc_NameError,
1704 UNBOUNDFREE_ERROR_MSG,
1705 v);
1706 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001707 err = -1;
1708 break;
1709 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001710 PUSH(w);
1711 break;
1712
1713 case STORE_DEREF:
1714 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001715 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001716 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001717 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001718 continue;
1719
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001721 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 if (x != NULL) {
1723 for (; --oparg >= 0;) {
1724 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001725 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 }
1727 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001728 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 }
1730 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001731
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 if (x != NULL) {
1735 for (; --oparg >= 0;) {
1736 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001737 PyList_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_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001745 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001747 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001749
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001751 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 x = PyObject_GetAttr(v, w);
1754 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001756 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001758
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 case COMPARE_OP:
1760 w = POP();
1761 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001762 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001763 /* INLINE: cmp(int, int) */
1764 register long a, b;
1765 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001766 a = PyInt_AS_LONG(v);
1767 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001768 switch (oparg) {
1769 case LT: res = a < b; break;
1770 case LE: res = a <= b; break;
1771 case EQ: res = a == b; break;
1772 case NE: res = a != b; break;
1773 case GT: res = a > b; break;
1774 case GE: res = a >= b; break;
1775 case IS: res = v == w; break;
1776 case IS_NOT: res = v != w; break;
1777 default: goto slow_compare;
1778 }
1779 x = res ? Py_True : Py_False;
1780 Py_INCREF(x);
1781 }
1782 else {
1783 slow_compare:
1784 x = cmp_outcome(oparg, v, w);
1785 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001786 Py_DECREF(v);
1787 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001789 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001791
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001793 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001795 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001796 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001797 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001798 break;
1799 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001800 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001801 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001802 w,
1803 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001804 f->f_locals == NULL ?
1805 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001806 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001807 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001808 if (w == NULL) {
1809 x = NULL;
1810 break;
1811 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001812 x = PyEval_CallObject(x, w);
1813 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001814 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001815 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001817
Thomas Wouters52152252000-08-17 22:55:00 +00001818 case IMPORT_STAR:
1819 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001821 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001822 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001823 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001824 break;
1825 }
Thomas Wouters52152252000-08-17 22:55:00 +00001826 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001827 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001828 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001829 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001830 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001831
Thomas Wouters52152252000-08-17 22:55:00 +00001832 case IMPORT_FROM:
1833 w = GETNAMEV(oparg);
1834 v = TOP();
1835 x = import_from(v, w);
1836 PUSH(x);
1837 if (x != NULL) continue;
1838 break;
1839
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 case JUMP_FORWARD:
1841 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001842 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001843
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001846 if (err > 0)
1847 err = 0;
1848 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001850 else
1851 break;
1852 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001853
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001856 if (err > 0) {
1857 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001859 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001860 else if (err == 0)
1861 ;
1862 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_ABSOLUTE:
1867 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001868 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001869
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001870 case GET_ITER:
1871 /* before: [obj]; after [getiter(obj)] */
1872 v = POP();
1873 x = PyObject_GetIter(v);
1874 Py_DECREF(v);
1875 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001876 PUSH(x);
1877 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001878 }
1879 break;
1880
1881 case FOR_ITER:
1882 /* before: [iter]; after: [iter, iter()] *or* [] */
1883 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001884 x = PyIter_Next(v);
1885 if (x != NULL) {
1886 PUSH(x);
1887 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001888 }
Tim Petersf4848da2001-05-05 00:14:56 +00001889 if (!PyErr_Occurred()) {
1890 /* iterator ended normally */
1891 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001892 Py_DECREF(v);
1893 JUMPBY(oparg);
1894 continue;
1895 }
1896 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001897
Guido van Rossum374a9221991-04-04 10:40:29 +00001898 case FOR_LOOP:
1899 /* for v in s: ...
1900 On entry: stack contains s, i.
1901 On exit: stack contains s, i+1, s[i];
1902 but if loop exhausted:
1903 s, i are popped, and we jump */
1904 w = POP(); /* Loop index */
1905 v = POP(); /* Sequence object */
1906 u = loop_subscript(v, w);
1907 if (u != NULL) {
1908 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001909 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001910 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001911 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001912 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001913 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001914 }
1915 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001916 Py_DECREF(v);
1917 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001918 /* A NULL can mean "s exhausted"
1919 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001920 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001921 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001922 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001923 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001924 continue;
1925 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001926 }
1927 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001928
Guido van Rossum374a9221991-04-04 10:40:29 +00001929 case SETUP_LOOP:
1930 case SETUP_EXCEPT:
1931 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001932 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001933 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001934 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001935
Guido van Rossum374a9221991-04-04 10:40:29 +00001936 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001937#ifdef LLTRACE
1938 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001939 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001940#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001941 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001942 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001943 continue;
1944 /* Trace each line of code reached */
1945 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001946 /* Inline call_trace() for performance: */
1947 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001948 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001949 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1950 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001951 tstate->use_tracing = (tstate->c_tracefunc
1952 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001953 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001954 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001955
1956 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001957 {
1958 int na = oparg & 0xff;
1959 int nk = (oparg>>8) & 0xff;
1960 int n = na + 2 * nk;
1961 PyObject **pfunc = stack_pointer - n - 1;
1962 PyObject *func = *pfunc;
1963 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1964
1965 /* Always dispatch PyCFunction first, because
1966 these are presumed to be the most frequent
1967 callable object.
1968 */
1969 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001970 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001971 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001972 x = do_call(func, &stack_pointer,
1973 na, nk);
1974 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001975 PyObject *callargs;
1976 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001977 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001978 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001979 } else
1980 x = fast_cfunction(func,
1981 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001982 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001983 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001984 && PyMethod_GET_SELF(func) != NULL) {
1985 /* optimize access to bound methods */
1986 PyObject *self = PyMethod_GET_SELF(func);
1987 Py_INCREF(self);
1988 func = PyMethod_GET_FUNCTION(func);
1989 Py_INCREF(func);
1990 Py_DECREF(*pfunc);
1991 *pfunc = self;
1992 na++;
1993 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001994 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001995 Py_INCREF(func);
1996 if (PyFunction_Check(func)) {
1997 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001998 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001999 } else {
2000 x = do_call(func, &stack_pointer,
2001 na, nk);
2002 }
2003 Py_DECREF(func);
2004 }
2005
2006 while (stack_pointer > pfunc) {
2007 w = POP();
2008 Py_DECREF(w);
2009 }
2010 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002011 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002012 continue;
2013 break;
2014 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002015
Jeremy Hylton76901512000-03-28 23:49:17 +00002016 case CALL_FUNCTION_VAR:
2017 case CALL_FUNCTION_KW:
2018 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002019 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002020 int na = oparg & 0xff;
2021 int nk = (oparg>>8) & 0xff;
2022 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002023 int n = na + 2 * nk;
2024 PyObject **pfunc, *func;
2025 if (flags & CALL_FLAG_VAR)
2026 n++;
2027 if (flags & CALL_FLAG_KW)
2028 n++;
2029 pfunc = stack_pointer - n - 1;
2030 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002031 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002032
Guido van Rossumac7be682001-01-17 15:42:30 +00002033 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002034 && PyMethod_GET_SELF(func) != NULL) {
2035 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002036 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002037 func = PyMethod_GET_FUNCTION(func);
2038 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002039 Py_DECREF(*pfunc);
2040 *pfunc = self;
2041 na++;
2042 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002043 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002044 Py_INCREF(func);
2045 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002046 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002047
Jeremy Hylton76901512000-03-28 23:49:17 +00002048 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002049 w = POP();
2050 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002051 }
2052 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002053 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002054 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002055 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002056 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002057
Guido van Rossum681d79a1995-07-18 14:51:37 +00002058 case MAKE_FUNCTION:
2059 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002060 x = PyFunction_New(v, f->f_globals);
2061 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002062 /* XXX Maybe this should be a separate opcode? */
2063 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002065 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002067 x = NULL;
2068 break;
2069 }
2070 while (--oparg >= 0) {
2071 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002073 }
2074 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002076 }
2077 PUSH(x);
2078 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002079
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002080 case MAKE_CLOSURE:
2081 {
2082 int nfree;
2083 v = POP(); /* code object */
2084 x = PyFunction_New(v, f->f_globals);
2085 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2086 Py_DECREF(v);
2087 /* XXX Maybe this should be a separate opcode? */
2088 if (x != NULL && nfree > 0) {
2089 v = PyTuple_New(nfree);
2090 if (v == NULL) {
2091 Py_DECREF(x);
2092 x = NULL;
2093 break;
2094 }
2095 while (--nfree >= 0) {
2096 w = POP();
2097 PyTuple_SET_ITEM(v, nfree, w);
2098 }
2099 err = PyFunction_SetClosure(x, v);
2100 Py_DECREF(v);
2101 }
2102 if (x != NULL && oparg > 0) {
2103 v = PyTuple_New(oparg);
2104 if (v == NULL) {
2105 Py_DECREF(x);
2106 x = NULL;
2107 break;
2108 }
2109 while (--oparg >= 0) {
2110 w = POP();
2111 PyTuple_SET_ITEM(v, oparg, w);
2112 }
2113 err = PyFunction_SetDefaults(x, v);
2114 Py_DECREF(v);
2115 }
2116 PUSH(x);
2117 break;
2118 }
2119
Guido van Rossum8861b741996-07-30 16:49:37 +00002120 case BUILD_SLICE:
2121 if (oparg == 3)
2122 w = POP();
2123 else
2124 w = NULL;
2125 v = POP();
2126 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002127 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 Py_DECREF(u);
2129 Py_DECREF(v);
2130 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002131 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002132 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002133 break;
2134
Fred Drakeef8ace32000-08-24 00:32:09 +00002135 case EXTENDED_ARG:
2136 opcode = NEXTOP();
2137 oparg = oparg<<16 | NEXTARG();
2138 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002139
Guido van Rossum374a9221991-04-04 10:40:29 +00002140 default:
2141 fprintf(stderr,
2142 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002143 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002145 why = WHY_EXCEPTION;
2146 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002147
2148#ifdef CASE_TOO_BIG
2149 }
2150#endif
2151
Guido van Rossum374a9221991-04-04 10:40:29 +00002152 } /* switch */
2153
2154 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002155
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002157
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002159 if (err == 0 && x != NULL) {
2160#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002161 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002162 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002163 fprintf(stderr,
2164 "XXX undetected error\n");
2165 else
2166#endif
2167 continue; /* Normal, fast path */
2168 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 err = 0;
2172 }
2173
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002175
Guido van Rossum374a9221991-04-04 10:40:29 +00002176 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002178 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002179 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 why = WHY_EXCEPTION;
2181 }
2182 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002183#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002185 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002187 fprintf(stderr,
2188 "XXX undetected error (why=%d)\n",
2189 why);
2190 why = WHY_EXCEPTION;
2191 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 }
2193#endif
2194
2195 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002196
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002198 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002200 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002201 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002202
Fred Drake8f51f542001-10-04 14:48:42 +00002203 if (tstate->c_tracefunc != NULL)
2204 call_exc_trace(tstate->c_tracefunc,
2205 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002206 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002207
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002209
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 if (why == WHY_RERAISE)
2211 why = WHY_EXCEPTION;
2212
2213 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002214
Tim Peters5ca576e2001-06-18 22:08:13 +00002215 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002217
2218 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2219 /* For a continue inside a try block,
2220 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002221 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2222 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002223 why = WHY_NOT;
2224 JUMPTO(PyInt_AS_LONG(retval));
2225 Py_DECREF(retval);
2226 break;
2227 }
2228
Guido van Rossum374a9221991-04-04 10:40:29 +00002229 while (STACK_LEVEL() > b->b_level) {
2230 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002231 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 }
2233 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2234 why = WHY_NOT;
2235 JUMPTO(b->b_handler);
2236 break;
2237 }
2238 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002239 (b->b_type == SETUP_EXCEPT &&
2240 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002241 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002242 PyObject *exc, *val, *tb;
2243 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002244 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002245 val = Py_None;
2246 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002247 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 /* Make the raw exception data
2249 available to the handler,
2250 so a program can emulate the
2251 Python main loop. Don't do
2252 this for 'finally'. */
2253 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002254 PyErr_NormalizeException(
2255 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002256 set_exc_info(tstate,
2257 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002258 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002259 if (tb == NULL) {
2260 Py_INCREF(Py_None);
2261 PUSH(Py_None);
2262 } else
2263 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002264 PUSH(val);
2265 PUSH(exc);
2266 }
2267 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002268 if (why == WHY_RETURN ||
2269 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002270 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002272 PUSH(v);
2273 }
2274 why = WHY_NOT;
2275 JUMPTO(b->b_handler);
2276 break;
2277 }
2278 } /* unwind stack */
2279
2280 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002281
Guido van Rossum374a9221991-04-04 10:40:29 +00002282 if (why != WHY_NOT)
2283 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002284
Guido van Rossum374a9221991-04-04 10:40:29 +00002285 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002286
Tim Peters5ca576e2001-06-18 22:08:13 +00002287 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002288 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002289
Fred Drake9e3ad782001-07-03 23:39:52 +00002290 if (tstate->use_tracing) {
2291 if (tstate->c_tracefunc
2292 && (why == WHY_RETURN || why == WHY_YIELD)) {
2293 if (call_trace(tstate->c_tracefunc,
2294 tstate->c_traceobj, f,
2295 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002296 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002297 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002298 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002299 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002300 }
Fred Drake8f51f542001-10-04 14:48:42 +00002301 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002302 if (why == WHY_EXCEPTION)
2303 call_trace_protected(tstate->c_profilefunc,
2304 tstate->c_profileobj, f,
2305 PyTrace_RETURN);
2306 else if (call_trace(tstate->c_profilefunc,
2307 tstate->c_profileobj, f,
2308 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002309 Py_XDECREF(retval);
2310 retval = NULL;
2311 why = WHY_EXCEPTION;
2312 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002313 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002314 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002315
Guido van Rossuma027efa1997-05-05 20:56:21 +00002316 reset_exc_info(tstate);
2317
Tim Peters5ca576e2001-06-18 22:08:13 +00002318 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002319 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002320 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002321
Guido van Rossum96a42c81992-01-12 02:29:51 +00002322 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002323}
2324
Tim Peters6d6c1a32001-08-02 04:15:00 +00002325PyObject *
2326PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002327 PyObject **args, int argcount, PyObject **kws, int kwcount,
2328 PyObject **defs, int defcount, PyObject *closure)
2329{
2330 register PyFrameObject *f;
2331 register PyObject *retval = NULL;
2332 register PyObject **fastlocals, **freevars;
2333 PyThreadState *tstate = PyThreadState_GET();
2334 PyObject *x, *u;
2335
2336 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002337 PyErr_SetString(PyExc_SystemError,
2338 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002339 return NULL;
2340 }
2341
2342 f = PyFrame_New(tstate, /*back*/
2343 co, /*code*/
2344 globals, locals);
2345 if (f == NULL)
2346 return NULL;
2347
2348 fastlocals = f->f_localsplus;
2349 freevars = f->f_localsplus + f->f_nlocals;
2350
2351 if (co->co_argcount > 0 ||
2352 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2353 int i;
2354 int n = argcount;
2355 PyObject *kwdict = NULL;
2356 if (co->co_flags & CO_VARKEYWORDS) {
2357 kwdict = PyDict_New();
2358 if (kwdict == NULL)
2359 goto fail;
2360 i = co->co_argcount;
2361 if (co->co_flags & CO_VARARGS)
2362 i++;
2363 SETLOCAL(i, kwdict);
2364 }
2365 if (argcount > co->co_argcount) {
2366 if (!(co->co_flags & CO_VARARGS)) {
2367 PyErr_Format(PyExc_TypeError,
2368 "%.200s() takes %s %d "
2369 "%sargument%s (%d given)",
2370 PyString_AsString(co->co_name),
2371 defcount ? "at most" : "exactly",
2372 co->co_argcount,
2373 kwcount ? "non-keyword " : "",
2374 co->co_argcount == 1 ? "" : "s",
2375 argcount);
2376 goto fail;
2377 }
2378 n = co->co_argcount;
2379 }
2380 for (i = 0; i < n; i++) {
2381 x = args[i];
2382 Py_INCREF(x);
2383 SETLOCAL(i, x);
2384 }
2385 if (co->co_flags & CO_VARARGS) {
2386 u = PyTuple_New(argcount - n);
2387 if (u == NULL)
2388 goto fail;
2389 SETLOCAL(co->co_argcount, u);
2390 for (i = n; i < argcount; i++) {
2391 x = args[i];
2392 Py_INCREF(x);
2393 PyTuple_SET_ITEM(u, i-n, x);
2394 }
2395 }
2396 for (i = 0; i < kwcount; i++) {
2397 PyObject *keyword = kws[2*i];
2398 PyObject *value = kws[2*i + 1];
2399 int j;
2400 if (keyword == NULL || !PyString_Check(keyword)) {
2401 PyErr_Format(PyExc_TypeError,
2402 "%.200s() keywords must be strings",
2403 PyString_AsString(co->co_name));
2404 goto fail;
2405 }
2406 /* XXX slow -- speed up using dictionary? */
2407 for (j = 0; j < co->co_argcount; j++) {
2408 PyObject *nm = PyTuple_GET_ITEM(
2409 co->co_varnames, j);
2410 int cmp = PyObject_RichCompareBool(
2411 keyword, nm, Py_EQ);
2412 if (cmp > 0)
2413 break;
2414 else if (cmp < 0)
2415 goto fail;
2416 }
2417 /* Check errors from Compare */
2418 if (PyErr_Occurred())
2419 goto fail;
2420 if (j >= co->co_argcount) {
2421 if (kwdict == NULL) {
2422 PyErr_Format(PyExc_TypeError,
2423 "%.200s() got an unexpected "
2424 "keyword argument '%.400s'",
2425 PyString_AsString(co->co_name),
2426 PyString_AsString(keyword));
2427 goto fail;
2428 }
2429 PyDict_SetItem(kwdict, keyword, value);
2430 }
2431 else {
2432 if (GETLOCAL(j) != NULL) {
2433 PyErr_Format(PyExc_TypeError,
2434 "%.200s() got multiple "
2435 "values for keyword "
2436 "argument '%.400s'",
2437 PyString_AsString(co->co_name),
2438 PyString_AsString(keyword));
2439 goto fail;
2440 }
2441 Py_INCREF(value);
2442 SETLOCAL(j, value);
2443 }
2444 }
2445 if (argcount < co->co_argcount) {
2446 int m = co->co_argcount - defcount;
2447 for (i = argcount; i < m; i++) {
2448 if (GETLOCAL(i) == NULL) {
2449 PyErr_Format(PyExc_TypeError,
2450 "%.200s() takes %s %d "
2451 "%sargument%s (%d given)",
2452 PyString_AsString(co->co_name),
2453 ((co->co_flags & CO_VARARGS) ||
2454 defcount) ? "at least"
2455 : "exactly",
2456 m, kwcount ? "non-keyword " : "",
2457 m == 1 ? "" : "s", i);
2458 goto fail;
2459 }
2460 }
2461 if (n > m)
2462 i = n - m;
2463 else
2464 i = 0;
2465 for (; i < defcount; i++) {
2466 if (GETLOCAL(m+i) == NULL) {
2467 PyObject *def = defs[i];
2468 Py_INCREF(def);
2469 SETLOCAL(m+i, def);
2470 }
2471 }
2472 }
2473 }
2474 else {
2475 if (argcount > 0 || kwcount > 0) {
2476 PyErr_Format(PyExc_TypeError,
2477 "%.200s() takes no arguments (%d given)",
2478 PyString_AsString(co->co_name),
2479 argcount + kwcount);
2480 goto fail;
2481 }
2482 }
2483 /* Allocate and initialize storage for cell vars, and copy free
2484 vars into frame. This isn't too efficient right now. */
2485 if (f->f_ncells) {
2486 int i = 0, j = 0, nargs, found;
2487 char *cellname, *argname;
2488 PyObject *c;
2489
2490 nargs = co->co_argcount;
2491 if (co->co_flags & CO_VARARGS)
2492 nargs++;
2493 if (co->co_flags & CO_VARKEYWORDS)
2494 nargs++;
2495
2496 /* Check for cells that shadow args */
2497 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2498 cellname = PyString_AS_STRING(
2499 PyTuple_GET_ITEM(co->co_cellvars, i));
2500 found = 0;
2501 while (j < nargs) {
2502 argname = PyString_AS_STRING(
2503 PyTuple_GET_ITEM(co->co_varnames, j));
2504 if (strcmp(cellname, argname) == 0) {
2505 c = PyCell_New(GETLOCAL(j));
2506 if (c == NULL)
2507 goto fail;
2508 GETLOCAL(f->f_nlocals + i) = c;
2509 found = 1;
2510 break;
2511 }
2512 j++;
2513 }
2514 if (found == 0) {
2515 c = PyCell_New(NULL);
2516 if (c == NULL)
2517 goto fail;
2518 SETLOCAL(f->f_nlocals + i, c);
2519 }
2520 }
2521 /* Initialize any that are left */
2522 while (i < f->f_ncells) {
2523 c = PyCell_New(NULL);
2524 if (c == NULL)
2525 goto fail;
2526 SETLOCAL(f->f_nlocals + i, c);
2527 i++;
2528 }
2529 }
2530 if (f->f_nfreevars) {
2531 int i;
2532 for (i = 0; i < f->f_nfreevars; ++i) {
2533 PyObject *o = PyTuple_GET_ITEM(closure, i);
2534 Py_INCREF(o);
2535 freevars[f->f_ncells + i] = o;
2536 }
2537 }
2538
Tim Peters5ca576e2001-06-18 22:08:13 +00002539 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002540 /* Don't need to keep the reference to f_back, it will be set
2541 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002542 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002543 f->f_back = NULL;
2544
2545 /* Create a new generator that owns the ready to run frame
2546 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002547 return gen_new(f);
2548 }
2549
2550 retval = eval_frame(f);
2551
2552 fail: /* Jump here from prelude on failure */
2553
2554 Py_DECREF(f);
2555 return retval;
2556}
2557
2558
Guido van Rossuma027efa1997-05-05 20:56:21 +00002559static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002560set_exc_info(PyThreadState *tstate,
2561 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562{
2563 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002564 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002565
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 frame = tstate->frame;
2567 if (frame->f_exc_type == NULL) {
2568 /* This frame didn't catch an exception before */
2569 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 if (tstate->exc_type == NULL) {
2571 Py_INCREF(Py_None);
2572 tstate->exc_type = Py_None;
2573 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002574 tmp_type = frame->f_exc_type;
2575 tmp_value = frame->f_exc_value;
2576 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 Py_XINCREF(tstate->exc_type);
2578 Py_XINCREF(tstate->exc_value);
2579 Py_XINCREF(tstate->exc_traceback);
2580 frame->f_exc_type = tstate->exc_type;
2581 frame->f_exc_value = tstate->exc_value;
2582 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002583 Py_XDECREF(tmp_type);
2584 Py_XDECREF(tmp_value);
2585 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 }
2587 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002588 tmp_type = tstate->exc_type;
2589 tmp_value = tstate->exc_value;
2590 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 Py_XINCREF(type);
2592 Py_XINCREF(value);
2593 Py_XINCREF(tb);
2594 tstate->exc_type = type;
2595 tstate->exc_value = value;
2596 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002597 Py_XDECREF(tmp_type);
2598 Py_XDECREF(tmp_value);
2599 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600 /* For b/w compatibility */
2601 PySys_SetObject("exc_type", type);
2602 PySys_SetObject("exc_value", value);
2603 PySys_SetObject("exc_traceback", tb);
2604}
2605
2606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002608{
2609 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002610 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 frame = tstate->frame;
2612 if (frame->f_exc_type != NULL) {
2613 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002614 tmp_type = tstate->exc_type;
2615 tmp_value = tstate->exc_value;
2616 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 Py_XINCREF(frame->f_exc_type);
2618 Py_XINCREF(frame->f_exc_value);
2619 Py_XINCREF(frame->f_exc_traceback);
2620 tstate->exc_type = frame->f_exc_type;
2621 tstate->exc_value = frame->f_exc_value;
2622 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002623 Py_XDECREF(tmp_type);
2624 Py_XDECREF(tmp_value);
2625 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626 /* For b/w compatibility */
2627 PySys_SetObject("exc_type", frame->f_exc_type);
2628 PySys_SetObject("exc_value", frame->f_exc_value);
2629 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2630 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 tmp_type = frame->f_exc_type;
2632 tmp_value = frame->f_exc_value;
2633 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 frame->f_exc_type = NULL;
2635 frame->f_exc_value = NULL;
2636 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002637 Py_XDECREF(tmp_type);
2638 Py_XDECREF(tmp_value);
2639 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640}
2641
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002642/* Logic for the raise statement (too complicated for inlining).
2643 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002644static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002645do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002646{
Guido van Rossumd295f121998-04-09 21:39:57 +00002647 if (type == NULL) {
2648 /* Reraise */
2649 PyThreadState *tstate = PyThreadState_Get();
2650 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2651 value = tstate->exc_value;
2652 tb = tstate->exc_traceback;
2653 Py_XINCREF(type);
2654 Py_XINCREF(value);
2655 Py_XINCREF(tb);
2656 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002657
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002658 /* We support the following forms of raise:
2659 raise <class>, <classinstance>
2660 raise <class>, <argument tuple>
2661 raise <class>, None
2662 raise <class>, <argument>
2663 raise <classinstance>, None
2664 raise <string>, <object>
2665 raise <string>, None
2666
2667 An omitted second argument is the same as None.
2668
2669 In addition, raise <tuple>, <anything> is the same as
2670 raising the tuple's first item (and it better have one!);
2671 this rule is applied recursively.
2672
2673 Finally, an optional third argument can be supplied, which
2674 gives the traceback to be substituted (useful when
2675 re-raising an exception after examining it). */
2676
2677 /* First, check the traceback argument, replacing None with
2678 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 if (tb == Py_None) {
2680 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681 tb = NULL;
2682 }
2683 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002685 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 goto raise_error;
2687 }
2688
2689 /* Next, replace a missing value with None */
2690 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 value = Py_None;
2692 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 }
2694
2695 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2697 PyObject *tmp = type;
2698 type = PyTuple_GET_ITEM(type, 0);
2699 Py_INCREF(type);
2700 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002701 }
2702
Barry Warsaw4249f541997-08-22 21:26:19 +00002703 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002704 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002705
2706 else if (PyClass_Check(type))
2707 PyErr_NormalizeException(&type, &value, &tb);
2708
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002710 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 if (value != Py_None) {
2712 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 "instance exception may not have a separate value");
2714 goto raise_error;
2715 }
2716 else {
2717 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002719 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2721 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002722 }
2723 }
2724 else {
2725 /* Not something you can raise. You get an exception
2726 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002727 PyErr_Format(PyExc_TypeError,
2728 "exceptions must be strings, classes, or "
2729 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002730 goto raise_error;
2731 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 if (tb == NULL)
2734 return WHY_EXCEPTION;
2735 else
2736 return WHY_RERAISE;
2737 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 Py_XDECREF(value);
2739 Py_XDECREF(type);
2740 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002741 return WHY_EXCEPTION;
2742}
2743
Tim Petersd6d010b2001-06-21 02:49:55 +00002744/* Iterate v argcnt times and store the results on the stack (via decreasing
2745 sp). Return 1 for success, 0 if error. */
2746
Barry Warsawe42b18f1997-08-25 22:13:04 +00002747static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002748unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002749{
Tim Petersd6d010b2001-06-21 02:49:55 +00002750 int i = 0;
2751 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002752 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002753
Tim Petersd6d010b2001-06-21 02:49:55 +00002754 assert(v != NULL);
2755
2756 it = PyObject_GetIter(v);
2757 if (it == NULL)
2758 goto Error;
2759
2760 for (; i < argcnt; i++) {
2761 w = PyIter_Next(it);
2762 if (w == NULL) {
2763 /* Iterator done, via error or exhaustion. */
2764 if (!PyErr_Occurred()) {
2765 PyErr_Format(PyExc_ValueError,
2766 "need more than %d value%s to unpack",
2767 i, i == 1 ? "" : "s");
2768 }
2769 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002770 }
2771 *--sp = w;
2772 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002773
2774 /* We better have exhausted the iterator now. */
2775 w = PyIter_Next(it);
2776 if (w == NULL) {
2777 if (PyErr_Occurred())
2778 goto Error;
2779 Py_DECREF(it);
2780 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002781 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002782 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002783 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002784Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002785 for (; i > 0; i--, sp++)
2786 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002787 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002788 return 0;
2789}
2790
2791
Guido van Rossum96a42c81992-01-12 02:29:51 +00002792#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002796 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 if (PyObject_Print(v, stdout, 0) != 0)
2798 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002799 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002800 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002802#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804static void
Fred Drake5755ce62001-06-27 19:19:46 +00002805call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002806{
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002810 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 value = Py_None;
2812 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002813 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002815 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002817 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002818 }
Fred Drake5755ce62001-06-27 19:19:46 +00002819 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 Py_XDECREF(type);
2825 Py_XDECREF(value);
2826 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002828}
2829
Fred Drake4ec5d562001-10-04 19:26:43 +00002830static void
2831call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2832 int what)
2833{
2834 PyObject *type, *value, *traceback;
2835 int err;
2836 PyErr_Fetch(&type, &value, &traceback);
2837 err = call_trace(func, obj, frame, what, NULL);
2838 if (err == 0)
2839 PyErr_Restore(type, value, traceback);
2840 else {
2841 Py_XDECREF(type);
2842 Py_XDECREF(value);
2843 Py_XDECREF(traceback);
2844 }
2845}
2846
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002847static int
Fred Drake5755ce62001-06-27 19:19:46 +00002848call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2849 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002850{
Fred Drake5755ce62001-06-27 19:19:46 +00002851 register PyThreadState *tstate = frame->f_tstate;
2852 int result;
2853 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002854 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002855 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002856 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002857 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002858 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2859 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002860 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002861 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002862}
2863
Fred Drake5755ce62001-06-27 19:19:46 +00002864void
2865PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002866{
Fred Drake5755ce62001-06-27 19:19:46 +00002867 PyThreadState *tstate = PyThreadState_Get();
2868 PyObject *temp = tstate->c_profileobj;
2869 Py_XINCREF(arg);
2870 tstate->c_profilefunc = NULL;
2871 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002872 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002873 Py_XDECREF(temp);
2874 tstate->c_profilefunc = func;
2875 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002876 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002877}
2878
2879void
2880PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2881{
2882 PyThreadState *tstate = PyThreadState_Get();
2883 PyObject *temp = tstate->c_traceobj;
2884 Py_XINCREF(arg);
2885 tstate->c_tracefunc = NULL;
2886 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002887 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002888 Py_XDECREF(temp);
2889 tstate->c_tracefunc = func;
2890 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002891 tstate->use_tracing = ((func != NULL)
2892 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002893}
2894
Guido van Rossumb209a111997-04-29 18:18:01 +00002895PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002896PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002897{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002898 PyThreadState *tstate = PyThreadState_Get();
2899 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002900 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002901 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002902 else
2903 return current_frame->f_builtins;
2904}
2905
Guido van Rossumb209a111997-04-29 18:18:01 +00002906PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002907PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002908{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002909 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002910 if (current_frame == NULL)
2911 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002912 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002913 return current_frame->f_locals;
2914}
2915
Guido van Rossumb209a111997-04-29 18:18:01 +00002916PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002917PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002918{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002919 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002920 if (current_frame == NULL)
2921 return NULL;
2922 else
2923 return current_frame->f_globals;
2924}
2925
Guido van Rossumb209a111997-04-29 18:18:01 +00002926PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002928{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002929 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002930 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002931}
2932
Guido van Rossum6135a871995-01-09 17:53:26 +00002933int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002934PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002935{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002936 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002937 return current_frame == NULL ? 0 : current_frame->f_restricted;
2938}
2939
Guido van Rossumbe270261997-05-22 22:26:18 +00002940int
Tim Peters5ba58662001-07-16 02:29:45 +00002941PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002942{
2943 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002944 int result = 0;
2945
2946 if (current_frame != NULL) {
2947 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002948 const int compilerflags = codeflags & PyCF_MASK;
2949 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002950 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002951 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002952 }
2953 }
2954 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002955}
2956
2957int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002958Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959{
Guido van Rossumb209a111997-04-29 18:18:01 +00002960 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002961 if (f == NULL)
2962 return 0;
2963 if (!PyFile_SoftSpace(f, 0))
2964 return 0;
2965 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966}
2967
Guido van Rossum3f5da241990-12-20 15:06:42 +00002968
Guido van Rossum681d79a1995-07-18 14:51:37 +00002969/* External interface to call any callable object.
2970 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002971
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002972#undef PyEval_CallObject
2973/* for backward compatibility: export this interface */
2974
Guido van Rossumb209a111997-04-29 18:18:01 +00002975PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002976PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002977{
Guido van Rossumb209a111997-04-29 18:18:01 +00002978 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002979}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002980#define PyEval_CallObject(func,arg) \
2981 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002982
Guido van Rossumb209a111997-04-29 18:18:01 +00002983PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002984PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002985{
Jeremy Hylton52820442001-01-03 23:52:36 +00002986 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002987
2988 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002989 arg = PyTuple_New(0);
2990 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002991 PyErr_SetString(PyExc_TypeError,
2992 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002993 return NULL;
2994 }
2995 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002996 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002997
Guido van Rossumb209a111997-04-29 18:18:01 +00002998 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002999 PyErr_SetString(PyExc_TypeError,
3000 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003001 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003002 return NULL;
3003 }
3004
Tim Peters6d6c1a32001-08-02 04:15:00 +00003005 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003006 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003007 return result;
3008}
3009
Tim Peters6d6c1a32001-08-02 04:15:00 +00003010char *
3011PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003012{
3013 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003014 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003015 else if (PyFunction_Check(func))
3016 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3017 else if (PyCFunction_Check(func))
3018 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3019 else if (PyClass_Check(func))
3020 return PyString_AsString(((PyClassObject*)func)->cl_name);
3021 else if (PyInstance_Check(func)) {
3022 return PyString_AsString(
3023 ((PyInstanceObject*)func)->in_class->cl_name);
3024 } else {
3025 return func->ob_type->tp_name;
3026 }
3027}
3028
Tim Peters6d6c1a32001-08-02 04:15:00 +00003029char *
3030PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003031{
3032 if (PyMethod_Check(func))
3033 return "()";
3034 else if (PyFunction_Check(func))
3035 return "()";
3036 else if (PyCFunction_Check(func))
3037 return "()";
3038 else if (PyClass_Check(func))
3039 return " constructor";
3040 else if (PyInstance_Check(func)) {
3041 return " instance";
3042 } else {
3043 return " object";
3044 }
3045}
3046
Jeremy Hylton52820442001-01-03 23:52:36 +00003047#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3048
3049/* The two fast_xxx() functions optimize calls for which no argument
3050 tuple is necessary; the objects are passed directly from the stack.
3051 fast_cfunction() is called for METH_OLDARGS functions.
3052 fast_function() is for functions with no special argument handling.
3053*/
3054
3055static PyObject *
3056fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3057{
3058 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3059 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003060 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003061
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003062 switch (flags) {
3063 case METH_OLDARGS:
3064 if (na == 0)
3065 return (*meth)(self, NULL);
3066 else if (na == 1) {
3067 PyObject *arg = EXT_POP(*pp_stack);
3068 PyObject *result = (*meth)(self, arg);
3069 Py_DECREF(arg);
3070 return result;
3071 } else {
3072 PyObject *args = load_args(pp_stack, na);
3073 PyObject *result = (*meth)(self, args);
3074 Py_DECREF(args);
3075 return result;
3076 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003077 case METH_NOARGS:
3078 if (na == 0)
3079 return (*meth)(self, NULL);
3080 PyErr_Format(PyExc_TypeError,
3081 "%.200s() takes no arguments (%d given)",
3082 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3083 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003084 case METH_O:
3085 if (na == 1) {
3086 PyObject *arg = EXT_POP(*pp_stack);
3087 PyObject *result = (*meth)(self, arg);
3088 Py_DECREF(arg);
3089 return result;
3090 }
3091 PyErr_Format(PyExc_TypeError,
3092 "%.200s() takes exactly one argument (%d given)",
3093 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3094 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003095 default:
3096 fprintf(stderr, "%.200s() flags = %d\n",
3097 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3098 PyErr_BadInternalCall();
3099 return NULL;
3100 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003101}
3102
3103static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003104fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003105{
3106 PyObject *co = PyFunction_GET_CODE(func);
3107 PyObject *globals = PyFunction_GET_GLOBALS(func);
3108 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003109 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003110 PyObject **d = NULL;
3111 int nd = 0;
3112
3113 if (argdefs != NULL) {
3114 d = &PyTuple_GET_ITEM(argdefs, 0);
3115 nd = ((PyTupleObject *)argdefs)->ob_size;
3116 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003117 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003118 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003119 (*pp_stack)-2*nk, nk, d, nd,
3120 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003121}
3122
3123static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003124update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3125 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003126{
3127 PyObject *kwdict = NULL;
3128 if (orig_kwdict == NULL)
3129 kwdict = PyDict_New();
3130 else {
3131 kwdict = PyDict_Copy(orig_kwdict);
3132 Py_DECREF(orig_kwdict);
3133 }
3134 if (kwdict == NULL)
3135 return NULL;
3136 while (--nk >= 0) {
3137 int err;
3138 PyObject *value = EXT_POP(*pp_stack);
3139 PyObject *key = EXT_POP(*pp_stack);
3140 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003141 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003142 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003143 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003144 PyEval_GetFuncName(func),
3145 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003146 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003147 Py_DECREF(key);
3148 Py_DECREF(value);
3149 Py_DECREF(kwdict);
3150 return NULL;
3151 }
3152 err = PyDict_SetItem(kwdict, key, value);
3153 Py_DECREF(key);
3154 Py_DECREF(value);
3155 if (err) {
3156 Py_DECREF(kwdict);
3157 return NULL;
3158 }
3159 }
3160 return kwdict;
3161}
3162
3163static PyObject *
3164update_star_args(int nstack, int nstar, PyObject *stararg,
3165 PyObject ***pp_stack)
3166{
3167 PyObject *callargs, *w;
3168
3169 callargs = PyTuple_New(nstack + nstar);
3170 if (callargs == NULL) {
3171 return NULL;
3172 }
3173 if (nstar) {
3174 int i;
3175 for (i = 0; i < nstar; i++) {
3176 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3177 Py_INCREF(a);
3178 PyTuple_SET_ITEM(callargs, nstack + i, a);
3179 }
3180 }
3181 while (--nstack >= 0) {
3182 w = EXT_POP(*pp_stack);
3183 PyTuple_SET_ITEM(callargs, nstack, w);
3184 }
3185 return callargs;
3186}
3187
3188static PyObject *
3189load_args(PyObject ***pp_stack, int na)
3190{
3191 PyObject *args = PyTuple_New(na);
3192 PyObject *w;
3193
3194 if (args == NULL)
3195 return NULL;
3196 while (--na >= 0) {
3197 w = EXT_POP(*pp_stack);
3198 PyTuple_SET_ITEM(args, na, w);
3199 }
3200 return args;
3201}
3202
3203static PyObject *
3204do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3205{
3206 PyObject *callargs = NULL;
3207 PyObject *kwdict = NULL;
3208 PyObject *result = NULL;
3209
3210 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003211 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003212 if (kwdict == NULL)
3213 goto call_fail;
3214 }
3215 callargs = load_args(pp_stack, na);
3216 if (callargs == NULL)
3217 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003218 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003219 call_fail:
3220 Py_XDECREF(callargs);
3221 Py_XDECREF(kwdict);
3222 return result;
3223}
3224
3225static PyObject *
3226ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3227{
3228 int nstar = 0;
3229 PyObject *callargs = NULL;
3230 PyObject *stararg = NULL;
3231 PyObject *kwdict = NULL;
3232 PyObject *result = NULL;
3233
3234 if (flags & CALL_FLAG_KW) {
3235 kwdict = EXT_POP(*pp_stack);
3236 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003237 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003238 "%s%s argument after ** "
3239 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003240 PyEval_GetFuncName(func),
3241 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003242 goto ext_call_fail;
3243 }
3244 }
3245 if (flags & CALL_FLAG_VAR) {
3246 stararg = EXT_POP(*pp_stack);
3247 if (!PyTuple_Check(stararg)) {
3248 PyObject *t = NULL;
3249 t = PySequence_Tuple(stararg);
3250 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003251 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3252 PyErr_Format(PyExc_TypeError,
3253 "%s%s argument after * "
3254 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003255 PyEval_GetFuncName(func),
3256 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003257 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003258 goto ext_call_fail;
3259 }
3260 Py_DECREF(stararg);
3261 stararg = t;
3262 }
3263 nstar = PyTuple_GET_SIZE(stararg);
3264 }
3265 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003266 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003267 if (kwdict == NULL)
3268 goto ext_call_fail;
3269 }
3270 callargs = update_star_args(na, nstar, stararg, pp_stack);
3271 if (callargs == NULL)
3272 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003273 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003274 ext_call_fail:
3275 Py_XDECREF(callargs);
3276 Py_XDECREF(kwdict);
3277 Py_XDECREF(stararg);
3278 return result;
3279}
3280
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003281#define SLICE_ERROR_MSG \
3282 "standard sequence type does not support step size other than one"
3283
Guido van Rossumb209a111997-04-29 18:18:01 +00003284static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003285loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286{
Guido van Rossumb209a111997-04-29 18:18:01 +00003287 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003288 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003289 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003290 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 return NULL;
3292 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003293 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003294 v = (*sq->sq_item)(v, i);
3295 if (v)
3296 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003297 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003298 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003299 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300}
3301
Guido van Rossum20c6add2000-05-08 14:06:50 +00003302/* Extract a slice index from a PyInt or PyLong, the index is bound to
3303 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3304 and error. Returns 1 on success.*/
3305
3306int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003307_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308{
3309 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003310 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003311 if (PyInt_Check(v)) {
3312 x = PyInt_AsLong(v);
3313 } else if (PyLong_Check(v)) {
3314 x = PyLong_AsLong(v);
3315 if (x==-1 && PyErr_Occurred()) {
3316 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003317 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003318
Guido van Rossumac7be682001-01-17 15:42:30 +00003319 if (!PyErr_ExceptionMatches(
3320 PyExc_OverflowError)) {
3321 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003322 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003323 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003324 }
3325
Guido van Rossumac7be682001-01-17 15:42:30 +00003326 /* Clear the OverflowError */
3327 PyErr_Clear();
3328
3329 /* It's an overflow error, so we need to
3330 check the sign of the long integer,
3331 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003332 the error. */
3333
3334 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003335 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003336 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003337
3338 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003339 cmp = PyObject_RichCompareBool(v, long_zero,
3340 Py_GT);
3341 Py_DECREF(long_zero);
3342 if (cmp < 0)
3343 return 0;
3344 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003345 x = INT_MAX;
3346 else
3347 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003348 }
3349 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003350 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003351 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003352 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003354 /* Truncate -- very long indices are truncated anyway */
3355 if (x > INT_MAX)
3356 x = INT_MAX;
3357 else if (x < -INT_MAX)
3358 x = 0;
3359 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003361 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362}
3363
Guido van Rossum50d756e2001-08-18 17:43:36 +00003364#undef ISINT
3365#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3366
Guido van Rossumb209a111997-04-29 18:18:01 +00003367static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003368apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003370 PyTypeObject *tp = u->ob_type;
3371 PySequenceMethods *sq = tp->tp_as_sequence;
3372
3373 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3374 int ilow = 0, ihigh = INT_MAX;
3375 if (!_PyEval_SliceIndex(v, &ilow))
3376 return NULL;
3377 if (!_PyEval_SliceIndex(w, &ihigh))
3378 return NULL;
3379 return PySequence_GetSlice(u, ilow, ihigh);
3380 }
3381 else {
3382 PyObject *slice = PySlice_New(v, w, NULL);
3383 if (slice != NULL)
3384 return PyObject_GetItem(u, slice);
3385 else
3386 return NULL;
3387 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003389
3390static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003391assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3392 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003394 PyTypeObject *tp = u->ob_type;
3395 PySequenceMethods *sq = tp->tp_as_sequence;
3396
3397 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3398 int ilow = 0, ihigh = INT_MAX;
3399 if (!_PyEval_SliceIndex(v, &ilow))
3400 return -1;
3401 if (!_PyEval_SliceIndex(w, &ihigh))
3402 return -1;
3403 if (x == NULL)
3404 return PySequence_DelSlice(u, ilow, ihigh);
3405 else
3406 return PySequence_SetSlice(u, ilow, ihigh, x);
3407 }
3408 else {
3409 PyObject *slice = PySlice_New(v, w, NULL);
3410 if (slice != NULL) {
3411 if (x != NULL)
3412 return PyObject_SetItem(u, slice, x);
3413 else
3414 return PyObject_DelItem(u, slice);
3415 }
3416 else
3417 return -1;
3418 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419}
3420
Guido van Rossumb209a111997-04-29 18:18:01 +00003421static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003422cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423{
Guido van Rossumac7be682001-01-17 15:42:30 +00003424 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003426 case IS:
3427 case IS_NOT:
3428 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003429 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003430 res = !res;
3431 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 case IN:
3433 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003434 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003435 if (res < 0)
3436 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003437 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003438 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 break;
3440 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003441 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 break;
3443 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003444 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003446 v = res ? Py_True : Py_False;
3447 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 return v;
3449}
3450
Thomas Wouters52152252000-08-17 22:55:00 +00003451static PyObject *
3452import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003453{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003454 PyObject *x;
3455
3456 x = PyObject_GetAttr(v, name);
3457 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003458 PyErr_Format(PyExc_ImportError,
3459 "cannot import name %.230s",
3460 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003461 }
Thomas Wouters52152252000-08-17 22:55:00 +00003462 return x;
3463}
Guido van Rossumac7be682001-01-17 15:42:30 +00003464
Thomas Wouters52152252000-08-17 22:55:00 +00003465static int
3466import_all_from(PyObject *locals, PyObject *v)
3467{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003468 PyObject *all = PyObject_GetAttrString(v, "__all__");
3469 PyObject *dict, *name, *value;
3470 int skip_leading_underscores = 0;
3471 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003472
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003473 if (all == NULL) {
3474 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3475 return -1; /* Unexpected error */
3476 PyErr_Clear();
3477 dict = PyObject_GetAttrString(v, "__dict__");
3478 if (dict == NULL) {
3479 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3480 return -1;
3481 PyErr_SetString(PyExc_ImportError,
3482 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003483 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003484 }
3485 all = PyMapping_Keys(dict);
3486 Py_DECREF(dict);
3487 if (all == NULL)
3488 return -1;
3489 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003490 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003491
3492 for (pos = 0, err = 0; ; pos++) {
3493 name = PySequence_GetItem(all, pos);
3494 if (name == NULL) {
3495 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3496 err = -1;
3497 else
3498 PyErr_Clear();
3499 break;
3500 }
3501 if (skip_leading_underscores &&
3502 PyString_Check(name) &&
3503 PyString_AS_STRING(name)[0] == '_')
3504 {
3505 Py_DECREF(name);
3506 continue;
3507 }
3508 value = PyObject_GetAttr(v, name);
3509 if (value == NULL)
3510 err = -1;
3511 else
3512 err = PyDict_SetItem(locals, name, value);
3513 Py_DECREF(name);
3514 Py_XDECREF(value);
3515 if (err != 0)
3516 break;
3517 }
3518 Py_DECREF(all);
3519 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003520}
3521
Guido van Rossumb209a111997-04-29 18:18:01 +00003522static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003523build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003524{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003525 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003526
3527 if (PyDict_Check(methods))
3528 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003529 if (metaclass != NULL)
3530 Py_INCREF(methods);
3531 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3532 base = PyTuple_GET_ITEM(bases, 0);
3533 metaclass = PyObject_GetAttrString(base, "__class__");
3534 if (metaclass == NULL) {
3535 PyErr_Clear();
3536 metaclass = (PyObject *)base->ob_type;
3537 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003538 }
3539 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003540 else {
3541 PyObject *g = PyEval_GetGlobals();
3542 if (g != NULL && PyDict_Check(g))
3543 metaclass = PyDict_GetItemString(g, "__metaclass__");
3544 if (metaclass == NULL)
3545 metaclass = (PyObject *) &PyClass_Type;
3546 Py_INCREF(metaclass);
3547 }
3548 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3549 Py_DECREF(metaclass);
3550 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003551}
3552
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003553static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003554exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3555 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003556{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003557 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003558 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003559 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003560
Guido van Rossumb209a111997-04-29 18:18:01 +00003561 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3562 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003563 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003564 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003565 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003566 locals = PyTuple_GetItem(prog, 2);
3567 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003568 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003569 if (globals == Py_None) {
3570 globals = PyEval_GetGlobals();
3571 if (locals == Py_None) {
3572 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003573 plain = 1;
3574 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003575 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003576 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003577 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003578 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003579 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003580 !PyCode_Check(prog) &&
3581 !PyFile_Check(prog)) {
3582 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003583 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003584 return -1;
3585 }
Fred Drake661ea262000-10-24 19:57:45 +00003586 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003587 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003588 "exec: arg 2 must be a dictionary or None");
3589 return -1;
3590 }
3591 if (!PyDict_Check(locals)) {
3592 PyErr_SetString(PyExc_TypeError,
3593 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003594 return -1;
3595 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003596 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003597 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003598 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003599 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003600 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003601 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003602 FILE *fp = PyFile_AsFile(prog);
3603 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003604 PyCompilerFlags cf;
3605 cf.cf_flags = 0;
3606 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003607 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3608 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003609 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003610 v = PyRun_File(fp, name, Py_file_input, globals,
3611 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003612 }
3613 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003614 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003615 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003616 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003617 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003618 cf.cf_flags = 0;
3619 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003620 v = PyRun_StringFlags(str, Py_file_input, globals,
3621 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003622 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003623 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003624 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003625 if (plain)
3626 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003627 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003628 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003629 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003630 return 0;
3631}
Guido van Rossum24c13741995-02-14 09:42:43 +00003632
Guido van Rossumac7be682001-01-17 15:42:30 +00003633static void
Paul Prescode68140d2000-08-30 20:25:01 +00003634format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3635{
3636 char *obj_str;
3637
3638 if (!obj)
3639 return;
3640
3641 obj_str = PyString_AsString(obj);
3642 if (!obj_str)
3643 return;
3644
3645 PyErr_Format(exc, format_str, obj_str);
3646}
Guido van Rossum950361c1997-01-24 13:49:28 +00003647
3648#ifdef DYNAMIC_EXECUTION_PROFILE
3649
3650PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003651getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003652{
3653 int i;
3654 PyObject *l = PyList_New(256);
3655 if (l == NULL) return NULL;
3656 for (i = 0; i < 256; i++) {
3657 PyObject *x = PyInt_FromLong(a[i]);
3658 if (x == NULL) {
3659 Py_DECREF(l);
3660 return NULL;
3661 }
3662 PyList_SetItem(l, i, x);
3663 }
3664 for (i = 0; i < 256; i++)
3665 a[i] = 0;
3666 return l;
3667}
3668
3669PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003670_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003671{
3672#ifndef DXPAIRS
3673 return getarray(dxp);
3674#else
3675 int i;
3676 PyObject *l = PyList_New(257);
3677 if (l == NULL) return NULL;
3678 for (i = 0; i < 257; i++) {
3679 PyObject *x = getarray(dxpairs[i]);
3680 if (x == NULL) {
3681 Py_DECREF(l);
3682 return NULL;
3683 }
3684 PyList_SetItem(l, i, x);
3685 }
3686 return l;
3687#endif
3688}
3689
3690#endif