blob: b70773434965600f004d821a4104e1b3b9a0effc [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static PyObject *loop_subscript(PyObject *, PyObject *);
55static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
56static int assign_slice(PyObject *, PyObject *,
57 PyObject *, PyObject *);
58static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000059static PyObject *import_from(PyObject *, PyObject *);
60static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static PyObject *build_class(PyObject *, PyObject *, PyObject *);
62static int exec_statement(PyFrameObject *,
63 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
65static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000066static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Paul Prescode68140d2000-08-30 20:25:01 +000068#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000069 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000070#define GLOBAL_NAME_ERROR_MSG \
71 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000072#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000073 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000074#define UNBOUNDFREE_ERROR_MSG \
75 "free variable '%.200s' referenced before assignment" \
76 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Guido van Rossum950361c1997-01-24 13:49:28 +000078/* Dynamic execution profile */
79#ifdef DYNAMIC_EXECUTION_PROFILE
80#ifdef DXPAIRS
81static long dxpairs[257][256];
82#define dxp dxpairs[256]
83#else
84static long dxp[256];
85#endif
86#endif
87
Tim Peters5ca576e2001-06-18 22:08:13 +000088staticforward PyTypeObject gentype;
89
90typedef struct {
91 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000092 /* The gi_ prefix is intended to remind of generator-iterator. */
93
94 PyFrameObject *gi_frame;
95
Tim Peterse77f2e22001-06-26 22:24:51 +000096 /* True if generator is being executed. */
97 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000098} genobject;
99
100static PyObject *
101gen_new(PyFrameObject *f)
102{
103 genobject *gen = PyObject_New(genobject, &gentype);
104 if (gen == NULL) {
105 Py_DECREF(f);
106 return NULL;
107 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000108 gen->gi_frame = f;
109 gen->gi_running = 0;
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000110 PyObject_GC_Init(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000111 return (PyObject *)gen;
112}
113
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000114static int
115gen_traverse(genobject *gen, visitproc visit, void *arg)
116{
117 return visit((PyObject *)gen->gi_frame, arg);
118}
119
Tim Peters5ca576e2001-06-18 22:08:13 +0000120static void
121gen_dealloc(genobject *gen)
122{
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000123 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000124 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000125 PyObject_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000126}
127
128static PyObject *
129gen_iternext(genobject *gen)
130{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000131 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000133 PyObject *result;
134
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000135 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000136 PyErr_SetString(PyExc_ValueError,
137 "generator already executing");
138 return NULL;
139 }
Tim Peters8c963692001-06-23 05:26:56 +0000140 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000142
143 /* Generators always return to their most recent caller, not
144 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000145 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000146 assert(f->f_back == NULL);
147 f->f_back = tstate->frame;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000151 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000152
153 /* Don't keep the reference to f_back any longer than necessary. It
154 * may keep a chain of frames alive or it could create a reference
155 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000156 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000157 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000158
Tim Petersad1a18b2001-06-23 06:19:16 +0000159 /* If the generator just returned (as opposed to yielding), signal
160 * that the generator is exhausted. */
161 if (result == Py_None && f->f_stacktop == NULL) {
162 Py_DECREF(result);
163 result = NULL;
164 }
165
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000167}
168
169static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000170gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000171{
172 PyObject *result;
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000175
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000176 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000177 PyErr_SetObject(PyExc_StopIteration, Py_None);
178 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000179 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000180
181 return result;
182}
183
184static PyObject *
185gen_getiter(PyObject *gen)
186{
187 Py_INCREF(gen);
188 return gen;
189}
190
191static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000192 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000193 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 {NULL, NULL} /* Sentinel */
195};
196
Guido van Rossum6f799372001-09-20 20:46:19 +0000197static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000198 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
199 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
200 {NULL} /* Sentinel */
201};
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
203statichere PyTypeObject gentype = {
204 PyObject_HEAD_INIT(&PyType_Type)
205 0, /* ob_size */
206 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000207 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000208 0, /* tp_itemsize */
209 /* methods */
210 (destructor)gen_dealloc, /* tp_dealloc */
211 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_setattr */
214 0, /* tp_compare */
215 0, /* tp_repr */
216 0, /* tp_as_number */
217 0, /* tp_as_sequence */
218 0, /* tp_as_mapping */
219 0, /* tp_hash */
220 0, /* tp_call */
221 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000223 0, /* tp_setattro */
224 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000226 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000227 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000228 0, /* tp_clear */
229 0, /* tp_richcompare */
230 0, /* tp_weaklistoffset */
231 (getiterfunc)gen_getiter, /* tp_iter */
232 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000233 gen_methods, /* tp_methods */
234 gen_memberlist, /* tp_members */
235 0, /* tp_getset */
236 0, /* tp_base */
237 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000238};
239
240
Guido van Rossume59214e1994-08-30 08:01:59 +0000241#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000242
Guido van Rossum2571cc81999-04-07 16:07:23 +0000243#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000245#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000246#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248extern int _PyThread_Started; /* Flag for Py_Exit */
249
Guido van Rossum65d5b571998-12-21 19:32:43 +0000250static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252
253void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000257 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000259 interpreter_lock = PyThread_allocate_lock();
260 PyThread_acquire_lock(interpreter_lock, 1);
261 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000262}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000263
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000264void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268}
269
270void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274}
275
276void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000278{
279 if (tstate == NULL)
280 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282 if (PyThreadState_Swap(tstate) != NULL)
283 Py_FatalError(
284 "PyEval_AcquireThread: non-NULL old thread state");
285}
286
287void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000288PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289{
290 if (tstate == NULL)
291 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
292 if (PyThreadState_Swap(NULL) != tstate)
293 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000294 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000295}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000296
297/* This function is called from PyOS_AfterFork to ensure that newly
298 created child processes don't hold locks referring to threads which
299 are not running in the child process. (This could also be done using
300 pthread_atfork mechanism, at least for the pthreads implementation.) */
301
302void
303PyEval_ReInitThreads(void)
304{
305 if (!interpreter_lock)
306 return;
307 /*XXX Can't use PyThread_free_lock here because it does too
308 much error-checking. Doing this cleanly would require
309 adding a new function to each thread_*.h. Instead, just
310 create a new lock and waste a little bit of memory */
311 interpreter_lock = PyThread_allocate_lock();
312 PyThread_acquire_lock(interpreter_lock, 1);
313 main_thread = PyThread_get_thread_ident();
314}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315#endif
316
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317/* Functions save_thread and restore_thread are always defined so
318 dynamically loaded modules needn't be compiled separately for use
319 with and without threads: */
320
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000321PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 PyThreadState *tstate = PyThreadState_Swap(NULL);
325 if (tstate == NULL)
326 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000327#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000331 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332}
333
334void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000335PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000337 if (tstate == NULL)
338 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000339#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000341 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000342 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 }
345#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000346 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347}
348
349
Guido van Rossuma9672091994-09-14 13:31:22 +0000350/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
351 signal handlers or Mac I/O completion routines) can schedule calls
352 to a function to be called synchronously.
353 The synchronous function is called with one void* argument.
354 It should return 0 for success or -1 for failure -- failure should
355 be accompanied by an exception.
356
357 If registry succeeds, the registry function returns 0; if it fails
358 (e.g. due to too many pending calls) it returns -1 (without setting
359 an exception condition).
360
361 Note that because registry may occur from within signal handlers,
362 or other asynchronous events, calling malloc() is unsafe!
363
364#ifdef WITH_THREAD
365 Any thread can schedule pending calls, but only the main thread
366 will execute them.
367#endif
368
369 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
370 There are two possible race conditions:
371 (1) nested asynchronous registry calls;
372 (2) registry calls made while pending calls are being processed.
373 While (1) is very unlikely, (2) is a real possibility.
374 The current code is safe against (2), but not against (1).
375 The safety against (2) is derived from the fact that only one
376 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378 XXX Darn! With the advent of thread state, we should have an array
379 of pending calls per thread in the thread state! Later...
380*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000381
Guido van Rossuma9672091994-09-14 13:31:22 +0000382#define NPENDINGCALLS 32
383static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000384 int (*func)(void *);
385 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000386} pendingcalls[NPENDINGCALLS];
387static volatile int pendingfirst = 0;
388static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390
391int
Thomas Wouters334fb892000-07-25 12:56:38 +0000392Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000393{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000394 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 int i, j;
396 /* XXX Begin critical section */
397 /* XXX If you want this to be safe against nested
398 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000399 if (busy)
400 return -1;
401 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendinglast;
403 j = (i + 1) % NPENDINGCALLS;
404 if (j == pendingfirst)
405 return -1; /* Queue full */
406 pendingcalls[i].func = func;
407 pendingcalls[i].arg = arg;
408 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000409 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000410 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 /* XXX End critical section */
412 return 0;
413}
414
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000417{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000418 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000420 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000421 return 0;
422#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000423 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 return 0;
425 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 for (;;) {
428 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000429 int (*func)(void *);
430 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 i = pendingfirst;
432 if (i == pendinglast)
433 break; /* Queue empty */
434 func = pendingcalls[i].func;
435 arg = pendingcalls[i].arg;
436 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000437 if (func(arg) < 0) {
438 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000439 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000440 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000441 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 return 0;
445}
446
447
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000448/* The interpreter's recursion limit */
449
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000450static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000452int
453Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000454{
455 return recursion_limit;
456}
457
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000458void
459Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000460{
461 recursion_limit = new_limit;
462}
463
Guido van Rossum374a9221991-04-04 10:40:29 +0000464/* Status code for main loop (reason for stack unwind) */
465
466enum why_code {
467 WHY_NOT, /* No error */
468 WHY_EXCEPTION, /* Exception occurred */
469 WHY_RERAISE, /* Exception re-raised by 'finally' */
470 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000471 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000472 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000473 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000474};
475
Tim Petersdbd9ba62000-07-09 03:09:57 +0000476static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000477static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000478
Guido van Rossum374a9221991-04-04 10:40:29 +0000479
Guido van Rossumb209a111997-04-29 18:18:01 +0000480PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000481PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 (PyObject **)NULL, 0,
486 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000487 (PyObject **)NULL, 0,
488 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489}
490
491
492/* Interpreter main loop */
493
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000495eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000496{
Guido van Rossum950361c1997-01-24 13:49:28 +0000497#ifdef DXPAIRS
498 int lastopcode = 0;
499#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000500 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000501 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000502 register int opcode=0; /* Current opcode */
503 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000504 register enum why_code why; /* Reason for block stack unwind */
505 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000506 register PyObject *x; /* Result object -- NULL if error */
507 register PyObject *v; /* Temporary objects popped off stack */
508 register PyObject *w;
509 register PyObject *u;
510 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000511 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000512 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000513 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000514 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000515 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000518 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000520#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000522 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000523#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000524
525/* Code access macros */
526
527#define GETCONST(i) Getconst(f, i)
528#define GETNAME(i) Getname(f, i)
529#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000530#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000531#define NEXTOP() (*next_instr++)
532#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000533#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#define JUMPBY(x) (next_instr += (x))
535
536/* Stack manipulation macros */
537
538#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
539#define EMPTY() (STACK_LEVEL() == 0)
540#define TOP() (stack_pointer[-1])
541#define BASIC_PUSH(v) (*stack_pointer++ = (v))
542#define BASIC_POP() (*--stack_pointer)
543
Guido van Rossum96a42c81992-01-12 02:29:51 +0000544#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000545#define PUSH(v) { (void)(BASIC_PUSH(v), \
546 lltrace && prtrace(TOP(), "push")); \
547 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000548#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000549#else
550#define PUSH(v) BASIC_PUSH(v)
551#define POP() BASIC_POP()
552#endif
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000557#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 GETLOCAL(i) = value; } while (0)
559
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560/* Start of code */
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 if (f == NULL)
563 return NULL;
564
Guido van Rossum8861b741996-07-30 16:49:37 +0000565#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000567 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570#endif
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000573 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000576 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000577 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 co = f->f_code;
583 fastlocals = f->f_localsplus;
584 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000585 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000587 stack_pointer = f->f_stacktop;
588 assert(stack_pointer != NULL);
589 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000590
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000591 if (tstate->use_tracing) {
592 if (tstate->c_tracefunc != NULL) {
593 /* tstate->c_tracefunc, if defined, is a
594 function that will be called on *every* entry
595 to a code block. Its return value, if not
596 None, is a function that will be called at
597 the start of each executed line of code.
598 (Actually, the function must return itself
599 in order to continue tracing.) The trace
600 functions are called with three arguments:
601 a pointer to the current frame, a string
602 indicating why the function is called, and
603 an argument which depends on the situation.
604 The global trace function is also called
605 whenever an exception is detected. */
606 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
607 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000608 /* Trace function raised an error */
609 return NULL;
610 }
611 }
612 if (tstate->c_profilefunc != NULL) {
613 /* Similar for c_profilefunc, except it needn't
614 return itself and isn't called for "line" events */
615 if (call_trace(tstate->c_profilefunc,
616 tstate->c_profileobj,
617 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000618 /* Profile function raised an error */
619 return NULL;
620 }
621 }
622 }
623
Tim Peters5ca576e2001-06-18 22:08:13 +0000624#ifdef LLTRACE
625 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
626#endif
627#if defined(Py_DEBUG) || defined(LLTRACE)
628 filename = PyString_AsString(co->co_filename);
629#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000630
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 why = WHY_NOT;
632 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000633 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000634 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000637 /* Do periodic things. Doing this every time through
638 the loop would add too much overhead, so we do it
639 only every Nth instruction. We also do it if
640 ``things_to_do'' is set, i.e. when an asynchronous
641 event needs attention (e.g. a signal handler or
642 async I/O handler); see Py_AddPendingCall() and
643 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000644
Guido van Rossuma027efa1997-05-05 20:56:21 +0000645 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000646 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000648 if (Py_MakePendingCalls() < 0) {
649 why = WHY_EXCEPTION;
650 goto on_error;
651 }
652 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000653#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000654 /* If we have true signals, the signal handler
655 will call Py_AddPendingCall() so we don't
656 have to call sigcheck(). On the Mac and
657 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000658 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 goto on_error;
661 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000662#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663
Guido van Rossume59214e1994-08-30 08:01:59 +0000664#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665 if (interpreter_lock) {
666 /* Give another thread a chance */
667
Guido van Rossum25ce5661997-08-02 03:10:38 +0000668 if (PyThreadState_Swap(NULL) != tstate)
669 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000670 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671
672 /* Other threads may run now */
673
Guido van Rossum65d5b571998-12-21 19:32:43 +0000674 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000675 if (PyThreadState_Swap(tstate) != NULL)
676 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 }
678#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000682
Guido van Rossum408027e1996-12-30 16:17:54 +0000683#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000684 f->f_lasti = INSTR_OFFSET();
685#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000686
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 opcode = NEXTOP();
688 if (HAS_ARG(opcode))
689 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000690 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000691#ifdef DYNAMIC_EXECUTION_PROFILE
692#ifdef DXPAIRS
693 dxpairs[lastopcode][opcode]++;
694 lastopcode = opcode;
695#endif
696 dxp[opcode]++;
697#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000698
Guido van Rossum96a42c81992-01-12 02:29:51 +0000699#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000701
Guido van Rossum96a42c81992-01-12 02:29:51 +0000702 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 if (HAS_ARG(opcode)) {
704 printf("%d: %d, %d\n",
705 (int) (INSTR_OFFSET() - 3),
706 opcode, oparg);
707 }
708 else {
709 printf("%d: %d\n",
710 (int) (INSTR_OFFSET() - 1), opcode);
711 }
712 }
713#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000717
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 /* BEWARE!
719 It is essential that any operation that fails sets either
720 x to NULL, err to nonzero, or why to anything but WHY_NOT,
721 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000724
Guido van Rossum374a9221991-04-04 10:40:29 +0000725 case POP_TOP:
726 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000727 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000728 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000729
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 case ROT_TWO:
731 v = POP();
732 w = POP();
733 PUSH(v);
734 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000735 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000736
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 case ROT_THREE:
738 v = POP();
739 w = POP();
740 x = POP();
741 PUSH(v);
742 PUSH(x);
743 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000744 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000745
Thomas Wouters434d0822000-08-24 20:11:32 +0000746 case ROT_FOUR:
747 u = POP();
748 v = POP();
749 w = POP();
750 x = POP();
751 PUSH(u);
752 PUSH(x);
753 PUSH(w);
754 PUSH(v);
755 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000756
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 case DUP_TOP:
758 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000759 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000761 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000762
Thomas Wouters434d0822000-08-24 20:11:32 +0000763 case DUP_TOPX:
764 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000765 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000766 x = TOP();
767 Py_INCREF(x);
768 PUSH(x);
769 continue;
770 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000771 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000772 Py_INCREF(x);
773 w = TOP();
774 Py_INCREF(w);
775 PUSH(x);
776 PUSH(w);
777 PUSH(x);
778 continue;
779 case 3:
780 x = POP();
781 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000782 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000783 Py_INCREF(w);
784 v = TOP();
785 Py_INCREF(v);
786 PUSH(w);
787 PUSH(x);
788 PUSH(v);
789 PUSH(w);
790 PUSH(x);
791 continue;
792 case 4:
793 x = POP();
794 Py_INCREF(x);
795 w = POP();
796 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000797 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000798 Py_INCREF(v);
799 u = TOP();
800 Py_INCREF(u);
801 PUSH(v);
802 PUSH(w);
803 PUSH(x);
804 PUSH(u);
805 PUSH(v);
806 PUSH(w);
807 PUSH(x);
808 continue;
809 case 5:
810 x = POP();
811 Py_INCREF(x);
812 w = POP();
813 Py_INCREF(w);
814 v = POP();
815 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000816 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000817 Py_INCREF(u);
818 t = TOP();
819 Py_INCREF(t);
820 PUSH(u);
821 PUSH(v);
822 PUSH(w);
823 PUSH(x);
824 PUSH(t);
825 PUSH(u);
826 PUSH(v);
827 PUSH(w);
828 PUSH(x);
829 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000830 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000831 Py_FatalError("invalid argument to DUP_TOPX"
832 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000833 }
Tim Peters35ba6892000-10-11 07:04:49 +0000834 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case UNARY_POSITIVE:
837 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000838 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000839 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000841 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000843
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 case UNARY_NEGATIVE:
845 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000851
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 case UNARY_NOT:
853 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000855 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 if (err == 0) {
857 Py_INCREF(Py_True);
858 PUSH(Py_True);
859 continue;
860 }
861 else if (err > 0) {
862 Py_INCREF(Py_False);
863 PUSH(Py_False);
864 err = 0;
865 continue;
866 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000868
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 case UNARY_CONVERT:
870 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000871 x = PyObject_Repr(v);
872 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000874 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000876
Guido van Rossum7928cd71991-10-24 14:59:31 +0000877 case UNARY_INVERT:
878 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000879 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000880 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000882 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000884
Guido van Rossum50564e81996-01-12 01:13:16 +0000885 case BINARY_POWER:
886 w = POP();
887 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000888 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000889 Py_DECREF(v);
890 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000891 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000893 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000894
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 case BINARY_MULTIPLY:
896 w = POP();
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
900 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000904
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 case BINARY_DIVIDE:
906 w = POP();
907 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000908 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000909 Py_DECREF(v);
910 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000912 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000914
Guido van Rossum4668b002001-08-08 05:00:18 +0000915 case BINARY_FLOOR_DIVIDE:
916 w = POP();
917 v = POP();
918 x = PyNumber_FloorDivide(v, w);
919 Py_DECREF(v);
920 Py_DECREF(w);
921 PUSH(x);
922 if (x != NULL) continue;
923 break;
924
925 case BINARY_TRUE_DIVIDE:
926 w = POP();
927 v = POP();
928 x = PyNumber_TrueDivide(v, w);
929 Py_DECREF(v);
930 Py_DECREF(w);
931 PUSH(x);
932 if (x != NULL) continue;
933 break;
934
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 case BINARY_MODULO:
936 w = POP();
937 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000938 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000939 Py_DECREF(v);
940 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000942 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000944
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 case BINARY_ADD:
946 w = POP();
947 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000948 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000949 /* INLINE: int + int */
950 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000951 a = PyInt_AS_LONG(v);
952 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000953 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000954 if ((i^a) < 0 && (i^b) < 0)
955 goto slow_add;
956 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000957 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000958 else {
959 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000960 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000961 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 Py_DECREF(v);
963 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000965 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000967
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 case BINARY_SUBTRACT:
969 w = POP();
970 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000971 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000972 /* INLINE: int - int */
973 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000974 a = PyInt_AS_LONG(v);
975 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000976 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000977 if ((i^a) < 0 && (i^~b) < 0)
978 goto slow_sub;
979 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000980 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000981 else {
982 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000983 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000984 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000985 Py_DECREF(v);
986 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000988 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000989 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000990
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 case BINARY_SUBSCR:
992 w = POP();
993 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +0000994 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000995 /* INLINE: list[int] */
996 long i = PyInt_AsLong(w);
997 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000998 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000999 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001000 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001001 PyErr_SetString(PyExc_IndexError,
1002 "list index out of range");
1003 x = NULL;
1004 }
1005 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001006 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001007 Py_INCREF(x);
1008 }
1009 }
1010 else
1011 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001012 Py_DECREF(v);
1013 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001015 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001017
Guido van Rossum7928cd71991-10-24 14:59:31 +00001018 case BINARY_LSHIFT:
1019 w = POP();
1020 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001021 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001022 Py_DECREF(v);
1023 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001024 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001025 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001026 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001027
Guido van Rossum7928cd71991-10-24 14:59:31 +00001028 case BINARY_RSHIFT:
1029 w = POP();
1030 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001031 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 Py_DECREF(v);
1033 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001034 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001035 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001036 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001037
Guido van Rossum7928cd71991-10-24 14:59:31 +00001038 case BINARY_AND:
1039 w = POP();
1040 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001041 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 Py_DECREF(v);
1043 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001044 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001045 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001046 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001047
Guido van Rossum7928cd71991-10-24 14:59:31 +00001048 case BINARY_XOR:
1049 w = POP();
1050 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001051 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001052 Py_DECREF(v);
1053 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001054 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001055 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001056 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001057
Guido van Rossum7928cd71991-10-24 14:59:31 +00001058 case BINARY_OR:
1059 w = POP();
1060 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001061 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001062 Py_DECREF(v);
1063 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001064 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001065 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001066 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001067
1068 case INPLACE_POWER:
1069 w = POP();
1070 v = POP();
1071 x = PyNumber_InPlacePower(v, w, Py_None);
1072 Py_DECREF(v);
1073 Py_DECREF(w);
1074 PUSH(x);
1075 if (x != NULL) continue;
1076 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001077
Thomas Wouters434d0822000-08-24 20:11:32 +00001078 case INPLACE_MULTIPLY:
1079 w = POP();
1080 v = POP();
1081 x = PyNumber_InPlaceMultiply(v, w);
1082 Py_DECREF(v);
1083 Py_DECREF(w);
1084 PUSH(x);
1085 if (x != NULL) continue;
1086 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001087
Thomas Wouters434d0822000-08-24 20:11:32 +00001088 case INPLACE_DIVIDE:
1089 w = POP();
1090 v = POP();
1091 x = PyNumber_InPlaceDivide(v, w);
1092 Py_DECREF(v);
1093 Py_DECREF(w);
1094 PUSH(x);
1095 if (x != NULL) continue;
1096 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001097
Guido van Rossum4668b002001-08-08 05:00:18 +00001098 case INPLACE_FLOOR_DIVIDE:
1099 w = POP();
1100 v = POP();
1101 x = PyNumber_InPlaceFloorDivide(v, w);
1102 Py_DECREF(v);
1103 Py_DECREF(w);
1104 PUSH(x);
1105 if (x != NULL) continue;
1106 break;
1107
1108 case INPLACE_TRUE_DIVIDE:
1109 w = POP();
1110 v = POP();
1111 x = PyNumber_InPlaceTrueDivide(v, w);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
1117
Thomas Wouters434d0822000-08-24 20:11:32 +00001118 case INPLACE_MODULO:
1119 w = POP();
1120 v = POP();
1121 x = PyNumber_InPlaceRemainder(v, w);
1122 Py_DECREF(v);
1123 Py_DECREF(w);
1124 PUSH(x);
1125 if (x != NULL) continue;
1126 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001127
Thomas Wouters434d0822000-08-24 20:11:32 +00001128 case INPLACE_ADD:
1129 w = POP();
1130 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001131 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001132 /* INLINE: int + int */
1133 register long a, b, i;
1134 a = PyInt_AS_LONG(v);
1135 b = PyInt_AS_LONG(w);
1136 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001137 if ((i^a) < 0 && (i^b) < 0)
1138 goto slow_iadd;
1139 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001140 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001141 else {
1142 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001143 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001144 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001145 Py_DECREF(v);
1146 Py_DECREF(w);
1147 PUSH(x);
1148 if (x != NULL) continue;
1149 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001150
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 case INPLACE_SUBTRACT:
1152 w = POP();
1153 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001154 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001155 /* INLINE: int - int */
1156 register long a, b, i;
1157 a = PyInt_AS_LONG(v);
1158 b = PyInt_AS_LONG(w);
1159 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001160 if ((i^a) < 0 && (i^~b) < 0)
1161 goto slow_isub;
1162 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001163 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001164 else {
1165 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001166 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001167 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 Py_DECREF(v);
1169 Py_DECREF(w);
1170 PUSH(x);
1171 if (x != NULL) continue;
1172 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001173
Thomas Wouters434d0822000-08-24 20:11:32 +00001174 case INPLACE_LSHIFT:
1175 w = POP();
1176 v = POP();
1177 x = PyNumber_InPlaceLshift(v, w);
1178 Py_DECREF(v);
1179 Py_DECREF(w);
1180 PUSH(x);
1181 if (x != NULL) continue;
1182 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001183
Thomas Wouters434d0822000-08-24 20:11:32 +00001184 case INPLACE_RSHIFT:
1185 w = POP();
1186 v = POP();
1187 x = PyNumber_InPlaceRshift(v, w);
1188 Py_DECREF(v);
1189 Py_DECREF(w);
1190 PUSH(x);
1191 if (x != NULL) continue;
1192 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001193
Thomas Wouters434d0822000-08-24 20:11:32 +00001194 case INPLACE_AND:
1195 w = POP();
1196 v = POP();
1197 x = PyNumber_InPlaceAnd(v, w);
1198 Py_DECREF(v);
1199 Py_DECREF(w);
1200 PUSH(x);
1201 if (x != NULL) continue;
1202 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001203
Thomas Wouters434d0822000-08-24 20:11:32 +00001204 case INPLACE_XOR:
1205 w = POP();
1206 v = POP();
1207 x = PyNumber_InPlaceXor(v, w);
1208 Py_DECREF(v);
1209 Py_DECREF(w);
1210 PUSH(x);
1211 if (x != NULL) continue;
1212 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001213
Thomas Wouters434d0822000-08-24 20:11:32 +00001214 case INPLACE_OR:
1215 w = POP();
1216 v = POP();
1217 x = PyNumber_InPlaceOr(v, w);
1218 Py_DECREF(v);
1219 Py_DECREF(w);
1220 PUSH(x);
1221 if (x != NULL) continue;
1222 break;
1223
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 case SLICE+0:
1225 case SLICE+1:
1226 case SLICE+2:
1227 case SLICE+3:
1228 if ((opcode-SLICE) & 2)
1229 w = POP();
1230 else
1231 w = NULL;
1232 if ((opcode-SLICE) & 1)
1233 v = POP();
1234 else
1235 v = NULL;
1236 u = POP();
1237 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001238 Py_DECREF(u);
1239 Py_XDECREF(v);
1240 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001242 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001244
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 case STORE_SLICE+0:
1246 case STORE_SLICE+1:
1247 case STORE_SLICE+2:
1248 case STORE_SLICE+3:
1249 if ((opcode-STORE_SLICE) & 2)
1250 w = POP();
1251 else
1252 w = NULL;
1253 if ((opcode-STORE_SLICE) & 1)
1254 v = POP();
1255 else
1256 v = NULL;
1257 u = POP();
1258 t = POP();
1259 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 Py_DECREF(t);
1261 Py_DECREF(u);
1262 Py_XDECREF(v);
1263 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001264 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001266
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 case DELETE_SLICE+0:
1268 case DELETE_SLICE+1:
1269 case DELETE_SLICE+2:
1270 case DELETE_SLICE+3:
1271 if ((opcode-DELETE_SLICE) & 2)
1272 w = POP();
1273 else
1274 w = NULL;
1275 if ((opcode-DELETE_SLICE) & 1)
1276 v = POP();
1277 else
1278 v = NULL;
1279 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 Py_DECREF(u);
1283 Py_XDECREF(v);
1284 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001285 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001287
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 case STORE_SUBSCR:
1289 w = POP();
1290 v = POP();
1291 u = POP();
1292 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001293 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 Py_DECREF(u);
1295 Py_DECREF(v);
1296 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001297 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001299
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 case DELETE_SUBSCR:
1301 w = POP();
1302 v = POP();
1303 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001304 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 Py_DECREF(v);
1306 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001307 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001309
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 case PRINT_EXPR:
1311 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001312 w = PySys_GetObject("displayhook");
1313 if (w == NULL) {
1314 PyErr_SetString(PyExc_RuntimeError,
1315 "lost sys.displayhook");
1316 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001317 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001318 }
1319 if (err == 0) {
1320 x = Py_BuildValue("(O)", v);
1321 if (x == NULL)
1322 err = -1;
1323 }
1324 if (err == 0) {
1325 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001326 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001327 if (w == NULL)
1328 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001330 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001331 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001333
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001334 case PRINT_ITEM_TO:
1335 w = stream = POP();
1336 /* fall through to PRINT_ITEM */
1337
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 case PRINT_ITEM:
1339 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001340 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001341 w = PySys_GetObject("stdout");
1342 if (w == NULL) {
1343 PyErr_SetString(PyExc_RuntimeError,
1344 "lost sys.stdout");
1345 err = -1;
1346 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001347 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001348 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001349 err = PyFile_WriteString(" ", w);
1350 if (err == 0)
1351 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001352 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001353 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001354 char *s = PyString_AsString(v);
1355 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001356 if (len > 0 &&
1357 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001358 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001359 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001362 Py_XDECREF(stream);
1363 stream = NULL;
1364 if (err == 0)
1365 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001367
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001368 case PRINT_NEWLINE_TO:
1369 w = stream = POP();
1370 /* fall through to PRINT_NEWLINE */
1371
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001373 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001374 w = PySys_GetObject("stdout");
1375 if (w == NULL)
1376 PyErr_SetString(PyExc_RuntimeError,
1377 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001378 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001379 if (w != NULL) {
1380 err = PyFile_WriteString("\n", w);
1381 if (err == 0)
1382 PyFile_SoftSpace(w, 0);
1383 }
1384 Py_XDECREF(stream);
1385 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001387
Thomas Wouters434d0822000-08-24 20:11:32 +00001388
1389#ifdef CASE_TOO_BIG
1390 default: switch (opcode) {
1391#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 case BREAK_LOOP:
1393 why = WHY_BREAK;
1394 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001395
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001396 case CONTINUE_LOOP:
1397 retval = PyInt_FromLong(oparg);
1398 why = WHY_CONTINUE;
1399 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001400
Guido van Rossumf10570b1995-07-07 22:53:21 +00001401 case RAISE_VARARGS:
1402 u = v = w = NULL;
1403 switch (oparg) {
1404 case 3:
1405 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001406 /* Fallthrough */
1407 case 2:
1408 v = POP(); /* value */
1409 /* Fallthrough */
1410 case 1:
1411 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001412 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001413 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001414 break;
1415 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001417 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001418 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001419 break;
1420 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001422
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001424 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001425 PyErr_SetString(PyExc_SystemError,
1426 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001427 break;
1428 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001429 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001430 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001432
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 case RETURN_VALUE:
1434 retval = POP();
1435 why = WHY_RETURN;
1436 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001437
Tim Peters5ca576e2001-06-18 22:08:13 +00001438 case YIELD_VALUE:
1439 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001440 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001441 f->f_lasti = INSTR_OFFSET();
1442 why = WHY_YIELD;
1443 break;
1444
1445
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001446 case EXEC_STMT:
1447 w = POP();
1448 v = POP();
1449 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001450 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001451 Py_DECREF(u);
1452 Py_DECREF(v);
1453 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001454 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001455
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 case POP_BLOCK:
1457 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001458 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 while (STACK_LEVEL() > b->b_level) {
1460 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001461 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 }
1463 }
1464 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001465
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 case END_FINALLY:
1467 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 if (PyInt_Check(v)) {
1469 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001470 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001471 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001472 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 retval = POP();
1474 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001475 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001477 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001478 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001480 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001482 else if (v != Py_None) {
1483 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 "'finally' pops bad exception");
1485 why = WHY_EXCEPTION;
1486 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001487 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001489
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001491 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001493 w = POP();
1494 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 Py_DECREF(u);
1497 Py_DECREF(v);
1498 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001500
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 case STORE_NAME:
1502 w = GETNAMEV(oparg);
1503 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001505 PyErr_Format(PyExc_SystemError,
1506 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001507 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001508 break;
1509 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 err = PyDict_SetItem(x, w, v);
1511 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001513
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001515 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001516 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001517 PyErr_Format(PyExc_SystemError,
1518 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001519 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520 break;
1521 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001523 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001524 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001526
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001527 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001529 if (PyTuple_Check(v)) {
1530 if (PyTuple_Size(v) != oparg) {
1531 PyErr_SetString(PyExc_ValueError,
1532 "unpack tuple of wrong size");
1533 why = WHY_EXCEPTION;
1534 }
1535 else {
1536 for (; --oparg >= 0; ) {
1537 w = PyTuple_GET_ITEM(v, oparg);
1538 Py_INCREF(w);
1539 PUSH(w);
1540 }
1541 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001543 else if (PyList_Check(v)) {
1544 if (PyList_Size(v) != oparg) {
1545 PyErr_SetString(PyExc_ValueError,
1546 "unpack list of wrong size");
1547 why = WHY_EXCEPTION;
1548 }
1549 else {
1550 for (; --oparg >= 0; ) {
1551 w = PyList_GET_ITEM(v, oparg);
1552 Py_INCREF(w);
1553 PUSH(w);
1554 }
1555 }
1556 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001557 else if (unpack_iterable(v, oparg,
1558 stack_pointer + oparg))
1559 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001560 else {
1561 if (PyErr_ExceptionMatches(PyExc_TypeError))
1562 PyErr_SetString(PyExc_TypeError,
1563 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001564 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001565 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001566 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001568
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001570 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 v = POP();
1572 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1574 Py_DECREF(v);
1575 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001577
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001579 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001581 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1582 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001585
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001586 case STORE_GLOBAL:
1587 w = GETNAMEV(oparg);
1588 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 err = PyDict_SetItem(f->f_globals, w, v);
1590 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001591 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001592
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001593 case DELETE_GLOBAL:
1594 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001596 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001597 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001598 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001599
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 case LOAD_CONST:
1601 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 PUSH(x);
1604 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001605
Guido van Rossum374a9221991-04-04 10:40:29 +00001606 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001607 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001609 PyErr_Format(PyExc_SystemError,
1610 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001611 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 break;
1613 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001617 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001618 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001620 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001621 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001622 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 break;
1624 }
1625 }
1626 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001627 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 PUSH(x);
1629 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001630
Guido van Rossum374a9221991-04-04 10:40:29 +00001631 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001632 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001635 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001636 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001637 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001638 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001639 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 break;
1641 }
1642 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001643 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 PUSH(x);
1645 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001646
Guido van Rossum9bfef441993-03-29 10:43:31 +00001647 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001648 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001649 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001650 format_exc_check_arg(
1651 PyExc_UnboundLocalError,
1652 UNBOUNDLOCAL_ERROR_MSG,
1653 PyTuple_GetItem(co->co_varnames, oparg)
1654 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001655 break;
1656 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001658 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001659 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001660 break;
1661
1662 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001663 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001664 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001665 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001666
1667 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001668 x = GETLOCAL(oparg);
1669 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001670 format_exc_check_arg(
1671 PyExc_UnboundLocalError,
1672 UNBOUNDLOCAL_ERROR_MSG,
1673 PyTuple_GetItem(co->co_varnames, oparg)
1674 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001675 break;
1676 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001677 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001678 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001679
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001680 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001681 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001682 Py_INCREF(x);
1683 PUSH(x);
1684 break;
1685
1686 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001687 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001688 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001689 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001690 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001691 v = PyTuple_GetItem(co->co_cellvars,
1692 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001693 format_exc_check_arg(
1694 PyExc_UnboundLocalError,
1695 UNBOUNDLOCAL_ERROR_MSG,
1696 v);
1697 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001698 v = PyTuple_GetItem(
1699 co->co_freevars,
1700 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001701 format_exc_check_arg(
1702 PyExc_NameError,
1703 UNBOUNDFREE_ERROR_MSG,
1704 v);
1705 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001706 err = -1;
1707 break;
1708 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001709 PUSH(w);
1710 break;
1711
1712 case STORE_DEREF:
1713 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001714 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001715 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001716 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001717 continue;
1718
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 if (x != NULL) {
1722 for (; --oparg >= 0;) {
1723 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001724 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 }
1726 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001727 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 }
1729 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001730
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 if (x != NULL) {
1734 for (; --oparg >= 0;) {
1735 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001736 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 }
1738 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001739 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 }
1741 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001742
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001744 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001746 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001748
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001750 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 x = PyObject_GetAttr(v, w);
1753 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001755 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001757
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 case COMPARE_OP:
1759 w = POP();
1760 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001761 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001762 /* INLINE: cmp(int, int) */
1763 register long a, b;
1764 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001765 a = PyInt_AS_LONG(v);
1766 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001767 switch (oparg) {
1768 case LT: res = a < b; break;
1769 case LE: res = a <= b; break;
1770 case EQ: res = a == b; break;
1771 case NE: res = a != b; break;
1772 case GT: res = a > b; break;
1773 case GE: res = a >= b; break;
1774 case IS: res = v == w; break;
1775 case IS_NOT: res = v != w; break;
1776 default: goto slow_compare;
1777 }
1778 x = res ? Py_True : Py_False;
1779 Py_INCREF(x);
1780 }
1781 else {
1782 slow_compare:
1783 x = cmp_outcome(oparg, v, w);
1784 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001785 Py_DECREF(v);
1786 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001788 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001790
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001793 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001794 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001795 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001796 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001797 break;
1798 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001799 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001801 w,
1802 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001803 f->f_locals == NULL ?
1804 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001805 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001806 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807 if (w == NULL) {
1808 x = NULL;
1809 break;
1810 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001811 x = PyEval_CallObject(x, w);
1812 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001813 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001814 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001816
Thomas Wouters52152252000-08-17 22:55:00 +00001817 case IMPORT_STAR:
1818 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001819 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001820 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001821 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001822 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001823 break;
1824 }
Thomas Wouters52152252000-08-17 22:55:00 +00001825 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001827 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001828 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001830
Thomas Wouters52152252000-08-17 22:55:00 +00001831 case IMPORT_FROM:
1832 w = GETNAMEV(oparg);
1833 v = TOP();
1834 x = import_from(v, w);
1835 PUSH(x);
1836 if (x != NULL) continue;
1837 break;
1838
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 case JUMP_FORWARD:
1840 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001841 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001842
Guido van Rossum374a9221991-04-04 10:40:29 +00001843 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001845 if (err > 0)
1846 err = 0;
1847 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001849 else
1850 break;
1851 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001852
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001854 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001855 if (err > 0) {
1856 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001858 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001859 else if (err == 0)
1860 ;
1861 else
1862 break;
1863 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001864
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 case JUMP_ABSOLUTE:
1866 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001867 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001868
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001869 case GET_ITER:
1870 /* before: [obj]; after [getiter(obj)] */
1871 v = POP();
1872 x = PyObject_GetIter(v);
1873 Py_DECREF(v);
1874 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001875 PUSH(x);
1876 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001877 }
1878 break;
1879
1880 case FOR_ITER:
1881 /* before: [iter]; after: [iter, iter()] *or* [] */
1882 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001883 x = PyIter_Next(v);
1884 if (x != NULL) {
1885 PUSH(x);
1886 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001887 }
Tim Petersf4848da2001-05-05 00:14:56 +00001888 if (!PyErr_Occurred()) {
1889 /* iterator ended normally */
1890 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001891 Py_DECREF(v);
1892 JUMPBY(oparg);
1893 continue;
1894 }
1895 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001896
Guido van Rossum374a9221991-04-04 10:40:29 +00001897 case FOR_LOOP:
1898 /* for v in s: ...
1899 On entry: stack contains s, i.
1900 On exit: stack contains s, i+1, s[i];
1901 but if loop exhausted:
1902 s, i are popped, and we jump */
1903 w = POP(); /* Loop index */
1904 v = POP(); /* Sequence object */
1905 u = loop_subscript(v, w);
1906 if (u != NULL) {
1907 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001908 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001909 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001910 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001911 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001912 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001913 }
1914 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001915 Py_DECREF(v);
1916 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001917 /* A NULL can mean "s exhausted"
1918 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001919 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001920 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001921 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001922 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001923 continue;
1924 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001925 }
1926 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001927
Guido van Rossum374a9221991-04-04 10:40:29 +00001928 case SETUP_LOOP:
1929 case SETUP_EXCEPT:
1930 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001931 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001932 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001933 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001934
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001936#ifdef LLTRACE
1937 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001938 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001939#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001940 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001941 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001942 continue;
1943 /* Trace each line of code reached */
1944 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001945 /* Inline call_trace() for performance: */
1946 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001947 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001948 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1949 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001950 tstate->use_tracing = (tstate->c_tracefunc
1951 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001952 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001953 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001954
1955 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001956 {
1957 int na = oparg & 0xff;
1958 int nk = (oparg>>8) & 0xff;
1959 int n = na + 2 * nk;
1960 PyObject **pfunc = stack_pointer - n - 1;
1961 PyObject *func = *pfunc;
1962 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1963
1964 /* Always dispatch PyCFunction first, because
1965 these are presumed to be the most frequent
1966 callable object.
1967 */
1968 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001969 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001970 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001971 x = do_call(func, &stack_pointer,
1972 na, nk);
1973 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001974 PyObject *callargs;
1975 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001976 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001977 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001978 } else
1979 x = fast_cfunction(func,
1980 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001981 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001982 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001983 && PyMethod_GET_SELF(func) != NULL) {
1984 /* optimize access to bound methods */
1985 PyObject *self = PyMethod_GET_SELF(func);
1986 Py_INCREF(self);
1987 func = PyMethod_GET_FUNCTION(func);
1988 Py_INCREF(func);
1989 Py_DECREF(*pfunc);
1990 *pfunc = self;
1991 na++;
1992 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001993 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001994 Py_INCREF(func);
1995 if (PyFunction_Check(func)) {
1996 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001997 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001998 } else {
1999 x = do_call(func, &stack_pointer,
2000 na, nk);
2001 }
2002 Py_DECREF(func);
2003 }
2004
2005 while (stack_pointer > pfunc) {
2006 w = POP();
2007 Py_DECREF(w);
2008 }
2009 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002010 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 continue;
2012 break;
2013 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002014
Jeremy Hylton76901512000-03-28 23:49:17 +00002015 case CALL_FUNCTION_VAR:
2016 case CALL_FUNCTION_KW:
2017 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002018 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002019 int na = oparg & 0xff;
2020 int nk = (oparg>>8) & 0xff;
2021 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002022 int n = na + 2 * nk;
2023 PyObject **pfunc, *func;
2024 if (flags & CALL_FLAG_VAR)
2025 n++;
2026 if (flags & CALL_FLAG_KW)
2027 n++;
2028 pfunc = stack_pointer - n - 1;
2029 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002030 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002031
Guido van Rossumac7be682001-01-17 15:42:30 +00002032 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002033 && PyMethod_GET_SELF(func) != NULL) {
2034 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002035 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002036 func = PyMethod_GET_FUNCTION(func);
2037 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002038 Py_DECREF(*pfunc);
2039 *pfunc = self;
2040 na++;
2041 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002042 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002043 Py_INCREF(func);
2044 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002045 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002046
Jeremy Hylton76901512000-03-28 23:49:17 +00002047 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002048 w = POP();
2049 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002050 }
2051 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002052 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002053 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002054 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002055 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002056
Guido van Rossum681d79a1995-07-18 14:51:37 +00002057 case MAKE_FUNCTION:
2058 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 x = PyFunction_New(v, f->f_globals);
2060 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002061 /* XXX Maybe this should be a separate opcode? */
2062 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002064 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002065 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002066 x = NULL;
2067 break;
2068 }
2069 while (--oparg >= 0) {
2070 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002072 }
2073 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002075 }
2076 PUSH(x);
2077 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002078
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002079 case MAKE_CLOSURE:
2080 {
2081 int nfree;
2082 v = POP(); /* code object */
2083 x = PyFunction_New(v, f->f_globals);
2084 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2085 Py_DECREF(v);
2086 /* XXX Maybe this should be a separate opcode? */
2087 if (x != NULL && nfree > 0) {
2088 v = PyTuple_New(nfree);
2089 if (v == NULL) {
2090 Py_DECREF(x);
2091 x = NULL;
2092 break;
2093 }
2094 while (--nfree >= 0) {
2095 w = POP();
2096 PyTuple_SET_ITEM(v, nfree, w);
2097 }
2098 err = PyFunction_SetClosure(x, v);
2099 Py_DECREF(v);
2100 }
2101 if (x != NULL && oparg > 0) {
2102 v = PyTuple_New(oparg);
2103 if (v == NULL) {
2104 Py_DECREF(x);
2105 x = NULL;
2106 break;
2107 }
2108 while (--oparg >= 0) {
2109 w = POP();
2110 PyTuple_SET_ITEM(v, oparg, w);
2111 }
2112 err = PyFunction_SetDefaults(x, v);
2113 Py_DECREF(v);
2114 }
2115 PUSH(x);
2116 break;
2117 }
2118
Guido van Rossum8861b741996-07-30 16:49:37 +00002119 case BUILD_SLICE:
2120 if (oparg == 3)
2121 w = POP();
2122 else
2123 w = NULL;
2124 v = POP();
2125 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002126 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 Py_DECREF(u);
2128 Py_DECREF(v);
2129 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002130 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002131 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002132 break;
2133
Fred Drakeef8ace32000-08-24 00:32:09 +00002134 case EXTENDED_ARG:
2135 opcode = NEXTOP();
2136 oparg = oparg<<16 | NEXTARG();
2137 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002138
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 default:
2140 fprintf(stderr,
2141 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002142 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 why = WHY_EXCEPTION;
2145 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002146
2147#ifdef CASE_TOO_BIG
2148 }
2149#endif
2150
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 } /* switch */
2152
2153 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002154
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002156
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002158 if (err == 0 && x != NULL) {
2159#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002160 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002162 fprintf(stderr,
2163 "XXX undetected error\n");
2164 else
2165#endif
2166 continue; /* Normal, fast path */
2167 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 err = 0;
2171 }
2172
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002174
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002177 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002178 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 why = WHY_EXCEPTION;
2180 }
2181 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002182#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002184 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002186 fprintf(stderr,
2187 "XXX undetected error (why=%d)\n",
2188 why);
2189 why = WHY_EXCEPTION;
2190 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 }
2192#endif
2193
2194 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002195
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002197 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002198 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002199 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002201
Fred Drake8f51f542001-10-04 14:48:42 +00002202 if (tstate->c_tracefunc != NULL)
2203 call_exc_trace(tstate->c_tracefunc,
2204 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002205 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002206
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002208
Guido van Rossum374a9221991-04-04 10:40:29 +00002209 if (why == WHY_RERAISE)
2210 why = WHY_EXCEPTION;
2211
2212 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002213
Tim Peters5ca576e2001-06-18 22:08:13 +00002214 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002216
2217 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2218 /* For a continue inside a try block,
2219 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002220 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2221 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002222 why = WHY_NOT;
2223 JUMPTO(PyInt_AS_LONG(retval));
2224 Py_DECREF(retval);
2225 break;
2226 }
2227
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 while (STACK_LEVEL() > b->b_level) {
2229 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002230 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002231 }
2232 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2233 why = WHY_NOT;
2234 JUMPTO(b->b_handler);
2235 break;
2236 }
2237 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002238 (b->b_type == SETUP_EXCEPT &&
2239 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002240 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 PyObject *exc, *val, *tb;
2242 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002243 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002244 val = Py_None;
2245 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002247 /* Make the raw exception data
2248 available to the handler,
2249 so a program can emulate the
2250 Python main loop. Don't do
2251 this for 'finally'. */
2252 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002253 PyErr_NormalizeException(
2254 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002255 set_exc_info(tstate,
2256 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002257 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002258 if (tb == NULL) {
2259 Py_INCREF(Py_None);
2260 PUSH(Py_None);
2261 } else
2262 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002263 PUSH(val);
2264 PUSH(exc);
2265 }
2266 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002267 if (why == WHY_RETURN ||
2268 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002269 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002270 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002271 PUSH(v);
2272 }
2273 why = WHY_NOT;
2274 JUMPTO(b->b_handler);
2275 break;
2276 }
2277 } /* unwind stack */
2278
2279 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002280
Guido van Rossum374a9221991-04-04 10:40:29 +00002281 if (why != WHY_NOT)
2282 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002283
Guido van Rossum374a9221991-04-04 10:40:29 +00002284 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002285
Tim Peters5ca576e2001-06-18 22:08:13 +00002286 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002287 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002288
Fred Drake9e3ad782001-07-03 23:39:52 +00002289 if (tstate->use_tracing) {
2290 if (tstate->c_tracefunc
2291 && (why == WHY_RETURN || why == WHY_YIELD)) {
2292 if (call_trace(tstate->c_tracefunc,
2293 tstate->c_traceobj, f,
2294 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002296 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002297 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002298 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002299 }
Fred Drake8f51f542001-10-04 14:48:42 +00002300 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002301 if (why == WHY_EXCEPTION)
2302 call_trace_protected(tstate->c_profilefunc,
2303 tstate->c_profileobj, f,
2304 PyTrace_RETURN);
2305 else if (call_trace(tstate->c_profilefunc,
2306 tstate->c_profileobj, f,
2307 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002308 Py_XDECREF(retval);
2309 retval = NULL;
2310 why = WHY_EXCEPTION;
2311 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002312 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002313 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002314
Guido van Rossuma027efa1997-05-05 20:56:21 +00002315 reset_exc_info(tstate);
2316
Tim Peters5ca576e2001-06-18 22:08:13 +00002317 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002318 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002319 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002320
Guido van Rossum96a42c81992-01-12 02:29:51 +00002321 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002322}
2323
Tim Peters6d6c1a32001-08-02 04:15:00 +00002324PyObject *
2325PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002326 PyObject **args, int argcount, PyObject **kws, int kwcount,
2327 PyObject **defs, int defcount, PyObject *closure)
2328{
2329 register PyFrameObject *f;
2330 register PyObject *retval = NULL;
2331 register PyObject **fastlocals, **freevars;
2332 PyThreadState *tstate = PyThreadState_GET();
2333 PyObject *x, *u;
2334
2335 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002336 PyErr_SetString(PyExc_SystemError,
2337 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002338 return NULL;
2339 }
2340
2341 f = PyFrame_New(tstate, /*back*/
2342 co, /*code*/
2343 globals, locals);
2344 if (f == NULL)
2345 return NULL;
2346
2347 fastlocals = f->f_localsplus;
2348 freevars = f->f_localsplus + f->f_nlocals;
2349
2350 if (co->co_argcount > 0 ||
2351 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2352 int i;
2353 int n = argcount;
2354 PyObject *kwdict = NULL;
2355 if (co->co_flags & CO_VARKEYWORDS) {
2356 kwdict = PyDict_New();
2357 if (kwdict == NULL)
2358 goto fail;
2359 i = co->co_argcount;
2360 if (co->co_flags & CO_VARARGS)
2361 i++;
2362 SETLOCAL(i, kwdict);
2363 }
2364 if (argcount > co->co_argcount) {
2365 if (!(co->co_flags & CO_VARARGS)) {
2366 PyErr_Format(PyExc_TypeError,
2367 "%.200s() takes %s %d "
2368 "%sargument%s (%d given)",
2369 PyString_AsString(co->co_name),
2370 defcount ? "at most" : "exactly",
2371 co->co_argcount,
2372 kwcount ? "non-keyword " : "",
2373 co->co_argcount == 1 ? "" : "s",
2374 argcount);
2375 goto fail;
2376 }
2377 n = co->co_argcount;
2378 }
2379 for (i = 0; i < n; i++) {
2380 x = args[i];
2381 Py_INCREF(x);
2382 SETLOCAL(i, x);
2383 }
2384 if (co->co_flags & CO_VARARGS) {
2385 u = PyTuple_New(argcount - n);
2386 if (u == NULL)
2387 goto fail;
2388 SETLOCAL(co->co_argcount, u);
2389 for (i = n; i < argcount; i++) {
2390 x = args[i];
2391 Py_INCREF(x);
2392 PyTuple_SET_ITEM(u, i-n, x);
2393 }
2394 }
2395 for (i = 0; i < kwcount; i++) {
2396 PyObject *keyword = kws[2*i];
2397 PyObject *value = kws[2*i + 1];
2398 int j;
2399 if (keyword == NULL || !PyString_Check(keyword)) {
2400 PyErr_Format(PyExc_TypeError,
2401 "%.200s() keywords must be strings",
2402 PyString_AsString(co->co_name));
2403 goto fail;
2404 }
2405 /* XXX slow -- speed up using dictionary? */
2406 for (j = 0; j < co->co_argcount; j++) {
2407 PyObject *nm = PyTuple_GET_ITEM(
2408 co->co_varnames, j);
2409 int cmp = PyObject_RichCompareBool(
2410 keyword, nm, Py_EQ);
2411 if (cmp > 0)
2412 break;
2413 else if (cmp < 0)
2414 goto fail;
2415 }
2416 /* Check errors from Compare */
2417 if (PyErr_Occurred())
2418 goto fail;
2419 if (j >= co->co_argcount) {
2420 if (kwdict == NULL) {
2421 PyErr_Format(PyExc_TypeError,
2422 "%.200s() got an unexpected "
2423 "keyword argument '%.400s'",
2424 PyString_AsString(co->co_name),
2425 PyString_AsString(keyword));
2426 goto fail;
2427 }
2428 PyDict_SetItem(kwdict, keyword, value);
2429 }
2430 else {
2431 if (GETLOCAL(j) != NULL) {
2432 PyErr_Format(PyExc_TypeError,
2433 "%.200s() got multiple "
2434 "values for keyword "
2435 "argument '%.400s'",
2436 PyString_AsString(co->co_name),
2437 PyString_AsString(keyword));
2438 goto fail;
2439 }
2440 Py_INCREF(value);
2441 SETLOCAL(j, value);
2442 }
2443 }
2444 if (argcount < co->co_argcount) {
2445 int m = co->co_argcount - defcount;
2446 for (i = argcount; i < m; i++) {
2447 if (GETLOCAL(i) == NULL) {
2448 PyErr_Format(PyExc_TypeError,
2449 "%.200s() takes %s %d "
2450 "%sargument%s (%d given)",
2451 PyString_AsString(co->co_name),
2452 ((co->co_flags & CO_VARARGS) ||
2453 defcount) ? "at least"
2454 : "exactly",
2455 m, kwcount ? "non-keyword " : "",
2456 m == 1 ? "" : "s", i);
2457 goto fail;
2458 }
2459 }
2460 if (n > m)
2461 i = n - m;
2462 else
2463 i = 0;
2464 for (; i < defcount; i++) {
2465 if (GETLOCAL(m+i) == NULL) {
2466 PyObject *def = defs[i];
2467 Py_INCREF(def);
2468 SETLOCAL(m+i, def);
2469 }
2470 }
2471 }
2472 }
2473 else {
2474 if (argcount > 0 || kwcount > 0) {
2475 PyErr_Format(PyExc_TypeError,
2476 "%.200s() takes no arguments (%d given)",
2477 PyString_AsString(co->co_name),
2478 argcount + kwcount);
2479 goto fail;
2480 }
2481 }
2482 /* Allocate and initialize storage for cell vars, and copy free
2483 vars into frame. This isn't too efficient right now. */
2484 if (f->f_ncells) {
2485 int i = 0, j = 0, nargs, found;
2486 char *cellname, *argname;
2487 PyObject *c;
2488
2489 nargs = co->co_argcount;
2490 if (co->co_flags & CO_VARARGS)
2491 nargs++;
2492 if (co->co_flags & CO_VARKEYWORDS)
2493 nargs++;
2494
2495 /* Check for cells that shadow args */
2496 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2497 cellname = PyString_AS_STRING(
2498 PyTuple_GET_ITEM(co->co_cellvars, i));
2499 found = 0;
2500 while (j < nargs) {
2501 argname = PyString_AS_STRING(
2502 PyTuple_GET_ITEM(co->co_varnames, j));
2503 if (strcmp(cellname, argname) == 0) {
2504 c = PyCell_New(GETLOCAL(j));
2505 if (c == NULL)
2506 goto fail;
2507 GETLOCAL(f->f_nlocals + i) = c;
2508 found = 1;
2509 break;
2510 }
2511 j++;
2512 }
2513 if (found == 0) {
2514 c = PyCell_New(NULL);
2515 if (c == NULL)
2516 goto fail;
2517 SETLOCAL(f->f_nlocals + i, c);
2518 }
2519 }
2520 /* Initialize any that are left */
2521 while (i < f->f_ncells) {
2522 c = PyCell_New(NULL);
2523 if (c == NULL)
2524 goto fail;
2525 SETLOCAL(f->f_nlocals + i, c);
2526 i++;
2527 }
2528 }
2529 if (f->f_nfreevars) {
2530 int i;
2531 for (i = 0; i < f->f_nfreevars; ++i) {
2532 PyObject *o = PyTuple_GET_ITEM(closure, i);
2533 Py_INCREF(o);
2534 freevars[f->f_ncells + i] = o;
2535 }
2536 }
2537
Tim Peters5ca576e2001-06-18 22:08:13 +00002538 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002539 /* Don't need to keep the reference to f_back, it will be set
2540 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002541 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002542 f->f_back = NULL;
2543
2544 /* Create a new generator that owns the ready to run frame
2545 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002546 return gen_new(f);
2547 }
2548
2549 retval = eval_frame(f);
2550
2551 fail: /* Jump here from prelude on failure */
2552
2553 Py_DECREF(f);
2554 return retval;
2555}
2556
2557
Guido van Rossuma027efa1997-05-05 20:56:21 +00002558static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002559set_exc_info(PyThreadState *tstate,
2560 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002561{
2562 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002563 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002564
Guido van Rossuma027efa1997-05-05 20:56:21 +00002565 frame = tstate->frame;
2566 if (frame->f_exc_type == NULL) {
2567 /* This frame didn't catch an exception before */
2568 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002569 if (tstate->exc_type == NULL) {
2570 Py_INCREF(Py_None);
2571 tstate->exc_type = Py_None;
2572 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002573 tmp_type = frame->f_exc_type;
2574 tmp_value = frame->f_exc_value;
2575 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002576 Py_XINCREF(tstate->exc_type);
2577 Py_XINCREF(tstate->exc_value);
2578 Py_XINCREF(tstate->exc_traceback);
2579 frame->f_exc_type = tstate->exc_type;
2580 frame->f_exc_value = tstate->exc_value;
2581 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002582 Py_XDECREF(tmp_type);
2583 Py_XDECREF(tmp_value);
2584 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002585 }
2586 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002587 tmp_type = tstate->exc_type;
2588 tmp_value = tstate->exc_value;
2589 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002590 Py_XINCREF(type);
2591 Py_XINCREF(value);
2592 Py_XINCREF(tb);
2593 tstate->exc_type = type;
2594 tstate->exc_value = value;
2595 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002596 Py_XDECREF(tmp_type);
2597 Py_XDECREF(tmp_value);
2598 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002599 /* For b/w compatibility */
2600 PySys_SetObject("exc_type", type);
2601 PySys_SetObject("exc_value", value);
2602 PySys_SetObject("exc_traceback", tb);
2603}
2604
2605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002606reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607{
2608 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002609 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002610 frame = tstate->frame;
2611 if (frame->f_exc_type != NULL) {
2612 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002613 tmp_type = tstate->exc_type;
2614 tmp_value = tstate->exc_value;
2615 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002616 Py_XINCREF(frame->f_exc_type);
2617 Py_XINCREF(frame->f_exc_value);
2618 Py_XINCREF(frame->f_exc_traceback);
2619 tstate->exc_type = frame->f_exc_type;
2620 tstate->exc_value = frame->f_exc_value;
2621 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002622 Py_XDECREF(tmp_type);
2623 Py_XDECREF(tmp_value);
2624 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002625 /* For b/w compatibility */
2626 PySys_SetObject("exc_type", frame->f_exc_type);
2627 PySys_SetObject("exc_value", frame->f_exc_value);
2628 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2629 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002630 tmp_type = frame->f_exc_type;
2631 tmp_value = frame->f_exc_value;
2632 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002633 frame->f_exc_type = NULL;
2634 frame->f_exc_value = NULL;
2635 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002636 Py_XDECREF(tmp_type);
2637 Py_XDECREF(tmp_value);
2638 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002639}
2640
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002641/* Logic for the raise statement (too complicated for inlining).
2642 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002643static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002644do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002645{
Guido van Rossumd295f121998-04-09 21:39:57 +00002646 if (type == NULL) {
2647 /* Reraise */
2648 PyThreadState *tstate = PyThreadState_Get();
2649 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2650 value = tstate->exc_value;
2651 tb = tstate->exc_traceback;
2652 Py_XINCREF(type);
2653 Py_XINCREF(value);
2654 Py_XINCREF(tb);
2655 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002656
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002657 /* We support the following forms of raise:
2658 raise <class>, <classinstance>
2659 raise <class>, <argument tuple>
2660 raise <class>, None
2661 raise <class>, <argument>
2662 raise <classinstance>, None
2663 raise <string>, <object>
2664 raise <string>, None
2665
2666 An omitted second argument is the same as None.
2667
2668 In addition, raise <tuple>, <anything> is the same as
2669 raising the tuple's first item (and it better have one!);
2670 this rule is applied recursively.
2671
2672 Finally, an optional third argument can be supplied, which
2673 gives the traceback to be substituted (useful when
2674 re-raising an exception after examining it). */
2675
2676 /* First, check the traceback argument, replacing None with
2677 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 if (tb == Py_None) {
2679 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002680 tb = NULL;
2681 }
2682 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002684 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002685 goto raise_error;
2686 }
2687
2688 /* Next, replace a missing value with None */
2689 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 value = Py_None;
2691 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002692 }
2693
2694 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2696 PyObject *tmp = type;
2697 type = PyTuple_GET_ITEM(type, 0);
2698 Py_INCREF(type);
2699 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002700 }
2701
Barry Warsaw4249f541997-08-22 21:26:19 +00002702 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002703 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002704
2705 else if (PyClass_Check(type))
2706 PyErr_NormalizeException(&type, &value, &tb);
2707
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002709 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 if (value != Py_None) {
2711 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002712 "instance exception may not have a separate value");
2713 goto raise_error;
2714 }
2715 else {
2716 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002718 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002719 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2720 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002721 }
2722 }
2723 else {
2724 /* Not something you can raise. You get an exception
2725 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002726 PyErr_Format(PyExc_TypeError,
2727 "exceptions must be strings, classes, or "
2728 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002729 goto raise_error;
2730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002732 if (tb == NULL)
2733 return WHY_EXCEPTION;
2734 else
2735 return WHY_RERAISE;
2736 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 Py_XDECREF(value);
2738 Py_XDECREF(type);
2739 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002740 return WHY_EXCEPTION;
2741}
2742
Tim Petersd6d010b2001-06-21 02:49:55 +00002743/* Iterate v argcnt times and store the results on the stack (via decreasing
2744 sp). Return 1 for success, 0 if error. */
2745
Barry Warsawe42b18f1997-08-25 22:13:04 +00002746static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002747unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002748{
Tim Petersd6d010b2001-06-21 02:49:55 +00002749 int i = 0;
2750 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002751 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002752
Tim Petersd6d010b2001-06-21 02:49:55 +00002753 assert(v != NULL);
2754
2755 it = PyObject_GetIter(v);
2756 if (it == NULL)
2757 goto Error;
2758
2759 for (; i < argcnt; i++) {
2760 w = PyIter_Next(it);
2761 if (w == NULL) {
2762 /* Iterator done, via error or exhaustion. */
2763 if (!PyErr_Occurred()) {
2764 PyErr_Format(PyExc_ValueError,
2765 "need more than %d value%s to unpack",
2766 i, i == 1 ? "" : "s");
2767 }
2768 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002769 }
2770 *--sp = w;
2771 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002772
2773 /* We better have exhausted the iterator now. */
2774 w = PyIter_Next(it);
2775 if (w == NULL) {
2776 if (PyErr_Occurred())
2777 goto Error;
2778 Py_DECREF(it);
2779 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002780 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002781 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002782 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002783Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002784 for (; i > 0; i--, sp++)
2785 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002786 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002787 return 0;
2788}
2789
2790
Guido van Rossum96a42c81992-01-12 02:29:51 +00002791#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002792static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002793prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002795 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002796 if (PyObject_Print(v, stdout, 0) != 0)
2797 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002798 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002799 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002801#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002803static void
Fred Drake5755ce62001-06-27 19:19:46 +00002804call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002805{
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002807 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002809 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002810 value = Py_None;
2811 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002812 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002813 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002814 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002816 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002817 }
Fred Drake5755ce62001-06-27 19:19:46 +00002818 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002819 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002820 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002822 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 Py_XDECREF(type);
2824 Py_XDECREF(value);
2825 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002826 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002827}
2828
Fred Drake4ec5d562001-10-04 19:26:43 +00002829static void
2830call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2831 int what)
2832{
2833 PyObject *type, *value, *traceback;
2834 int err;
2835 PyErr_Fetch(&type, &value, &traceback);
2836 err = call_trace(func, obj, frame, what, NULL);
2837 if (err == 0)
2838 PyErr_Restore(type, value, traceback);
2839 else {
2840 Py_XDECREF(type);
2841 Py_XDECREF(value);
2842 Py_XDECREF(traceback);
2843 }
2844}
2845
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002846static int
Fred Drake5755ce62001-06-27 19:19:46 +00002847call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2848 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002849{
Fred Drake5755ce62001-06-27 19:19:46 +00002850 register PyThreadState *tstate = frame->f_tstate;
2851 int result;
2852 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002853 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002854 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002855 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002856 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002857 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2858 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002859 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002860 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002861}
2862
Fred Drake5755ce62001-06-27 19:19:46 +00002863void
2864PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002865{
Fred Drake5755ce62001-06-27 19:19:46 +00002866 PyThreadState *tstate = PyThreadState_Get();
2867 PyObject *temp = tstate->c_profileobj;
2868 Py_XINCREF(arg);
2869 tstate->c_profilefunc = NULL;
2870 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002871 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002872 Py_XDECREF(temp);
2873 tstate->c_profilefunc = func;
2874 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002875 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002876}
2877
2878void
2879PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2880{
2881 PyThreadState *tstate = PyThreadState_Get();
2882 PyObject *temp = tstate->c_traceobj;
2883 Py_XINCREF(arg);
2884 tstate->c_tracefunc = NULL;
2885 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002886 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002887 Py_XDECREF(temp);
2888 tstate->c_tracefunc = func;
2889 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002890 tstate->use_tracing = ((func != NULL)
2891 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002892}
2893
Guido van Rossumb209a111997-04-29 18:18:01 +00002894PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002895PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002896{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002897 PyThreadState *tstate = PyThreadState_Get();
2898 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002899 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002900 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002901 else
2902 return current_frame->f_builtins;
2903}
2904
Guido van Rossumb209a111997-04-29 18:18:01 +00002905PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002906PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002907{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002908 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002909 if (current_frame == NULL)
2910 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002911 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002912 return current_frame->f_locals;
2913}
2914
Guido van Rossumb209a111997-04-29 18:18:01 +00002915PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002916PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002917{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002918 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002919 if (current_frame == NULL)
2920 return NULL;
2921 else
2922 return current_frame->f_globals;
2923}
2924
Guido van Rossumb209a111997-04-29 18:18:01 +00002925PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002926PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002927{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002928 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002929 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002930}
2931
Guido van Rossum6135a871995-01-09 17:53:26 +00002932int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002933PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002934{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002935 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002936 return current_frame == NULL ? 0 : current_frame->f_restricted;
2937}
2938
Guido van Rossumbe270261997-05-22 22:26:18 +00002939int
Tim Peters5ba58662001-07-16 02:29:45 +00002940PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002941{
2942 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002943 int result = 0;
2944
2945 if (current_frame != NULL) {
2946 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002947 const int compilerflags = codeflags & PyCF_MASK;
2948 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002949 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002950 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002951 }
2952 }
2953 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002954}
2955
2956int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002957Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958{
Guido van Rossumb209a111997-04-29 18:18:01 +00002959 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002960 if (f == NULL)
2961 return 0;
2962 if (!PyFile_SoftSpace(f, 0))
2963 return 0;
2964 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965}
2966
Guido van Rossum3f5da241990-12-20 15:06:42 +00002967
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968/* External interface to call any callable object.
2969 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002970
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002971#undef PyEval_CallObject
2972/* for backward compatibility: export this interface */
2973
Guido van Rossumb209a111997-04-29 18:18:01 +00002974PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002975PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002976{
Guido van Rossumb209a111997-04-29 18:18:01 +00002977 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002978}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002979#define PyEval_CallObject(func,arg) \
2980 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002981
Guido van Rossumb209a111997-04-29 18:18:01 +00002982PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002983PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002984{
Jeremy Hylton52820442001-01-03 23:52:36 +00002985 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002986
2987 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002988 arg = PyTuple_New(0);
2989 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002990 PyErr_SetString(PyExc_TypeError,
2991 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002992 return NULL;
2993 }
2994 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002995 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002996
Guido van Rossumb209a111997-04-29 18:18:01 +00002997 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002998 PyErr_SetString(PyExc_TypeError,
2999 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003000 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003001 return NULL;
3002 }
3003
Tim Peters6d6c1a32001-08-02 04:15:00 +00003004 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003005 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003006 return result;
3007}
3008
Tim Peters6d6c1a32001-08-02 04:15:00 +00003009char *
3010PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003011{
3012 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003013 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003014 else if (PyFunction_Check(func))
3015 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3016 else if (PyCFunction_Check(func))
3017 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3018 else if (PyClass_Check(func))
3019 return PyString_AsString(((PyClassObject*)func)->cl_name);
3020 else if (PyInstance_Check(func)) {
3021 return PyString_AsString(
3022 ((PyInstanceObject*)func)->in_class->cl_name);
3023 } else {
3024 return func->ob_type->tp_name;
3025 }
3026}
3027
Tim Peters6d6c1a32001-08-02 04:15:00 +00003028char *
3029PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003030{
3031 if (PyMethod_Check(func))
3032 return "()";
3033 else if (PyFunction_Check(func))
3034 return "()";
3035 else if (PyCFunction_Check(func))
3036 return "()";
3037 else if (PyClass_Check(func))
3038 return " constructor";
3039 else if (PyInstance_Check(func)) {
3040 return " instance";
3041 } else {
3042 return " object";
3043 }
3044}
3045
Jeremy Hylton52820442001-01-03 23:52:36 +00003046#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3047
3048/* The two fast_xxx() functions optimize calls for which no argument
3049 tuple is necessary; the objects are passed directly from the stack.
3050 fast_cfunction() is called for METH_OLDARGS functions.
3051 fast_function() is for functions with no special argument handling.
3052*/
3053
3054static PyObject *
3055fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3056{
3057 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3058 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003059 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003060
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003061 switch (flags) {
3062 case METH_OLDARGS:
3063 if (na == 0)
3064 return (*meth)(self, NULL);
3065 else if (na == 1) {
3066 PyObject *arg = EXT_POP(*pp_stack);
3067 PyObject *result = (*meth)(self, arg);
3068 Py_DECREF(arg);
3069 return result;
3070 } else {
3071 PyObject *args = load_args(pp_stack, na);
3072 PyObject *result = (*meth)(self, args);
3073 Py_DECREF(args);
3074 return result;
3075 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003076 case METH_NOARGS:
3077 if (na == 0)
3078 return (*meth)(self, NULL);
3079 PyErr_Format(PyExc_TypeError,
3080 "%.200s() takes no arguments (%d given)",
3081 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3082 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003083 case METH_O:
3084 if (na == 1) {
3085 PyObject *arg = EXT_POP(*pp_stack);
3086 PyObject *result = (*meth)(self, arg);
3087 Py_DECREF(arg);
3088 return result;
3089 }
3090 PyErr_Format(PyExc_TypeError,
3091 "%.200s() takes exactly one argument (%d given)",
3092 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3093 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003094 default:
3095 fprintf(stderr, "%.200s() flags = %d\n",
3096 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3097 PyErr_BadInternalCall();
3098 return NULL;
3099 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003100}
3101
3102static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003103fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003104{
3105 PyObject *co = PyFunction_GET_CODE(func);
3106 PyObject *globals = PyFunction_GET_GLOBALS(func);
3107 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003108 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003109 PyObject **d = NULL;
3110 int nd = 0;
3111
3112 if (argdefs != NULL) {
3113 d = &PyTuple_GET_ITEM(argdefs, 0);
3114 nd = ((PyTupleObject *)argdefs)->ob_size;
3115 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003116 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003117 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003118 (*pp_stack)-2*nk, nk, d, nd,
3119 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003120}
3121
3122static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003123update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3124 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003125{
3126 PyObject *kwdict = NULL;
3127 if (orig_kwdict == NULL)
3128 kwdict = PyDict_New();
3129 else {
3130 kwdict = PyDict_Copy(orig_kwdict);
3131 Py_DECREF(orig_kwdict);
3132 }
3133 if (kwdict == NULL)
3134 return NULL;
3135 while (--nk >= 0) {
3136 int err;
3137 PyObject *value = EXT_POP(*pp_stack);
3138 PyObject *key = EXT_POP(*pp_stack);
3139 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003140 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003141 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003142 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003143 PyEval_GetFuncName(func),
3144 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003145 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003146 Py_DECREF(key);
3147 Py_DECREF(value);
3148 Py_DECREF(kwdict);
3149 return NULL;
3150 }
3151 err = PyDict_SetItem(kwdict, key, value);
3152 Py_DECREF(key);
3153 Py_DECREF(value);
3154 if (err) {
3155 Py_DECREF(kwdict);
3156 return NULL;
3157 }
3158 }
3159 return kwdict;
3160}
3161
3162static PyObject *
3163update_star_args(int nstack, int nstar, PyObject *stararg,
3164 PyObject ***pp_stack)
3165{
3166 PyObject *callargs, *w;
3167
3168 callargs = PyTuple_New(nstack + nstar);
3169 if (callargs == NULL) {
3170 return NULL;
3171 }
3172 if (nstar) {
3173 int i;
3174 for (i = 0; i < nstar; i++) {
3175 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3176 Py_INCREF(a);
3177 PyTuple_SET_ITEM(callargs, nstack + i, a);
3178 }
3179 }
3180 while (--nstack >= 0) {
3181 w = EXT_POP(*pp_stack);
3182 PyTuple_SET_ITEM(callargs, nstack, w);
3183 }
3184 return callargs;
3185}
3186
3187static PyObject *
3188load_args(PyObject ***pp_stack, int na)
3189{
3190 PyObject *args = PyTuple_New(na);
3191 PyObject *w;
3192
3193 if (args == NULL)
3194 return NULL;
3195 while (--na >= 0) {
3196 w = EXT_POP(*pp_stack);
3197 PyTuple_SET_ITEM(args, na, w);
3198 }
3199 return args;
3200}
3201
3202static PyObject *
3203do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3204{
3205 PyObject *callargs = NULL;
3206 PyObject *kwdict = NULL;
3207 PyObject *result = NULL;
3208
3209 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003210 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003211 if (kwdict == NULL)
3212 goto call_fail;
3213 }
3214 callargs = load_args(pp_stack, na);
3215 if (callargs == NULL)
3216 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003217 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003218 call_fail:
3219 Py_XDECREF(callargs);
3220 Py_XDECREF(kwdict);
3221 return result;
3222}
3223
3224static PyObject *
3225ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3226{
3227 int nstar = 0;
3228 PyObject *callargs = NULL;
3229 PyObject *stararg = NULL;
3230 PyObject *kwdict = NULL;
3231 PyObject *result = NULL;
3232
3233 if (flags & CALL_FLAG_KW) {
3234 kwdict = EXT_POP(*pp_stack);
3235 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003236 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003237 "%s%s argument after ** "
3238 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003239 PyEval_GetFuncName(func),
3240 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003241 goto ext_call_fail;
3242 }
3243 }
3244 if (flags & CALL_FLAG_VAR) {
3245 stararg = EXT_POP(*pp_stack);
3246 if (!PyTuple_Check(stararg)) {
3247 PyObject *t = NULL;
3248 t = PySequence_Tuple(stararg);
3249 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003250 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3251 PyErr_Format(PyExc_TypeError,
3252 "%s%s argument after * "
3253 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003254 PyEval_GetFuncName(func),
3255 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003256 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003257 goto ext_call_fail;
3258 }
3259 Py_DECREF(stararg);
3260 stararg = t;
3261 }
3262 nstar = PyTuple_GET_SIZE(stararg);
3263 }
3264 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003265 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003266 if (kwdict == NULL)
3267 goto ext_call_fail;
3268 }
3269 callargs = update_star_args(na, nstar, stararg, pp_stack);
3270 if (callargs == NULL)
3271 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003272 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003273 ext_call_fail:
3274 Py_XDECREF(callargs);
3275 Py_XDECREF(kwdict);
3276 Py_XDECREF(stararg);
3277 return result;
3278}
3279
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003280#define SLICE_ERROR_MSG \
3281 "standard sequence type does not support step size other than one"
3282
Guido van Rossumb209a111997-04-29 18:18:01 +00003283static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003284loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285{
Guido van Rossumb209a111997-04-29 18:18:01 +00003286 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003287 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003288 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003289 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290 return NULL;
3291 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003292 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003293 v = (*sq->sq_item)(v, i);
3294 if (v)
3295 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003296 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003297 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003298 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003299}
3300
Guido van Rossum20c6add2000-05-08 14:06:50 +00003301/* Extract a slice index from a PyInt or PyLong, the index is bound to
3302 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3303 and error. Returns 1 on success.*/
3304
3305int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003306_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307{
3308 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003309 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003310 if (PyInt_Check(v)) {
3311 x = PyInt_AsLong(v);
3312 } else if (PyLong_Check(v)) {
3313 x = PyLong_AsLong(v);
3314 if (x==-1 && PyErr_Occurred()) {
3315 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003316 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003317
Guido van Rossumac7be682001-01-17 15:42:30 +00003318 if (!PyErr_ExceptionMatches(
3319 PyExc_OverflowError)) {
3320 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003321 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003322 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003323 }
3324
Guido van Rossumac7be682001-01-17 15:42:30 +00003325 /* Clear the OverflowError */
3326 PyErr_Clear();
3327
3328 /* It's an overflow error, so we need to
3329 check the sign of the long integer,
3330 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003331 the error. */
3332
3333 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003334 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003335 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003336
3337 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003338 cmp = PyObject_RichCompareBool(v, long_zero,
3339 Py_GT);
3340 Py_DECREF(long_zero);
3341 if (cmp < 0)
3342 return 0;
3343 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003344 x = INT_MAX;
3345 else
3346 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003347 }
3348 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003349 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003350 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003351 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003353 /* Truncate -- very long indices are truncated anyway */
3354 if (x > INT_MAX)
3355 x = INT_MAX;
3356 else if (x < -INT_MAX)
3357 x = 0;
3358 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003360 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361}
3362
Guido van Rossum50d756e2001-08-18 17:43:36 +00003363#undef ISINT
3364#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3365
Guido van Rossumb209a111997-04-29 18:18:01 +00003366static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003367apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003369 PyTypeObject *tp = u->ob_type;
3370 PySequenceMethods *sq = tp->tp_as_sequence;
3371
3372 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3373 int ilow = 0, ihigh = INT_MAX;
3374 if (!_PyEval_SliceIndex(v, &ilow))
3375 return NULL;
3376 if (!_PyEval_SliceIndex(w, &ihigh))
3377 return NULL;
3378 return PySequence_GetSlice(u, ilow, ihigh);
3379 }
3380 else {
3381 PyObject *slice = PySlice_New(v, w, NULL);
3382 if (slice != NULL)
3383 return PyObject_GetItem(u, slice);
3384 else
3385 return NULL;
3386 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003388
3389static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003390assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3391 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003393 PyTypeObject *tp = u->ob_type;
3394 PySequenceMethods *sq = tp->tp_as_sequence;
3395
3396 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3397 int ilow = 0, ihigh = INT_MAX;
3398 if (!_PyEval_SliceIndex(v, &ilow))
3399 return -1;
3400 if (!_PyEval_SliceIndex(w, &ihigh))
3401 return -1;
3402 if (x == NULL)
3403 return PySequence_DelSlice(u, ilow, ihigh);
3404 else
3405 return PySequence_SetSlice(u, ilow, ihigh, x);
3406 }
3407 else {
3408 PyObject *slice = PySlice_New(v, w, NULL);
3409 if (slice != NULL) {
3410 if (x != NULL)
3411 return PyObject_SetItem(u, slice, x);
3412 else
3413 return PyObject_DelItem(u, slice);
3414 }
3415 else
3416 return -1;
3417 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418}
3419
Guido van Rossumb209a111997-04-29 18:18:01 +00003420static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003421cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422{
Guido van Rossumac7be682001-01-17 15:42:30 +00003423 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003425 case IS:
3426 case IS_NOT:
3427 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003428 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003429 res = !res;
3430 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431 case IN:
3432 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003433 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003434 if (res < 0)
3435 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003436 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003437 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003438 break;
3439 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003440 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441 break;
3442 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003443 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003445 v = res ? Py_True : Py_False;
3446 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447 return v;
3448}
3449
Thomas Wouters52152252000-08-17 22:55:00 +00003450static PyObject *
3451import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003452{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003453 PyObject *x;
3454
3455 x = PyObject_GetAttr(v, name);
3456 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003457 PyErr_Format(PyExc_ImportError,
3458 "cannot import name %.230s",
3459 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003460 }
Thomas Wouters52152252000-08-17 22:55:00 +00003461 return x;
3462}
Guido van Rossumac7be682001-01-17 15:42:30 +00003463
Thomas Wouters52152252000-08-17 22:55:00 +00003464static int
3465import_all_from(PyObject *locals, PyObject *v)
3466{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003467 PyObject *all = PyObject_GetAttrString(v, "__all__");
3468 PyObject *dict, *name, *value;
3469 int skip_leading_underscores = 0;
3470 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003471
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003472 if (all == NULL) {
3473 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3474 return -1; /* Unexpected error */
3475 PyErr_Clear();
3476 dict = PyObject_GetAttrString(v, "__dict__");
3477 if (dict == NULL) {
3478 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3479 return -1;
3480 PyErr_SetString(PyExc_ImportError,
3481 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003482 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003483 }
3484 all = PyMapping_Keys(dict);
3485 Py_DECREF(dict);
3486 if (all == NULL)
3487 return -1;
3488 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003489 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003490
3491 for (pos = 0, err = 0; ; pos++) {
3492 name = PySequence_GetItem(all, pos);
3493 if (name == NULL) {
3494 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3495 err = -1;
3496 else
3497 PyErr_Clear();
3498 break;
3499 }
3500 if (skip_leading_underscores &&
3501 PyString_Check(name) &&
3502 PyString_AS_STRING(name)[0] == '_')
3503 {
3504 Py_DECREF(name);
3505 continue;
3506 }
3507 value = PyObject_GetAttr(v, name);
3508 if (value == NULL)
3509 err = -1;
3510 else
3511 err = PyDict_SetItem(locals, name, value);
3512 Py_DECREF(name);
3513 Py_XDECREF(value);
3514 if (err != 0)
3515 break;
3516 }
3517 Py_DECREF(all);
3518 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003519}
3520
Guido van Rossumb209a111997-04-29 18:18:01 +00003521static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003522build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003523{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003524 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003525
3526 if (PyDict_Check(methods))
3527 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003528 if (metaclass != NULL)
3529 Py_INCREF(methods);
3530 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3531 base = PyTuple_GET_ITEM(bases, 0);
3532 metaclass = PyObject_GetAttrString(base, "__class__");
3533 if (metaclass == NULL) {
3534 PyErr_Clear();
3535 metaclass = (PyObject *)base->ob_type;
3536 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003537 }
3538 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003539 else {
3540 PyObject *g = PyEval_GetGlobals();
3541 if (g != NULL && PyDict_Check(g))
3542 metaclass = PyDict_GetItemString(g, "__metaclass__");
3543 if (metaclass == NULL)
3544 metaclass = (PyObject *) &PyClass_Type;
3545 Py_INCREF(metaclass);
3546 }
3547 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3548 Py_DECREF(metaclass);
3549 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003550}
3551
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003552static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003553exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3554 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003555{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003556 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003557 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003558 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003559
Guido van Rossumb209a111997-04-29 18:18:01 +00003560 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3561 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003562 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003563 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003564 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003565 locals = PyTuple_GetItem(prog, 2);
3566 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003567 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003568 if (globals == Py_None) {
3569 globals = PyEval_GetGlobals();
3570 if (locals == Py_None) {
3571 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003572 plain = 1;
3573 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003574 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003575 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003576 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003577 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003578 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003579 !PyCode_Check(prog) &&
3580 !PyFile_Check(prog)) {
3581 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003582 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003583 return -1;
3584 }
Fred Drake661ea262000-10-24 19:57:45 +00003585 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003586 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003587 "exec: arg 2 must be a dictionary or None");
3588 return -1;
3589 }
3590 if (!PyDict_Check(locals)) {
3591 PyErr_SetString(PyExc_TypeError,
3592 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003593 return -1;
3594 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003595 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003596 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003597 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003598 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003599 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003600 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003601 FILE *fp = PyFile_AsFile(prog);
3602 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003603 PyCompilerFlags cf;
3604 cf.cf_flags = 0;
3605 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003606 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3607 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003608 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003609 v = PyRun_File(fp, name, Py_file_input, globals,
3610 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003611 }
3612 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003613 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003614 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003615 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003616 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003617 cf.cf_flags = 0;
3618 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003619 v = PyRun_StringFlags(str, Py_file_input, globals,
3620 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003621 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003622 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003623 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003624 if (plain)
3625 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003626 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003627 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003628 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003629 return 0;
3630}
Guido van Rossum24c13741995-02-14 09:42:43 +00003631
Guido van Rossumac7be682001-01-17 15:42:30 +00003632static void
Paul Prescode68140d2000-08-30 20:25:01 +00003633format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3634{
3635 char *obj_str;
3636
3637 if (!obj)
3638 return;
3639
3640 obj_str = PyString_AsString(obj);
3641 if (!obj_str)
3642 return;
3643
3644 PyErr_Format(exc, format_str, obj_str);
3645}
Guido van Rossum950361c1997-01-24 13:49:28 +00003646
3647#ifdef DYNAMIC_EXECUTION_PROFILE
3648
Skip Montanarof118cb12001-10-15 20:51:38 +00003649static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003650getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003651{
3652 int i;
3653 PyObject *l = PyList_New(256);
3654 if (l == NULL) return NULL;
3655 for (i = 0; i < 256; i++) {
3656 PyObject *x = PyInt_FromLong(a[i]);
3657 if (x == NULL) {
3658 Py_DECREF(l);
3659 return NULL;
3660 }
3661 PyList_SetItem(l, i, x);
3662 }
3663 for (i = 0; i < 256; i++)
3664 a[i] = 0;
3665 return l;
3666}
3667
3668PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003669_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003670{
3671#ifndef DXPAIRS
3672 return getarray(dxp);
3673#else
3674 int i;
3675 PyObject *l = PyList_New(257);
3676 if (l == NULL) return NULL;
3677 for (i = 0; i < 257; i++) {
3678 PyObject *x = getarray(dxpairs[i]);
3679 if (x == NULL) {
3680 Py_DECREF(l);
3681 return NULL;
3682 }
3683 PyList_SetItem(l, i, x);
3684 }
3685 return l;
3686#endif
3687}
3688
3689#endif