blob: 535851775f48d892c9a8aaa8100278204c0b7283 [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);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001352 if (err == 0) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001353 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001354 if (PyString_Check(v)) {
1355 char *s = PyString_AS_STRING(v);
1356 int len = PyString_GET_SIZE(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001357 if (len > 0 &&
1358 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001359 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 PyFile_SoftSpace(w, 0);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001361 }
1362 else if (PyUnicode_Check(v)) {
1363 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1364 int len = PyUnicode_GET_SIZE(v);
1365 if (len > 0 &&
1366 Py_UNICODE_ISSPACE(s[len-1]) &&
1367 s[len-1] != ' ')
1368 PyFile_SoftSpace(w, 0);
1369 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001372 Py_XDECREF(stream);
1373 stream = NULL;
1374 if (err == 0)
1375 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001377
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001378 case PRINT_NEWLINE_TO:
1379 w = stream = POP();
1380 /* fall through to PRINT_NEWLINE */
1381
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001383 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001384 w = PySys_GetObject("stdout");
1385 if (w == NULL)
1386 PyErr_SetString(PyExc_RuntimeError,
1387 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001388 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001389 if (w != NULL) {
1390 err = PyFile_WriteString("\n", w);
1391 if (err == 0)
1392 PyFile_SoftSpace(w, 0);
1393 }
1394 Py_XDECREF(stream);
1395 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001397
Thomas Wouters434d0822000-08-24 20:11:32 +00001398
1399#ifdef CASE_TOO_BIG
1400 default: switch (opcode) {
1401#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 case BREAK_LOOP:
1403 why = WHY_BREAK;
1404 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001405
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001406 case CONTINUE_LOOP:
1407 retval = PyInt_FromLong(oparg);
1408 why = WHY_CONTINUE;
1409 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001410
Guido van Rossumf10570b1995-07-07 22:53:21 +00001411 case RAISE_VARARGS:
1412 u = v = w = NULL;
1413 switch (oparg) {
1414 case 3:
1415 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001416 /* Fallthrough */
1417 case 2:
1418 v = POP(); /* value */
1419 /* Fallthrough */
1420 case 1:
1421 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001422 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001423 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001424 break;
1425 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001427 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001428 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001429 break;
1430 }
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 LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001434 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001435 PyErr_SetString(PyExc_SystemError,
1436 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 break;
1438 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001442
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 case RETURN_VALUE:
1444 retval = POP();
1445 why = WHY_RETURN;
1446 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001447
Tim Peters5ca576e2001-06-18 22:08:13 +00001448 case YIELD_VALUE:
1449 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001450 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001451 f->f_lasti = INSTR_OFFSET();
1452 why = WHY_YIELD;
1453 break;
1454
1455
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001456 case EXEC_STMT:
1457 w = POP();
1458 v = POP();
1459 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001460 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001461 Py_DECREF(u);
1462 Py_DECREF(v);
1463 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001464 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001465
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 case POP_BLOCK:
1467 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 while (STACK_LEVEL() > b->b_level) {
1470 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001471 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 }
1473 }
1474 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001475
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 case END_FINALLY:
1477 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001478 if (PyInt_Check(v)) {
1479 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001480 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001481 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001482 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 retval = POP();
1484 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001487 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001490 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 else if (v != Py_None) {
1493 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 "'finally' pops bad exception");
1495 why = WHY_EXCEPTION;
1496 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001499
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001501 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001503 w = POP();
1504 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001506 Py_DECREF(u);
1507 Py_DECREF(v);
1508 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001510
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 case STORE_NAME:
1512 w = GETNAMEV(oparg);
1513 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001514 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001515 PyErr_Format(PyExc_SystemError,
1516 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001517 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001518 break;
1519 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 err = PyDict_SetItem(x, w, v);
1521 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001523
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001525 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001526 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001527 PyErr_Format(PyExc_SystemError,
1528 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001529 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001530 break;
1531 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001533 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001534 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001536
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001537 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001539 if (PyTuple_Check(v)) {
1540 if (PyTuple_Size(v) != oparg) {
1541 PyErr_SetString(PyExc_ValueError,
1542 "unpack tuple of wrong size");
1543 why = WHY_EXCEPTION;
1544 }
1545 else {
1546 for (; --oparg >= 0; ) {
1547 w = PyTuple_GET_ITEM(v, oparg);
1548 Py_INCREF(w);
1549 PUSH(w);
1550 }
1551 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001553 else if (PyList_Check(v)) {
1554 if (PyList_Size(v) != oparg) {
1555 PyErr_SetString(PyExc_ValueError,
1556 "unpack list of wrong size");
1557 why = WHY_EXCEPTION;
1558 }
1559 else {
1560 for (; --oparg >= 0; ) {
1561 w = PyList_GET_ITEM(v, oparg);
1562 Py_INCREF(w);
1563 PUSH(w);
1564 }
1565 }
1566 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001567 else if (unpack_iterable(v, oparg,
1568 stack_pointer + oparg))
1569 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001570 else {
1571 if (PyErr_ExceptionMatches(PyExc_TypeError))
1572 PyErr_SetString(PyExc_TypeError,
1573 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001574 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001575 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001578
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001580 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 v = POP();
1582 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1584 Py_DECREF(v);
1585 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001587
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001589 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001591 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1592 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001595
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001596 case STORE_GLOBAL:
1597 w = GETNAMEV(oparg);
1598 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 err = PyDict_SetItem(f->f_globals, w, v);
1600 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001601 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001602
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001603 case DELETE_GLOBAL:
1604 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001605 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001606 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001607 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001608 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 case LOAD_CONST:
1611 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001612 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001613 PUSH(x);
1614 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001615
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001617 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001619 PyErr_Format(PyExc_SystemError,
1620 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001621 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001622 break;
1623 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001624 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001625 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001628 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001630 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001631 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001632 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 break;
1634 }
1635 }
1636 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 PUSH(x);
1639 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001640
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001642 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001643 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001647 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001648 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001649 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 break;
1651 }
1652 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 PUSH(x);
1655 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001656
Guido van Rossum9bfef441993-03-29 10:43:31 +00001657 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001659 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001660 format_exc_check_arg(
1661 PyExc_UnboundLocalError,
1662 UNBOUNDLOCAL_ERROR_MSG,
1663 PyTuple_GetItem(co->co_varnames, oparg)
1664 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001665 break;
1666 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001668 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001669 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001670 break;
1671
1672 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001673 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001674 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001675 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001676
1677 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001678 x = GETLOCAL(oparg);
1679 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001680 format_exc_check_arg(
1681 PyExc_UnboundLocalError,
1682 UNBOUNDLOCAL_ERROR_MSG,
1683 PyTuple_GetItem(co->co_varnames, oparg)
1684 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001685 break;
1686 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001687 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001688 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001689
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001690 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001691 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001692 Py_INCREF(x);
1693 PUSH(x);
1694 break;
1695
1696 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001697 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001698 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001699 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001700 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001701 v = PyTuple_GetItem(co->co_cellvars,
1702 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001703 format_exc_check_arg(
1704 PyExc_UnboundLocalError,
1705 UNBOUNDLOCAL_ERROR_MSG,
1706 v);
1707 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001708 v = PyTuple_GetItem(
1709 co->co_freevars,
1710 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001711 format_exc_check_arg(
1712 PyExc_NameError,
1713 UNBOUNDFREE_ERROR_MSG,
1714 v);
1715 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001716 err = -1;
1717 break;
1718 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001719 PUSH(w);
1720 break;
1721
1722 case STORE_DEREF:
1723 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001724 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001725 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001726 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001727 continue;
1728
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 if (x != NULL) {
1732 for (; --oparg >= 0;) {
1733 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001734 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 }
1736 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001737 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 }
1739 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001740
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 if (x != NULL) {
1744 for (; --oparg >= 0;) {
1745 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001746 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 }
1748 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001749 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 }
1751 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001752
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001754 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001756 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001758
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001760 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 x = PyObject_GetAttr(v, w);
1763 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001765 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001767
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 case COMPARE_OP:
1769 w = POP();
1770 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001771 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001772 /* INLINE: cmp(int, int) */
1773 register long a, b;
1774 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001775 a = PyInt_AS_LONG(v);
1776 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001777 switch (oparg) {
1778 case LT: res = a < b; break;
1779 case LE: res = a <= b; break;
1780 case EQ: res = a == b; break;
1781 case NE: res = a != b; break;
1782 case GT: res = a > b; break;
1783 case GE: res = a >= b; break;
1784 case IS: res = v == w; break;
1785 case IS_NOT: res = v != w; break;
1786 default: goto slow_compare;
1787 }
1788 x = res ? Py_True : Py_False;
1789 Py_INCREF(x);
1790 }
1791 else {
1792 slow_compare:
1793 x = cmp_outcome(oparg, v, w);
1794 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001795 Py_DECREF(v);
1796 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001798 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001800
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001802 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001803 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001805 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001806 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807 break;
1808 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001809 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001811 w,
1812 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001813 f->f_locals == NULL ?
1814 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001815 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001816 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001817 if (w == NULL) {
1818 x = NULL;
1819 break;
1820 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 x = PyEval_CallObject(x, w);
1822 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001823 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001824 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001826
Thomas Wouters52152252000-08-17 22:55:00 +00001827 case IMPORT_STAR:
1828 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001829 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001830 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001831 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001832 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001833 break;
1834 }
Thomas Wouters52152252000-08-17 22:55:00 +00001835 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001837 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001838 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001840
Thomas Wouters52152252000-08-17 22:55:00 +00001841 case IMPORT_FROM:
1842 w = GETNAMEV(oparg);
1843 v = TOP();
1844 x = import_from(v, w);
1845 PUSH(x);
1846 if (x != NULL) continue;
1847 break;
1848
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 case JUMP_FORWARD:
1850 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001851 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001852
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 case JUMP_IF_FALSE:
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;
1857 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001859 else
1860 break;
1861 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001862
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001865 if (err > 0) {
1866 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001868 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 else if (err == 0)
1870 ;
1871 else
1872 break;
1873 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001874
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 case JUMP_ABSOLUTE:
1876 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001877 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001878
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001879 case GET_ITER:
1880 /* before: [obj]; after [getiter(obj)] */
1881 v = POP();
1882 x = PyObject_GetIter(v);
1883 Py_DECREF(v);
1884 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001885 PUSH(x);
1886 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001887 }
1888 break;
1889
1890 case FOR_ITER:
1891 /* before: [iter]; after: [iter, iter()] *or* [] */
1892 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001893 x = PyIter_Next(v);
1894 if (x != NULL) {
1895 PUSH(x);
1896 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001897 }
Tim Petersf4848da2001-05-05 00:14:56 +00001898 if (!PyErr_Occurred()) {
1899 /* iterator ended normally */
1900 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001901 Py_DECREF(v);
1902 JUMPBY(oparg);
1903 continue;
1904 }
1905 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001906
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 case FOR_LOOP:
1908 /* for v in s: ...
1909 On entry: stack contains s, i.
1910 On exit: stack contains s, i+1, s[i];
1911 but if loop exhausted:
1912 s, i are popped, and we jump */
1913 w = POP(); /* Loop index */
1914 v = POP(); /* Sequence object */
1915 u = loop_subscript(v, w);
1916 if (u != NULL) {
1917 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001918 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001919 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001920 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001921 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001922 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001923 }
1924 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001925 Py_DECREF(v);
1926 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001927 /* A NULL can mean "s exhausted"
1928 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001929 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001930 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001931 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001932 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001933 continue;
1934 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 }
1936 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001937
Guido van Rossum374a9221991-04-04 10:40:29 +00001938 case SETUP_LOOP:
1939 case SETUP_EXCEPT:
1940 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001941 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001942 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001943 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001944
Guido van Rossum374a9221991-04-04 10:40:29 +00001945 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001946#ifdef LLTRACE
1947 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001949#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001950 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001951 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001952 continue;
1953 /* Trace each line of code reached */
1954 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001955 /* Inline call_trace() for performance: */
1956 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001957 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001958 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1959 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001960 tstate->use_tracing = (tstate->c_tracefunc
1961 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001962 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001963 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001964
1965 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001966 {
1967 int na = oparg & 0xff;
1968 int nk = (oparg>>8) & 0xff;
1969 int n = na + 2 * nk;
1970 PyObject **pfunc = stack_pointer - n - 1;
1971 PyObject *func = *pfunc;
1972 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1973
1974 /* Always dispatch PyCFunction first, because
1975 these are presumed to be the most frequent
1976 callable object.
1977 */
1978 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001979 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001980 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001981 x = do_call(func, &stack_pointer,
1982 na, nk);
1983 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001984 PyObject *callargs;
1985 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001986 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001987 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001988 } else
1989 x = fast_cfunction(func,
1990 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001991 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001992 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001993 && PyMethod_GET_SELF(func) != NULL) {
1994 /* optimize access to bound methods */
1995 PyObject *self = PyMethod_GET_SELF(func);
1996 Py_INCREF(self);
1997 func = PyMethod_GET_FUNCTION(func);
1998 Py_INCREF(func);
1999 Py_DECREF(*pfunc);
2000 *pfunc = self;
2001 na++;
2002 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002003 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002004 Py_INCREF(func);
2005 if (PyFunction_Check(func)) {
2006 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002007 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002008 } else {
2009 x = do_call(func, &stack_pointer,
2010 na, nk);
2011 }
2012 Py_DECREF(func);
2013 }
2014
2015 while (stack_pointer > pfunc) {
2016 w = POP();
2017 Py_DECREF(w);
2018 }
2019 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002020 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002021 continue;
2022 break;
2023 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002024
Jeremy Hylton76901512000-03-28 23:49:17 +00002025 case CALL_FUNCTION_VAR:
2026 case CALL_FUNCTION_KW:
2027 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002028 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002029 int na = oparg & 0xff;
2030 int nk = (oparg>>8) & 0xff;
2031 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002032 int n = na + 2 * nk;
2033 PyObject **pfunc, *func;
2034 if (flags & CALL_FLAG_VAR)
2035 n++;
2036 if (flags & CALL_FLAG_KW)
2037 n++;
2038 pfunc = stack_pointer - n - 1;
2039 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002040 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002041
Guido van Rossumac7be682001-01-17 15:42:30 +00002042 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002043 && PyMethod_GET_SELF(func) != NULL) {
2044 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002045 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002046 func = PyMethod_GET_FUNCTION(func);
2047 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002048 Py_DECREF(*pfunc);
2049 *pfunc = self;
2050 na++;
2051 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002052 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002053 Py_INCREF(func);
2054 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002055 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002056
Jeremy Hylton76901512000-03-28 23:49:17 +00002057 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002058 w = POP();
2059 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002060 }
2061 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002062 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002063 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002064 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002065 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002066
Guido van Rossum681d79a1995-07-18 14:51:37 +00002067 case MAKE_FUNCTION:
2068 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002069 x = PyFunction_New(v, f->f_globals);
2070 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002071 /* XXX Maybe this should be a separate opcode? */
2072 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002076 x = NULL;
2077 break;
2078 }
2079 while (--oparg >= 0) {
2080 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002082 }
2083 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002084 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002085 }
2086 PUSH(x);
2087 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002088
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002089 case MAKE_CLOSURE:
2090 {
2091 int nfree;
2092 v = POP(); /* code object */
2093 x = PyFunction_New(v, f->f_globals);
2094 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2095 Py_DECREF(v);
2096 /* XXX Maybe this should be a separate opcode? */
2097 if (x != NULL && nfree > 0) {
2098 v = PyTuple_New(nfree);
2099 if (v == NULL) {
2100 Py_DECREF(x);
2101 x = NULL;
2102 break;
2103 }
2104 while (--nfree >= 0) {
2105 w = POP();
2106 PyTuple_SET_ITEM(v, nfree, w);
2107 }
2108 err = PyFunction_SetClosure(x, v);
2109 Py_DECREF(v);
2110 }
2111 if (x != NULL && oparg > 0) {
2112 v = PyTuple_New(oparg);
2113 if (v == NULL) {
2114 Py_DECREF(x);
2115 x = NULL;
2116 break;
2117 }
2118 while (--oparg >= 0) {
2119 w = POP();
2120 PyTuple_SET_ITEM(v, oparg, w);
2121 }
2122 err = PyFunction_SetDefaults(x, v);
2123 Py_DECREF(v);
2124 }
2125 PUSH(x);
2126 break;
2127 }
2128
Guido van Rossum8861b741996-07-30 16:49:37 +00002129 case BUILD_SLICE:
2130 if (oparg == 3)
2131 w = POP();
2132 else
2133 w = NULL;
2134 v = POP();
2135 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002136 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002137 Py_DECREF(u);
2138 Py_DECREF(v);
2139 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002140 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002141 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002142 break;
2143
Fred Drakeef8ace32000-08-24 00:32:09 +00002144 case EXTENDED_ARG:
2145 opcode = NEXTOP();
2146 oparg = oparg<<16 | NEXTARG();
2147 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002148
Guido van Rossum374a9221991-04-04 10:40:29 +00002149 default:
2150 fprintf(stderr,
2151 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002152 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 why = WHY_EXCEPTION;
2155 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002156
2157#ifdef CASE_TOO_BIG
2158 }
2159#endif
2160
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 } /* switch */
2162
2163 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002164
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002166
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002168 if (err == 0 && x != NULL) {
2169#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002170 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002172 fprintf(stderr,
2173 "XXX undetected error\n");
2174 else
2175#endif
2176 continue; /* Normal, fast path */
2177 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 err = 0;
2181 }
2182
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002184
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002187 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002188 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002189 why = WHY_EXCEPTION;
2190 }
2191 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002192#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002193 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002194 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002196 fprintf(stderr,
2197 "XXX undetected error (why=%d)\n",
2198 why);
2199 why = WHY_EXCEPTION;
2200 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002201 }
2202#endif
2203
2204 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002207 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002209 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002210 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002211
Fred Drake8f51f542001-10-04 14:48:42 +00002212 if (tstate->c_tracefunc != NULL)
2213 call_exc_trace(tstate->c_tracefunc,
2214 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002215 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002216
Guido van Rossum374a9221991-04-04 10:40:29 +00002217 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002218
Guido van Rossum374a9221991-04-04 10:40:29 +00002219 if (why == WHY_RERAISE)
2220 why = WHY_EXCEPTION;
2221
2222 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002223
Tim Peters5ca576e2001-06-18 22:08:13 +00002224 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002226
2227 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2228 /* For a continue inside a try block,
2229 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002230 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2231 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002232 why = WHY_NOT;
2233 JUMPTO(PyInt_AS_LONG(retval));
2234 Py_DECREF(retval);
2235 break;
2236 }
2237
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 while (STACK_LEVEL() > b->b_level) {
2239 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002240 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002241 }
2242 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2243 why = WHY_NOT;
2244 JUMPTO(b->b_handler);
2245 break;
2246 }
2247 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002248 (b->b_type == SETUP_EXCEPT &&
2249 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002250 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 PyObject *exc, *val, *tb;
2252 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 val = Py_None;
2255 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002257 /* Make the raw exception data
2258 available to the handler,
2259 so a program can emulate the
2260 Python main loop. Don't do
2261 this for 'finally'. */
2262 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002263 PyErr_NormalizeException(
2264 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002265 set_exc_info(tstate,
2266 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002267 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002268 if (tb == NULL) {
2269 Py_INCREF(Py_None);
2270 PUSH(Py_None);
2271 } else
2272 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002273 PUSH(val);
2274 PUSH(exc);
2275 }
2276 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002277 if (why == WHY_RETURN ||
2278 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002279 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002280 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002281 PUSH(v);
2282 }
2283 why = WHY_NOT;
2284 JUMPTO(b->b_handler);
2285 break;
2286 }
2287 } /* unwind stack */
2288
2289 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002290
Guido van Rossum374a9221991-04-04 10:40:29 +00002291 if (why != WHY_NOT)
2292 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002293
Guido van Rossum374a9221991-04-04 10:40:29 +00002294 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002295
Tim Peters5ca576e2001-06-18 22:08:13 +00002296 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002297 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002298
Fred Drake9e3ad782001-07-03 23:39:52 +00002299 if (tstate->use_tracing) {
2300 if (tstate->c_tracefunc
2301 && (why == WHY_RETURN || why == WHY_YIELD)) {
2302 if (call_trace(tstate->c_tracefunc,
2303 tstate->c_traceobj, f,
2304 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002305 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002306 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002307 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002308 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002309 }
Fred Drake8f51f542001-10-04 14:48:42 +00002310 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002311 if (why == WHY_EXCEPTION)
2312 call_trace_protected(tstate->c_profilefunc,
2313 tstate->c_profileobj, f,
2314 PyTrace_RETURN);
2315 else if (call_trace(tstate->c_profilefunc,
2316 tstate->c_profileobj, f,
2317 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002318 Py_XDECREF(retval);
2319 retval = NULL;
2320 why = WHY_EXCEPTION;
2321 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002322 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002323 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002324
Guido van Rossuma027efa1997-05-05 20:56:21 +00002325 reset_exc_info(tstate);
2326
Tim Peters5ca576e2001-06-18 22:08:13 +00002327 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002328 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002329 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002330
Guido van Rossum96a42c81992-01-12 02:29:51 +00002331 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002332}
2333
Tim Peters6d6c1a32001-08-02 04:15:00 +00002334PyObject *
2335PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002336 PyObject **args, int argcount, PyObject **kws, int kwcount,
2337 PyObject **defs, int defcount, PyObject *closure)
2338{
2339 register PyFrameObject *f;
2340 register PyObject *retval = NULL;
2341 register PyObject **fastlocals, **freevars;
2342 PyThreadState *tstate = PyThreadState_GET();
2343 PyObject *x, *u;
2344
2345 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002346 PyErr_SetString(PyExc_SystemError,
2347 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002348 return NULL;
2349 }
2350
2351 f = PyFrame_New(tstate, /*back*/
2352 co, /*code*/
2353 globals, locals);
2354 if (f == NULL)
2355 return NULL;
2356
2357 fastlocals = f->f_localsplus;
2358 freevars = f->f_localsplus + f->f_nlocals;
2359
2360 if (co->co_argcount > 0 ||
2361 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2362 int i;
2363 int n = argcount;
2364 PyObject *kwdict = NULL;
2365 if (co->co_flags & CO_VARKEYWORDS) {
2366 kwdict = PyDict_New();
2367 if (kwdict == NULL)
2368 goto fail;
2369 i = co->co_argcount;
2370 if (co->co_flags & CO_VARARGS)
2371 i++;
2372 SETLOCAL(i, kwdict);
2373 }
2374 if (argcount > co->co_argcount) {
2375 if (!(co->co_flags & CO_VARARGS)) {
2376 PyErr_Format(PyExc_TypeError,
2377 "%.200s() takes %s %d "
2378 "%sargument%s (%d given)",
2379 PyString_AsString(co->co_name),
2380 defcount ? "at most" : "exactly",
2381 co->co_argcount,
2382 kwcount ? "non-keyword " : "",
2383 co->co_argcount == 1 ? "" : "s",
2384 argcount);
2385 goto fail;
2386 }
2387 n = co->co_argcount;
2388 }
2389 for (i = 0; i < n; i++) {
2390 x = args[i];
2391 Py_INCREF(x);
2392 SETLOCAL(i, x);
2393 }
2394 if (co->co_flags & CO_VARARGS) {
2395 u = PyTuple_New(argcount - n);
2396 if (u == NULL)
2397 goto fail;
2398 SETLOCAL(co->co_argcount, u);
2399 for (i = n; i < argcount; i++) {
2400 x = args[i];
2401 Py_INCREF(x);
2402 PyTuple_SET_ITEM(u, i-n, x);
2403 }
2404 }
2405 for (i = 0; i < kwcount; i++) {
2406 PyObject *keyword = kws[2*i];
2407 PyObject *value = kws[2*i + 1];
2408 int j;
2409 if (keyword == NULL || !PyString_Check(keyword)) {
2410 PyErr_Format(PyExc_TypeError,
2411 "%.200s() keywords must be strings",
2412 PyString_AsString(co->co_name));
2413 goto fail;
2414 }
2415 /* XXX slow -- speed up using dictionary? */
2416 for (j = 0; j < co->co_argcount; j++) {
2417 PyObject *nm = PyTuple_GET_ITEM(
2418 co->co_varnames, j);
2419 int cmp = PyObject_RichCompareBool(
2420 keyword, nm, Py_EQ);
2421 if (cmp > 0)
2422 break;
2423 else if (cmp < 0)
2424 goto fail;
2425 }
2426 /* Check errors from Compare */
2427 if (PyErr_Occurred())
2428 goto fail;
2429 if (j >= co->co_argcount) {
2430 if (kwdict == NULL) {
2431 PyErr_Format(PyExc_TypeError,
2432 "%.200s() got an unexpected "
2433 "keyword argument '%.400s'",
2434 PyString_AsString(co->co_name),
2435 PyString_AsString(keyword));
2436 goto fail;
2437 }
2438 PyDict_SetItem(kwdict, keyword, value);
2439 }
2440 else {
2441 if (GETLOCAL(j) != NULL) {
2442 PyErr_Format(PyExc_TypeError,
2443 "%.200s() got multiple "
2444 "values for keyword "
2445 "argument '%.400s'",
2446 PyString_AsString(co->co_name),
2447 PyString_AsString(keyword));
2448 goto fail;
2449 }
2450 Py_INCREF(value);
2451 SETLOCAL(j, value);
2452 }
2453 }
2454 if (argcount < co->co_argcount) {
2455 int m = co->co_argcount - defcount;
2456 for (i = argcount; i < m; i++) {
2457 if (GETLOCAL(i) == NULL) {
2458 PyErr_Format(PyExc_TypeError,
2459 "%.200s() takes %s %d "
2460 "%sargument%s (%d given)",
2461 PyString_AsString(co->co_name),
2462 ((co->co_flags & CO_VARARGS) ||
2463 defcount) ? "at least"
2464 : "exactly",
2465 m, kwcount ? "non-keyword " : "",
2466 m == 1 ? "" : "s", i);
2467 goto fail;
2468 }
2469 }
2470 if (n > m)
2471 i = n - m;
2472 else
2473 i = 0;
2474 for (; i < defcount; i++) {
2475 if (GETLOCAL(m+i) == NULL) {
2476 PyObject *def = defs[i];
2477 Py_INCREF(def);
2478 SETLOCAL(m+i, def);
2479 }
2480 }
2481 }
2482 }
2483 else {
2484 if (argcount > 0 || kwcount > 0) {
2485 PyErr_Format(PyExc_TypeError,
2486 "%.200s() takes no arguments (%d given)",
2487 PyString_AsString(co->co_name),
2488 argcount + kwcount);
2489 goto fail;
2490 }
2491 }
2492 /* Allocate and initialize storage for cell vars, and copy free
2493 vars into frame. This isn't too efficient right now. */
2494 if (f->f_ncells) {
2495 int i = 0, j = 0, nargs, found;
2496 char *cellname, *argname;
2497 PyObject *c;
2498
2499 nargs = co->co_argcount;
2500 if (co->co_flags & CO_VARARGS)
2501 nargs++;
2502 if (co->co_flags & CO_VARKEYWORDS)
2503 nargs++;
2504
2505 /* Check for cells that shadow args */
2506 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2507 cellname = PyString_AS_STRING(
2508 PyTuple_GET_ITEM(co->co_cellvars, i));
2509 found = 0;
2510 while (j < nargs) {
2511 argname = PyString_AS_STRING(
2512 PyTuple_GET_ITEM(co->co_varnames, j));
2513 if (strcmp(cellname, argname) == 0) {
2514 c = PyCell_New(GETLOCAL(j));
2515 if (c == NULL)
2516 goto fail;
2517 GETLOCAL(f->f_nlocals + i) = c;
2518 found = 1;
2519 break;
2520 }
2521 j++;
2522 }
2523 if (found == 0) {
2524 c = PyCell_New(NULL);
2525 if (c == NULL)
2526 goto fail;
2527 SETLOCAL(f->f_nlocals + i, c);
2528 }
2529 }
2530 /* Initialize any that are left */
2531 while (i < f->f_ncells) {
2532 c = PyCell_New(NULL);
2533 if (c == NULL)
2534 goto fail;
2535 SETLOCAL(f->f_nlocals + i, c);
2536 i++;
2537 }
2538 }
2539 if (f->f_nfreevars) {
2540 int i;
2541 for (i = 0; i < f->f_nfreevars; ++i) {
2542 PyObject *o = PyTuple_GET_ITEM(closure, i);
2543 Py_INCREF(o);
2544 freevars[f->f_ncells + i] = o;
2545 }
2546 }
2547
Tim Peters5ca576e2001-06-18 22:08:13 +00002548 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002549 /* Don't need to keep the reference to f_back, it will be set
2550 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002551 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002552 f->f_back = NULL;
2553
2554 /* Create a new generator that owns the ready to run frame
2555 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002556 return gen_new(f);
2557 }
2558
2559 retval = eval_frame(f);
2560
2561 fail: /* Jump here from prelude on failure */
2562
Tim Petersb13680b2001-11-27 23:29:29 +00002563 /* decref'ing the frame can cause __del__ methods to get invoked,
2564 which can call back into Python. While we're done with the
2565 current Python frame (f), the associated C stack is still in use,
2566 so recursion_depth must be boosted for the duration.
2567 */
2568 assert(tstate != NULL);
2569 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002570 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002571 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002572 return retval;
2573}
2574
2575
Guido van Rossuma027efa1997-05-05 20:56:21 +00002576static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002577set_exc_info(PyThreadState *tstate,
2578 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002579{
2580 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002581 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002582
Guido van Rossuma027efa1997-05-05 20:56:21 +00002583 frame = tstate->frame;
2584 if (frame->f_exc_type == NULL) {
2585 /* This frame didn't catch an exception before */
2586 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002587 if (tstate->exc_type == NULL) {
2588 Py_INCREF(Py_None);
2589 tstate->exc_type = Py_None;
2590 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002591 tmp_type = frame->f_exc_type;
2592 tmp_value = frame->f_exc_value;
2593 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594 Py_XINCREF(tstate->exc_type);
2595 Py_XINCREF(tstate->exc_value);
2596 Py_XINCREF(tstate->exc_traceback);
2597 frame->f_exc_type = tstate->exc_type;
2598 frame->f_exc_value = tstate->exc_value;
2599 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002600 Py_XDECREF(tmp_type);
2601 Py_XDECREF(tmp_value);
2602 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002603 }
2604 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002605 tmp_type = tstate->exc_type;
2606 tmp_value = tstate->exc_value;
2607 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002608 Py_XINCREF(type);
2609 Py_XINCREF(value);
2610 Py_XINCREF(tb);
2611 tstate->exc_type = type;
2612 tstate->exc_value = value;
2613 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002614 Py_XDECREF(tmp_type);
2615 Py_XDECREF(tmp_value);
2616 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 /* For b/w compatibility */
2618 PySys_SetObject("exc_type", type);
2619 PySys_SetObject("exc_value", value);
2620 PySys_SetObject("exc_traceback", tb);
2621}
2622
2623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002624reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002625{
2626 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002627 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002628 frame = tstate->frame;
2629 if (frame->f_exc_type != NULL) {
2630 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 tmp_type = tstate->exc_type;
2632 tmp_value = tstate->exc_value;
2633 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 Py_XINCREF(frame->f_exc_type);
2635 Py_XINCREF(frame->f_exc_value);
2636 Py_XINCREF(frame->f_exc_traceback);
2637 tstate->exc_type = frame->f_exc_type;
2638 tstate->exc_value = frame->f_exc_value;
2639 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002640 Py_XDECREF(tmp_type);
2641 Py_XDECREF(tmp_value);
2642 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002643 /* For b/w compatibility */
2644 PySys_SetObject("exc_type", frame->f_exc_type);
2645 PySys_SetObject("exc_value", frame->f_exc_value);
2646 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2647 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002648 tmp_type = frame->f_exc_type;
2649 tmp_value = frame->f_exc_value;
2650 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002651 frame->f_exc_type = NULL;
2652 frame->f_exc_value = NULL;
2653 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002654 Py_XDECREF(tmp_type);
2655 Py_XDECREF(tmp_value);
2656 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002657}
2658
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002659/* Logic for the raise statement (too complicated for inlining).
2660 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002661static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002662do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002663{
Guido van Rossumd295f121998-04-09 21:39:57 +00002664 if (type == NULL) {
2665 /* Reraise */
2666 PyThreadState *tstate = PyThreadState_Get();
2667 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2668 value = tstate->exc_value;
2669 tb = tstate->exc_traceback;
2670 Py_XINCREF(type);
2671 Py_XINCREF(value);
2672 Py_XINCREF(tb);
2673 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002674
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002675 /* We support the following forms of raise:
2676 raise <class>, <classinstance>
2677 raise <class>, <argument tuple>
2678 raise <class>, None
2679 raise <class>, <argument>
2680 raise <classinstance>, None
2681 raise <string>, <object>
2682 raise <string>, None
2683
2684 An omitted second argument is the same as None.
2685
2686 In addition, raise <tuple>, <anything> is the same as
2687 raising the tuple's first item (and it better have one!);
2688 this rule is applied recursively.
2689
2690 Finally, an optional third argument can be supplied, which
2691 gives the traceback to be substituted (useful when
2692 re-raising an exception after examining it). */
2693
2694 /* First, check the traceback argument, replacing None with
2695 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 if (tb == Py_None) {
2697 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002698 tb = NULL;
2699 }
2700 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002702 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002703 goto raise_error;
2704 }
2705
2706 /* Next, replace a missing value with None */
2707 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 value = Py_None;
2709 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002710 }
2711
2712 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002713 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2714 PyObject *tmp = type;
2715 type = PyTuple_GET_ITEM(type, 0);
2716 Py_INCREF(type);
2717 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002718 }
2719
Barry Warsaw4249f541997-08-22 21:26:19 +00002720 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002721 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002722
2723 else if (PyClass_Check(type))
2724 PyErr_NormalizeException(&type, &value, &tb);
2725
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002727 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 if (value != Py_None) {
2729 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002730 "instance exception may not have a separate value");
2731 goto raise_error;
2732 }
2733 else {
2734 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2738 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002739 }
2740 }
2741 else {
2742 /* Not something you can raise. You get an exception
2743 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002744 PyErr_Format(PyExc_TypeError,
2745 "exceptions must be strings, classes, or "
2746 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002747 goto raise_error;
2748 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002750 if (tb == NULL)
2751 return WHY_EXCEPTION;
2752 else
2753 return WHY_RERAISE;
2754 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 Py_XDECREF(value);
2756 Py_XDECREF(type);
2757 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002758 return WHY_EXCEPTION;
2759}
2760
Tim Petersd6d010b2001-06-21 02:49:55 +00002761/* Iterate v argcnt times and store the results on the stack (via decreasing
2762 sp). Return 1 for success, 0 if error. */
2763
Barry Warsawe42b18f1997-08-25 22:13:04 +00002764static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002765unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002766{
Tim Petersd6d010b2001-06-21 02:49:55 +00002767 int i = 0;
2768 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002769 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002770
Tim Petersd6d010b2001-06-21 02:49:55 +00002771 assert(v != NULL);
2772
2773 it = PyObject_GetIter(v);
2774 if (it == NULL)
2775 goto Error;
2776
2777 for (; i < argcnt; i++) {
2778 w = PyIter_Next(it);
2779 if (w == NULL) {
2780 /* Iterator done, via error or exhaustion. */
2781 if (!PyErr_Occurred()) {
2782 PyErr_Format(PyExc_ValueError,
2783 "need more than %d value%s to unpack",
2784 i, i == 1 ? "" : "s");
2785 }
2786 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002787 }
2788 *--sp = w;
2789 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002790
2791 /* We better have exhausted the iterator now. */
2792 w = PyIter_Next(it);
2793 if (w == NULL) {
2794 if (PyErr_Occurred())
2795 goto Error;
2796 Py_DECREF(it);
2797 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002798 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002799 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002800 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002801 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002802Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002803 for (; i > 0; i--, sp++)
2804 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002805 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002806 return 0;
2807}
2808
2809
Guido van Rossum96a42c81992-01-12 02:29:51 +00002810#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002812prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 if (PyObject_Print(v, stdout, 0) != 0)
2816 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002817 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002818 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002820#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822static void
Fred Drake5755ce62001-06-27 19:19:46 +00002823call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002824{
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002826 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002828 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 value = Py_None;
2830 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002831 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002833 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002834 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002835 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002836 }
Fred Drake5755ce62001-06-27 19:19:46 +00002837 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002839 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002841 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 Py_XDECREF(type);
2843 Py_XDECREF(value);
2844 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002845 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002846}
2847
Fred Drake4ec5d562001-10-04 19:26:43 +00002848static void
2849call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2850 int what)
2851{
2852 PyObject *type, *value, *traceback;
2853 int err;
2854 PyErr_Fetch(&type, &value, &traceback);
2855 err = call_trace(func, obj, frame, what, NULL);
2856 if (err == 0)
2857 PyErr_Restore(type, value, traceback);
2858 else {
2859 Py_XDECREF(type);
2860 Py_XDECREF(value);
2861 Py_XDECREF(traceback);
2862 }
2863}
2864
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002865static int
Fred Drake5755ce62001-06-27 19:19:46 +00002866call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2867 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002868{
Fred Drake5755ce62001-06-27 19:19:46 +00002869 register PyThreadState *tstate = frame->f_tstate;
2870 int result;
2871 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002872 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002873 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002874 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002875 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002876 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2877 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002878 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002879 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002880}
2881
Fred Drake5755ce62001-06-27 19:19:46 +00002882void
2883PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002884{
Fred Drake5755ce62001-06-27 19:19:46 +00002885 PyThreadState *tstate = PyThreadState_Get();
2886 PyObject *temp = tstate->c_profileobj;
2887 Py_XINCREF(arg);
2888 tstate->c_profilefunc = NULL;
2889 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002890 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002891 Py_XDECREF(temp);
2892 tstate->c_profilefunc = func;
2893 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002894 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002895}
2896
2897void
2898PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2899{
2900 PyThreadState *tstate = PyThreadState_Get();
2901 PyObject *temp = tstate->c_traceobj;
2902 Py_XINCREF(arg);
2903 tstate->c_tracefunc = NULL;
2904 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002905 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002906 Py_XDECREF(temp);
2907 tstate->c_tracefunc = func;
2908 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002909 tstate->use_tracing = ((func != NULL)
2910 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002911}
2912
Guido van Rossumb209a111997-04-29 18:18:01 +00002913PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002914PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002915{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002916 PyThreadState *tstate = PyThreadState_Get();
2917 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002918 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002919 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002920 else
2921 return current_frame->f_builtins;
2922}
2923
Guido van Rossumb209a111997-04-29 18:18:01 +00002924PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002926{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002927 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002928 if (current_frame == NULL)
2929 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002930 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002931 return current_frame->f_locals;
2932}
2933
Guido van Rossumb209a111997-04-29 18:18:01 +00002934PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002936{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002937 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002938 if (current_frame == NULL)
2939 return NULL;
2940 else
2941 return current_frame->f_globals;
2942}
2943
Guido van Rossumb209a111997-04-29 18:18:01 +00002944PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002945PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002946{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002947 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002948 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002949}
2950
Guido van Rossum6135a871995-01-09 17:53:26 +00002951int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002952PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002953{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002954 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002955 return current_frame == NULL ? 0 : current_frame->f_restricted;
2956}
2957
Guido van Rossumbe270261997-05-22 22:26:18 +00002958int
Tim Peters5ba58662001-07-16 02:29:45 +00002959PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002960{
2961 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002962 int result = 0;
2963
2964 if (current_frame != NULL) {
2965 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002966 const int compilerflags = codeflags & PyCF_MASK;
2967 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002968 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002969 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002970 }
2971 }
2972 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002973}
2974
2975int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002976Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977{
Guido van Rossumb209a111997-04-29 18:18:01 +00002978 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002979 if (f == NULL)
2980 return 0;
2981 if (!PyFile_SoftSpace(f, 0))
2982 return 0;
2983 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984}
2985
Guido van Rossum3f5da241990-12-20 15:06:42 +00002986
Guido van Rossum681d79a1995-07-18 14:51:37 +00002987/* External interface to call any callable object.
2988 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002989
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002990#undef PyEval_CallObject
2991/* for backward compatibility: export this interface */
2992
Guido van Rossumb209a111997-04-29 18:18:01 +00002993PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002994PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002995{
Guido van Rossumb209a111997-04-29 18:18:01 +00002996 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002997}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002998#define PyEval_CallObject(func,arg) \
2999 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003000
Guido van Rossumb209a111997-04-29 18:18:01 +00003001PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003002PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003{
Jeremy Hylton52820442001-01-03 23:52:36 +00003004 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003005
3006 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003007 arg = PyTuple_New(0);
3008 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003009 PyErr_SetString(PyExc_TypeError,
3010 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003011 return NULL;
3012 }
3013 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003014 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003015
Guido van Rossumb209a111997-04-29 18:18:01 +00003016 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003017 PyErr_SetString(PyExc_TypeError,
3018 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003019 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003020 return NULL;
3021 }
3022
Tim Peters6d6c1a32001-08-02 04:15:00 +00003023 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003024 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003025 return result;
3026}
3027
Tim Peters6d6c1a32001-08-02 04:15:00 +00003028char *
3029PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003030{
3031 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003032 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003033 else if (PyFunction_Check(func))
3034 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3035 else if (PyCFunction_Check(func))
3036 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3037 else if (PyClass_Check(func))
3038 return PyString_AsString(((PyClassObject*)func)->cl_name);
3039 else if (PyInstance_Check(func)) {
3040 return PyString_AsString(
3041 ((PyInstanceObject*)func)->in_class->cl_name);
3042 } else {
3043 return func->ob_type->tp_name;
3044 }
3045}
3046
Tim Peters6d6c1a32001-08-02 04:15:00 +00003047char *
3048PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003049{
3050 if (PyMethod_Check(func))
3051 return "()";
3052 else if (PyFunction_Check(func))
3053 return "()";
3054 else if (PyCFunction_Check(func))
3055 return "()";
3056 else if (PyClass_Check(func))
3057 return " constructor";
3058 else if (PyInstance_Check(func)) {
3059 return " instance";
3060 } else {
3061 return " object";
3062 }
3063}
3064
Jeremy Hylton52820442001-01-03 23:52:36 +00003065#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3066
3067/* The two fast_xxx() functions optimize calls for which no argument
3068 tuple is necessary; the objects are passed directly from the stack.
3069 fast_cfunction() is called for METH_OLDARGS functions.
3070 fast_function() is for functions with no special argument handling.
3071*/
3072
3073static PyObject *
3074fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3075{
3076 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3077 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003078 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003079
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003080 switch (flags) {
3081 case METH_OLDARGS:
3082 if (na == 0)
3083 return (*meth)(self, NULL);
3084 else if (na == 1) {
3085 PyObject *arg = EXT_POP(*pp_stack);
3086 PyObject *result = (*meth)(self, arg);
3087 Py_DECREF(arg);
3088 return result;
3089 } else {
3090 PyObject *args = load_args(pp_stack, na);
3091 PyObject *result = (*meth)(self, args);
3092 Py_DECREF(args);
3093 return result;
3094 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003095 case METH_NOARGS:
3096 if (na == 0)
3097 return (*meth)(self, NULL);
3098 PyErr_Format(PyExc_TypeError,
3099 "%.200s() takes no arguments (%d given)",
3100 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3101 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003102 case METH_O:
3103 if (na == 1) {
3104 PyObject *arg = EXT_POP(*pp_stack);
3105 PyObject *result = (*meth)(self, arg);
3106 Py_DECREF(arg);
3107 return result;
3108 }
3109 PyErr_Format(PyExc_TypeError,
3110 "%.200s() takes exactly one argument (%d given)",
3111 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3112 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003113 default:
3114 fprintf(stderr, "%.200s() flags = %d\n",
3115 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3116 PyErr_BadInternalCall();
3117 return NULL;
3118 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003119}
3120
3121static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003122fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003123{
3124 PyObject *co = PyFunction_GET_CODE(func);
3125 PyObject *globals = PyFunction_GET_GLOBALS(func);
3126 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003127 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003128 PyObject **d = NULL;
3129 int nd = 0;
3130
3131 if (argdefs != NULL) {
3132 d = &PyTuple_GET_ITEM(argdefs, 0);
3133 nd = ((PyTupleObject *)argdefs)->ob_size;
3134 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003135 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003136 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003137 (*pp_stack)-2*nk, nk, d, nd,
3138 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003139}
3140
3141static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003142update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3143 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003144{
3145 PyObject *kwdict = NULL;
3146 if (orig_kwdict == NULL)
3147 kwdict = PyDict_New();
3148 else {
3149 kwdict = PyDict_Copy(orig_kwdict);
3150 Py_DECREF(orig_kwdict);
3151 }
3152 if (kwdict == NULL)
3153 return NULL;
3154 while (--nk >= 0) {
3155 int err;
3156 PyObject *value = EXT_POP(*pp_stack);
3157 PyObject *key = EXT_POP(*pp_stack);
3158 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003159 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003160 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003161 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003162 PyEval_GetFuncName(func),
3163 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003164 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003165 Py_DECREF(key);
3166 Py_DECREF(value);
3167 Py_DECREF(kwdict);
3168 return NULL;
3169 }
3170 err = PyDict_SetItem(kwdict, key, value);
3171 Py_DECREF(key);
3172 Py_DECREF(value);
3173 if (err) {
3174 Py_DECREF(kwdict);
3175 return NULL;
3176 }
3177 }
3178 return kwdict;
3179}
3180
3181static PyObject *
3182update_star_args(int nstack, int nstar, PyObject *stararg,
3183 PyObject ***pp_stack)
3184{
3185 PyObject *callargs, *w;
3186
3187 callargs = PyTuple_New(nstack + nstar);
3188 if (callargs == NULL) {
3189 return NULL;
3190 }
3191 if (nstar) {
3192 int i;
3193 for (i = 0; i < nstar; i++) {
3194 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3195 Py_INCREF(a);
3196 PyTuple_SET_ITEM(callargs, nstack + i, a);
3197 }
3198 }
3199 while (--nstack >= 0) {
3200 w = EXT_POP(*pp_stack);
3201 PyTuple_SET_ITEM(callargs, nstack, w);
3202 }
3203 return callargs;
3204}
3205
3206static PyObject *
3207load_args(PyObject ***pp_stack, int na)
3208{
3209 PyObject *args = PyTuple_New(na);
3210 PyObject *w;
3211
3212 if (args == NULL)
3213 return NULL;
3214 while (--na >= 0) {
3215 w = EXT_POP(*pp_stack);
3216 PyTuple_SET_ITEM(args, na, w);
3217 }
3218 return args;
3219}
3220
3221static PyObject *
3222do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3223{
3224 PyObject *callargs = NULL;
3225 PyObject *kwdict = NULL;
3226 PyObject *result = NULL;
3227
3228 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003229 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003230 if (kwdict == NULL)
3231 goto call_fail;
3232 }
3233 callargs = load_args(pp_stack, na);
3234 if (callargs == NULL)
3235 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003236 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003237 call_fail:
3238 Py_XDECREF(callargs);
3239 Py_XDECREF(kwdict);
3240 return result;
3241}
3242
3243static PyObject *
3244ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3245{
3246 int nstar = 0;
3247 PyObject *callargs = NULL;
3248 PyObject *stararg = NULL;
3249 PyObject *kwdict = NULL;
3250 PyObject *result = NULL;
3251
3252 if (flags & CALL_FLAG_KW) {
3253 kwdict = EXT_POP(*pp_stack);
3254 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003255 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003256 "%s%s argument after ** "
3257 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003258 PyEval_GetFuncName(func),
3259 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003260 goto ext_call_fail;
3261 }
3262 }
3263 if (flags & CALL_FLAG_VAR) {
3264 stararg = EXT_POP(*pp_stack);
3265 if (!PyTuple_Check(stararg)) {
3266 PyObject *t = NULL;
3267 t = PySequence_Tuple(stararg);
3268 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003269 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3270 PyErr_Format(PyExc_TypeError,
3271 "%s%s argument after * "
3272 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003273 PyEval_GetFuncName(func),
3274 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003275 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003276 goto ext_call_fail;
3277 }
3278 Py_DECREF(stararg);
3279 stararg = t;
3280 }
3281 nstar = PyTuple_GET_SIZE(stararg);
3282 }
3283 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003284 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003285 if (kwdict == NULL)
3286 goto ext_call_fail;
3287 }
3288 callargs = update_star_args(na, nstar, stararg, pp_stack);
3289 if (callargs == NULL)
3290 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003291 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003292 ext_call_fail:
3293 Py_XDECREF(callargs);
3294 Py_XDECREF(kwdict);
3295 Py_XDECREF(stararg);
3296 return result;
3297}
3298
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003299#define SLICE_ERROR_MSG \
3300 "standard sequence type does not support step size other than one"
3301
Guido van Rossumb209a111997-04-29 18:18:01 +00003302static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003303loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304{
Guido van Rossumb209a111997-04-29 18:18:01 +00003305 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003306 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003307 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003308 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309 return NULL;
3310 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003311 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003312 v = (*sq->sq_item)(v, i);
3313 if (v)
3314 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003315 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003316 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003317 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318}
3319
Guido van Rossum20c6add2000-05-08 14:06:50 +00003320/* Extract a slice index from a PyInt or PyLong, the index is bound to
3321 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3322 and error. Returns 1 on success.*/
3323
3324int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003325_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326{
3327 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003328 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003329 if (PyInt_Check(v)) {
3330 x = PyInt_AsLong(v);
3331 } else if (PyLong_Check(v)) {
3332 x = PyLong_AsLong(v);
3333 if (x==-1 && PyErr_Occurred()) {
3334 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003335 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003336
Guido van Rossumac7be682001-01-17 15:42:30 +00003337 if (!PyErr_ExceptionMatches(
3338 PyExc_OverflowError)) {
3339 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003340 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003341 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003342 }
3343
Guido van Rossumac7be682001-01-17 15:42:30 +00003344 /* Clear the OverflowError */
3345 PyErr_Clear();
3346
3347 /* It's an overflow error, so we need to
3348 check the sign of the long integer,
3349 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003350 the error. */
3351
3352 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003353 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003354 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003355
3356 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003357 cmp = PyObject_RichCompareBool(v, long_zero,
3358 Py_GT);
3359 Py_DECREF(long_zero);
3360 if (cmp < 0)
3361 return 0;
3362 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003363 x = INT_MAX;
3364 else
3365 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003366 }
3367 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003368 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003369 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003370 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003372 /* Truncate -- very long indices are truncated anyway */
3373 if (x > INT_MAX)
3374 x = INT_MAX;
3375 else if (x < -INT_MAX)
3376 x = 0;
3377 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003379 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380}
3381
Guido van Rossum50d756e2001-08-18 17:43:36 +00003382#undef ISINT
3383#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3384
Guido van Rossumb209a111997-04-29 18:18:01 +00003385static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003386apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003388 PyTypeObject *tp = u->ob_type;
3389 PySequenceMethods *sq = tp->tp_as_sequence;
3390
3391 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3392 int ilow = 0, ihigh = INT_MAX;
3393 if (!_PyEval_SliceIndex(v, &ilow))
3394 return NULL;
3395 if (!_PyEval_SliceIndex(w, &ihigh))
3396 return NULL;
3397 return PySequence_GetSlice(u, ilow, ihigh);
3398 }
3399 else {
3400 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003401 if (slice != NULL) {
3402 PyObject *res = PyObject_GetItem(u, slice);
3403 Py_DECREF(slice);
3404 return res;
3405 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003406 else
3407 return NULL;
3408 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003410
3411static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003412assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3413 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003415 PyTypeObject *tp = u->ob_type;
3416 PySequenceMethods *sq = tp->tp_as_sequence;
3417
3418 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3419 int ilow = 0, ihigh = INT_MAX;
3420 if (!_PyEval_SliceIndex(v, &ilow))
3421 return -1;
3422 if (!_PyEval_SliceIndex(w, &ihigh))
3423 return -1;
3424 if (x == NULL)
3425 return PySequence_DelSlice(u, ilow, ihigh);
3426 else
3427 return PySequence_SetSlice(u, ilow, ihigh, x);
3428 }
3429 else {
3430 PyObject *slice = PySlice_New(v, w, NULL);
3431 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003432 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003433 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003434 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003435 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003436 res = PyObject_DelItem(u, slice);
3437 Py_DECREF(slice);
3438 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003439 }
3440 else
3441 return -1;
3442 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443}
3444
Guido van Rossumb209a111997-04-29 18:18:01 +00003445static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003446cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447{
Guido van Rossumac7be682001-01-17 15:42:30 +00003448 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003450 case IS:
3451 case IS_NOT:
3452 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003453 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003454 res = !res;
3455 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 case IN:
3457 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003458 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003459 if (res < 0)
3460 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003461 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003462 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 break;
3464 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003465 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003466 break;
3467 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003468 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003469 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003470 v = res ? Py_True : Py_False;
3471 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 return v;
3473}
3474
Thomas Wouters52152252000-08-17 22:55:00 +00003475static PyObject *
3476import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003477{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003478 PyObject *x;
3479
3480 x = PyObject_GetAttr(v, name);
3481 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003482 PyErr_Format(PyExc_ImportError,
3483 "cannot import name %.230s",
3484 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003485 }
Thomas Wouters52152252000-08-17 22:55:00 +00003486 return x;
3487}
Guido van Rossumac7be682001-01-17 15:42:30 +00003488
Thomas Wouters52152252000-08-17 22:55:00 +00003489static int
3490import_all_from(PyObject *locals, PyObject *v)
3491{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003492 PyObject *all = PyObject_GetAttrString(v, "__all__");
3493 PyObject *dict, *name, *value;
3494 int skip_leading_underscores = 0;
3495 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003496
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003497 if (all == NULL) {
3498 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3499 return -1; /* Unexpected error */
3500 PyErr_Clear();
3501 dict = PyObject_GetAttrString(v, "__dict__");
3502 if (dict == NULL) {
3503 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3504 return -1;
3505 PyErr_SetString(PyExc_ImportError,
3506 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003507 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003508 }
3509 all = PyMapping_Keys(dict);
3510 Py_DECREF(dict);
3511 if (all == NULL)
3512 return -1;
3513 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003514 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003515
3516 for (pos = 0, err = 0; ; pos++) {
3517 name = PySequence_GetItem(all, pos);
3518 if (name == NULL) {
3519 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3520 err = -1;
3521 else
3522 PyErr_Clear();
3523 break;
3524 }
3525 if (skip_leading_underscores &&
3526 PyString_Check(name) &&
3527 PyString_AS_STRING(name)[0] == '_')
3528 {
3529 Py_DECREF(name);
3530 continue;
3531 }
3532 value = PyObject_GetAttr(v, name);
3533 if (value == NULL)
3534 err = -1;
3535 else
3536 err = PyDict_SetItem(locals, name, value);
3537 Py_DECREF(name);
3538 Py_XDECREF(value);
3539 if (err != 0)
3540 break;
3541 }
3542 Py_DECREF(all);
3543 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003544}
3545
Guido van Rossumb209a111997-04-29 18:18:01 +00003546static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003547build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003548{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003549 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003550
3551 if (PyDict_Check(methods))
3552 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003553 if (metaclass != NULL)
3554 Py_INCREF(methods);
3555 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3556 base = PyTuple_GET_ITEM(bases, 0);
3557 metaclass = PyObject_GetAttrString(base, "__class__");
3558 if (metaclass == NULL) {
3559 PyErr_Clear();
3560 metaclass = (PyObject *)base->ob_type;
3561 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003562 }
3563 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003564 else {
3565 PyObject *g = PyEval_GetGlobals();
3566 if (g != NULL && PyDict_Check(g))
3567 metaclass = PyDict_GetItemString(g, "__metaclass__");
3568 if (metaclass == NULL)
3569 metaclass = (PyObject *) &PyClass_Type;
3570 Py_INCREF(metaclass);
3571 }
3572 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3573 Py_DECREF(metaclass);
3574 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003575}
3576
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003577static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003578exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3579 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003580{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003581 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003582 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003583 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003584
Guido van Rossumb209a111997-04-29 18:18:01 +00003585 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3586 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003587 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003588 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003589 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003590 locals = PyTuple_GetItem(prog, 2);
3591 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003592 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003593 if (globals == Py_None) {
3594 globals = PyEval_GetGlobals();
3595 if (locals == Py_None) {
3596 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003597 plain = 1;
3598 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003599 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003600 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003601 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003602 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003603 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003604 !PyCode_Check(prog) &&
3605 !PyFile_Check(prog)) {
3606 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003607 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003608 return -1;
3609 }
Fred Drake661ea262000-10-24 19:57:45 +00003610 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003611 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003612 "exec: arg 2 must be a dictionary or None");
3613 return -1;
3614 }
3615 if (!PyDict_Check(locals)) {
3616 PyErr_SetString(PyExc_TypeError,
3617 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003618 return -1;
3619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003620 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003621 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003622 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003623 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003624 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003625 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003626 FILE *fp = PyFile_AsFile(prog);
3627 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003628 PyCompilerFlags cf;
3629 cf.cf_flags = 0;
3630 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003631 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3632 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003633 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003634 v = PyRun_File(fp, name, Py_file_input, globals,
3635 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003636 }
3637 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003638 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003639 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003640 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003641 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003642 cf.cf_flags = 0;
3643 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003644 v = PyRun_StringFlags(str, Py_file_input, globals,
3645 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003646 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003647 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003648 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003649 if (plain)
3650 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003651 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003652 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003653 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003654 return 0;
3655}
Guido van Rossum24c13741995-02-14 09:42:43 +00003656
Guido van Rossumac7be682001-01-17 15:42:30 +00003657static void
Paul Prescode68140d2000-08-30 20:25:01 +00003658format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3659{
3660 char *obj_str;
3661
3662 if (!obj)
3663 return;
3664
3665 obj_str = PyString_AsString(obj);
3666 if (!obj_str)
3667 return;
3668
3669 PyErr_Format(exc, format_str, obj_str);
3670}
Guido van Rossum950361c1997-01-24 13:49:28 +00003671
3672#ifdef DYNAMIC_EXECUTION_PROFILE
3673
Skip Montanarof118cb12001-10-15 20:51:38 +00003674static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003675getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003676{
3677 int i;
3678 PyObject *l = PyList_New(256);
3679 if (l == NULL) return NULL;
3680 for (i = 0; i < 256; i++) {
3681 PyObject *x = PyInt_FromLong(a[i]);
3682 if (x == NULL) {
3683 Py_DECREF(l);
3684 return NULL;
3685 }
3686 PyList_SetItem(l, i, x);
3687 }
3688 for (i = 0; i < 256; i++)
3689 a[i] = 0;
3690 return l;
3691}
3692
3693PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003694_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003695{
3696#ifndef DXPAIRS
3697 return getarray(dxp);
3698#else
3699 int i;
3700 PyObject *l = PyList_New(257);
3701 if (l == NULL) return NULL;
3702 for (i = 0; i < 257; i++) {
3703 PyObject *x = getarray(dxpairs[i]);
3704 if (x == NULL) {
3705 Py_DECREF(l);
3706 return NULL;
3707 }
3708 PyList_SetItem(l, i, x);
3709 }
3710 return l;
3711#endif
3712}
3713
3714#endif