blob: 7e98a250405a9452b393ce8f0906bb3c81c2ef59 [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:
Fred Drake5755ce62001-06-27 19:19:46 +00005 XXX how to pass arguments to profile and trace functions?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000016#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017
Jack Jansencbf630f2000-07-11 21:59:16 +000018#ifdef macintosh
19#include "macglue.h"
20#endif
21
Guido van Rossumc6004111993-11-05 10:22:19 +000022#include <ctype.h>
23
Guido van Rossum04691fc1992-08-12 15:35:34 +000024/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000025/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000026
Guido van Rossum408027e1996-12-30 16:17:54 +000027#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000028/* For debugging the interpreter: */
29#define LLTRACE 1 /* Low-level trace feature */
30#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#endif
32
Jeremy Hylton52820442001-01-03 23:52:36 +000033typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000034
Guido van Rossum374a9221991-04-04 10:40:29 +000035/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000036static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000037static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
38static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
39static PyObject *do_call(PyObject *, PyObject ***, int, int);
40static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000041static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000042static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000043static PyObject *load_args(PyObject ***, int);
44#define CALL_FLAG_VAR 1
45#define CALL_FLAG_KW 2
46
Guido van Rossum0a066c01992-03-27 17:29:15 +000047#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000048static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000049#endif
Fred Drake5755ce62001-06-27 19:19:46 +000050static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
51 int, PyObject *);
52static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000053static PyObject *loop_subscript(PyObject *, PyObject *);
54static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
55static int assign_slice(PyObject *, PyObject *,
56 PyObject *, PyObject *);
57static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000058static PyObject *import_from(PyObject *, PyObject *);
59static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000060static PyObject *build_class(PyObject *, PyObject *, PyObject *);
61static int exec_statement(PyFrameObject *,
62 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
64static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000065static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Paul Prescode68140d2000-08-30 20:25:01 +000067#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000068 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000069#define GLOBAL_NAME_ERROR_MSG \
70 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000071#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000072 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000073#define UNBOUNDFREE_ERROR_MSG \
74 "free variable '%.200s' referenced before assignment" \
75 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000076
Guido van Rossum950361c1997-01-24 13:49:28 +000077/* Dynamic execution profile */
78#ifdef DYNAMIC_EXECUTION_PROFILE
79#ifdef DXPAIRS
80static long dxpairs[257][256];
81#define dxp dxpairs[256]
82#else
83static long dxp[256];
84#endif
85#endif
86
Tim Peters5ca576e2001-06-18 22:08:13 +000087staticforward PyTypeObject gentype;
88
89typedef struct {
90 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000091 /* The gi_ prefix is intended to remind of generator-iterator. */
92
93 PyFrameObject *gi_frame;
94
Tim Peterse77f2e22001-06-26 22:24:51 +000095 /* True if generator is being executed. */
96 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000097} genobject;
98
99static PyObject *
100gen_new(PyFrameObject *f)
101{
102 genobject *gen = PyObject_New(genobject, &gentype);
103 if (gen == NULL) {
104 Py_DECREF(f);
105 return NULL;
106 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000107 gen->gi_frame = f;
108 gen->gi_running = 0;
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000109 PyObject_GC_Init(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000110 return (PyObject *)gen;
111}
112
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000113static int
114gen_traverse(genobject *gen, visitproc visit, void *arg)
115{
116 return visit((PyObject *)gen->gi_frame, arg);
117}
118
Tim Peters5ca576e2001-06-18 22:08:13 +0000119static void
120gen_dealloc(genobject *gen)
121{
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000122 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000123 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000124 PyObject_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000125}
126
127static PyObject *
128gen_iternext(genobject *gen)
129{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000130 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000131 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000132 PyObject *result;
133
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000134 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000135 PyErr_SetString(PyExc_ValueError,
136 "generator already executing");
137 return NULL;
138 }
Tim Peters8c963692001-06-23 05:26:56 +0000139 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000140 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000141
142 /* Generators always return to their most recent caller, not
143 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000144 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000145 assert(f->f_back == NULL);
146 f->f_back = tstate->frame;
147
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000148 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000150 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000151
152 /* Don't keep the reference to f_back any longer than necessary. It
153 * may keep a chain of frames alive or it could create a reference
154 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000155 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000156 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000157
Tim Petersad1a18b2001-06-23 06:19:16 +0000158 /* If the generator just returned (as opposed to yielding), signal
159 * that the generator is exhausted. */
160 if (result == Py_None && f->f_stacktop == NULL) {
161 Py_DECREF(result);
162 result = NULL;
163 }
164
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000165 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000166}
167
168static PyObject *
169gen_next(genobject *gen, PyObject *args)
170{
171 PyObject *result;
172
173 if (!PyArg_ParseTuple(args, ":next"))
174 return NULL;
175
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000176 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000177
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000178 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000179 PyErr_SetObject(PyExc_StopIteration, Py_None);
180 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000181 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000182
183 return result;
184}
185
186static PyObject *
187gen_getiter(PyObject *gen)
188{
189 Py_INCREF(gen);
190 return gen;
191}
192
193static struct PyMethodDef gen_methods[] = {
194 {"next", (PyCFunction)gen_next, METH_VARARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000195 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000196 {NULL, NULL} /* Sentinel */
197};
198
Tim Peters6d6c1a32001-08-02 04:15:00 +0000199static struct memberlist gen_memberlist[] = {
200 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
201 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
202 {NULL} /* Sentinel */
203};
Tim Peters5ca576e2001-06-18 22:08:13 +0000204
205statichere PyTypeObject gentype = {
206 PyObject_HEAD_INIT(&PyType_Type)
207 0, /* ob_size */
208 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000209 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000210 0, /* tp_itemsize */
211 /* methods */
212 (destructor)gen_dealloc, /* tp_dealloc */
213 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000214 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000215 0, /* tp_setattr */
216 0, /* tp_compare */
217 0, /* tp_repr */
218 0, /* tp_as_number */
219 0, /* tp_as_sequence */
220 0, /* tp_as_mapping */
221 0, /* tp_hash */
222 0, /* tp_call */
223 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000224 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225 0, /* tp_setattro */
226 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000227 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000228 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000229 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000230 0, /* tp_clear */
231 0, /* tp_richcompare */
232 0, /* tp_weaklistoffset */
233 (getiterfunc)gen_getiter, /* tp_iter */
234 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000235 gen_methods, /* tp_methods */
236 gen_memberlist, /* tp_members */
237 0, /* tp_getset */
238 0, /* tp_base */
239 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000240};
241
242
Guido van Rossume59214e1994-08-30 08:01:59 +0000243#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000244
Guido van Rossum2571cc81999-04-07 16:07:23 +0000245#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000246#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000247#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000248#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000249
Guido van Rossuma027efa1997-05-05 20:56:21 +0000250extern int _PyThread_Started; /* Flag for Py_Exit */
251
Guido van Rossum65d5b571998-12-21 19:32:43 +0000252static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000253static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254
255void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000256PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000257{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000258 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000259 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000260 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000261 interpreter_lock = PyThread_allocate_lock();
262 PyThread_acquire_lock(interpreter_lock, 1);
263 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000264}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000265
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000266void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000267PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000269 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000270}
271
272void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000273PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000275 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000276}
277
278void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000280{
281 if (tstate == NULL)
282 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000283 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000284 if (PyThreadState_Swap(tstate) != NULL)
285 Py_FatalError(
286 "PyEval_AcquireThread: non-NULL old thread state");
287}
288
289void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000290PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000291{
292 if (tstate == NULL)
293 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
294 if (PyThreadState_Swap(NULL) != tstate)
295 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000296 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000297}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000298
299/* This function is called from PyOS_AfterFork to ensure that newly
300 created child processes don't hold locks referring to threads which
301 are not running in the child process. (This could also be done using
302 pthread_atfork mechanism, at least for the pthreads implementation.) */
303
304void
305PyEval_ReInitThreads(void)
306{
307 if (!interpreter_lock)
308 return;
309 /*XXX Can't use PyThread_free_lock here because it does too
310 much error-checking. Doing this cleanly would require
311 adding a new function to each thread_*.h. Instead, just
312 create a new lock and waste a little bit of memory */
313 interpreter_lock = PyThread_allocate_lock();
314 PyThread_acquire_lock(interpreter_lock, 1);
315 main_thread = PyThread_get_thread_ident();
316}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317#endif
318
Guido van Rossumff4949e1992-08-05 19:58:53 +0000319/* Functions save_thread and restore_thread are always defined so
320 dynamically loaded modules needn't be compiled separately for use
321 with and without threads: */
322
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000323PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000324PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000325{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000326 PyThreadState *tstate = PyThreadState_Swap(NULL);
327 if (tstate == NULL)
328 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000329#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000330 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000331 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000337PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000338{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000339 if (tstate == NULL)
340 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000341#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000343 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000344 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000345 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000346 }
347#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000348 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000349}
350
351
Guido van Rossuma9672091994-09-14 13:31:22 +0000352/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
353 signal handlers or Mac I/O completion routines) can schedule calls
354 to a function to be called synchronously.
355 The synchronous function is called with one void* argument.
356 It should return 0 for success or -1 for failure -- failure should
357 be accompanied by an exception.
358
359 If registry succeeds, the registry function returns 0; if it fails
360 (e.g. due to too many pending calls) it returns -1 (without setting
361 an exception condition).
362
363 Note that because registry may occur from within signal handlers,
364 or other asynchronous events, calling malloc() is unsafe!
365
366#ifdef WITH_THREAD
367 Any thread can schedule pending calls, but only the main thread
368 will execute them.
369#endif
370
371 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
372 There are two possible race conditions:
373 (1) nested asynchronous registry calls;
374 (2) registry calls made while pending calls are being processed.
375 While (1) is very unlikely, (2) is a real possibility.
376 The current code is safe against (2), but not against (1).
377 The safety against (2) is derived from the fact that only one
378 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000379
Guido van Rossuma027efa1997-05-05 20:56:21 +0000380 XXX Darn! With the advent of thread state, we should have an array
381 of pending calls per thread in the thread state! Later...
382*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000383
Guido van Rossuma9672091994-09-14 13:31:22 +0000384#define NPENDINGCALLS 32
385static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000386 int (*func)(void *);
387 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000388} pendingcalls[NPENDINGCALLS];
389static volatile int pendingfirst = 0;
390static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000391static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000392
393int
Thomas Wouters334fb892000-07-25 12:56:38 +0000394Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000395{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000396 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000397 int i, j;
398 /* XXX Begin critical section */
399 /* XXX If you want this to be safe against nested
400 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 if (busy)
402 return -1;
403 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000404 i = pendinglast;
405 j = (i + 1) % NPENDINGCALLS;
406 if (j == pendingfirst)
407 return -1; /* Queue full */
408 pendingcalls[i].func = func;
409 pendingcalls[i].arg = arg;
410 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000411 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000412 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000413 /* XXX End critical section */
414 return 0;
415}
416
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000418Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000419{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000420 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000421#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000422 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000423 return 0;
424#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000426 return 0;
427 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000428 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000429 for (;;) {
430 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000431 int (*func)(void *);
432 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000433 i = pendingfirst;
434 if (i == pendinglast)
435 break; /* Queue empty */
436 func = pendingcalls[i].func;
437 arg = pendingcalls[i].arg;
438 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000439 if (func(arg) < 0) {
440 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000441 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000445 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000446 return 0;
447}
448
449
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000450/* The interpreter's recursion limit */
451
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000452static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000453
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000454int
455Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000456{
457 return recursion_limit;
458}
459
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000460void
461Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000462{
463 recursion_limit = new_limit;
464}
465
Guido van Rossum374a9221991-04-04 10:40:29 +0000466/* Status code for main loop (reason for stack unwind) */
467
468enum why_code {
469 WHY_NOT, /* No error */
470 WHY_EXCEPTION, /* Exception occurred */
471 WHY_RERAISE, /* Exception re-raised by 'finally' */
472 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000473 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000474 WHY_CONTINUE, /* 'continue' statement */
475 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000476};
477
Tim Petersdbd9ba62000-07-09 03:09:57 +0000478static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000479static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000480
Guido van Rossum374a9221991-04-04 10:40:29 +0000481
Guido van Rossumb209a111997-04-29 18:18:01 +0000482PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000483PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000485 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 (PyObject **)NULL, 0,
488 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000489 (PyObject **)NULL, 0,
490 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491}
492
493
494/* Interpreter main loop */
495
Tim Peters6d6c1a32001-08-02 04:15:00 +0000496static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000497eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000498{
Guido van Rossum950361c1997-01-24 13:49:28 +0000499#ifdef DXPAIRS
500 int lastopcode = 0;
501#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000502 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000503 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000504 register int opcode=0; /* Current opcode */
505 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000506 register enum why_code why; /* Reason for block stack unwind */
507 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000508 register PyObject *x; /* Result object -- NULL if error */
509 register PyObject *v; /* Temporary objects popped off stack */
510 register PyObject *w;
511 register PyObject *u;
512 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000513 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000514 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000515 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000516 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000517 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000518 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000519#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000520 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000521#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000522#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000524 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000525#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000526
527/* Code access macros */
528
529#define GETCONST(i) Getconst(f, i)
530#define GETNAME(i) Getname(f, i)
531#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000532#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000533#define NEXTOP() (*next_instr++)
534#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000535#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000536#define JUMPBY(x) (next_instr += (x))
537
538/* Stack manipulation macros */
539
540#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
541#define EMPTY() (STACK_LEVEL() == 0)
542#define TOP() (stack_pointer[-1])
543#define BASIC_PUSH(v) (*stack_pointer++ = (v))
544#define BASIC_POP() (*--stack_pointer)
545
Guido van Rossum96a42c81992-01-12 02:29:51 +0000546#ifdef LLTRACE
547#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
548#define POP() (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
591#ifdef LLTRACE
592 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
593#endif
594#if defined(Py_DEBUG) || defined(LLTRACE)
595 filename = PyString_AsString(co->co_filename);
596#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000597
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 why = WHY_NOT;
599 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000600 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000601 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000602
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000604 /* Do periodic things. Doing this every time through
605 the loop would add too much overhead, so we do it
606 only every Nth instruction. We also do it if
607 ``things_to_do'' is set, i.e. when an asynchronous
608 event needs attention (e.g. a signal handler or
609 async I/O handler); see Py_AddPendingCall() and
610 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000611
Guido van Rossuma027efa1997-05-05 20:56:21 +0000612 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000613 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000614 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000615 if (Py_MakePendingCalls() < 0) {
616 why = WHY_EXCEPTION;
617 goto on_error;
618 }
619 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000620#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000621 /* If we have true signals, the signal handler
622 will call Py_AddPendingCall() so we don't
623 have to call sigcheck(). On the Mac and
624 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000625 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000627 goto on_error;
628 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000629#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000630
Guido van Rossume59214e1994-08-30 08:01:59 +0000631#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000632 if (interpreter_lock) {
633 /* Give another thread a chance */
634
Guido van Rossum25ce5661997-08-02 03:10:38 +0000635 if (PyThreadState_Swap(NULL) != tstate)
636 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000637 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638
639 /* Other threads may run now */
640
Guido van Rossum65d5b571998-12-21 19:32:43 +0000641 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000642 if (PyThreadState_Swap(tstate) != NULL)
643 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000644 }
645#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000646 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000647
Guido van Rossum374a9221991-04-04 10:40:29 +0000648 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000649
Guido van Rossum408027e1996-12-30 16:17:54 +0000650#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000651 f->f_lasti = INSTR_OFFSET();
652#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000653
Guido van Rossum374a9221991-04-04 10:40:29 +0000654 opcode = NEXTOP();
655 if (HAS_ARG(opcode))
656 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000657 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000658#ifdef DYNAMIC_EXECUTION_PROFILE
659#ifdef DXPAIRS
660 dxpairs[lastopcode][opcode]++;
661 lastopcode = opcode;
662#endif
663 dxp[opcode]++;
664#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000665
Guido van Rossum96a42c81992-01-12 02:29:51 +0000666#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000667 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000668
Guido van Rossum96a42c81992-01-12 02:29:51 +0000669 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 if (HAS_ARG(opcode)) {
671 printf("%d: %d, %d\n",
672 (int) (INSTR_OFFSET() - 3),
673 opcode, oparg);
674 }
675 else {
676 printf("%d: %d\n",
677 (int) (INSTR_OFFSET() - 1), opcode);
678 }
679 }
680#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000684
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 /* BEWARE!
686 It is essential that any operation that fails sets either
687 x to NULL, err to nonzero, or why to anything but WHY_NOT,
688 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000689
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000691
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 case POP_TOP:
693 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000694 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000695 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000696
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 case ROT_TWO:
698 v = POP();
699 w = POP();
700 PUSH(v);
701 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000702 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000703
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 case ROT_THREE:
705 v = POP();
706 w = POP();
707 x = POP();
708 PUSH(v);
709 PUSH(x);
710 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000711 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000712
Thomas Wouters434d0822000-08-24 20:11:32 +0000713 case ROT_FOUR:
714 u = POP();
715 v = POP();
716 w = POP();
717 x = POP();
718 PUSH(u);
719 PUSH(x);
720 PUSH(w);
721 PUSH(v);
722 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000723
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 case DUP_TOP:
725 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000728 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000729
Thomas Wouters434d0822000-08-24 20:11:32 +0000730 case DUP_TOPX:
731 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000732 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000733 x = TOP();
734 Py_INCREF(x);
735 PUSH(x);
736 continue;
737 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000738 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000739 Py_INCREF(x);
740 w = TOP();
741 Py_INCREF(w);
742 PUSH(x);
743 PUSH(w);
744 PUSH(x);
745 continue;
746 case 3:
747 x = POP();
748 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000749 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000750 Py_INCREF(w);
751 v = TOP();
752 Py_INCREF(v);
753 PUSH(w);
754 PUSH(x);
755 PUSH(v);
756 PUSH(w);
757 PUSH(x);
758 continue;
759 case 4:
760 x = POP();
761 Py_INCREF(x);
762 w = POP();
763 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000764 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000765 Py_INCREF(v);
766 u = TOP();
767 Py_INCREF(u);
768 PUSH(v);
769 PUSH(w);
770 PUSH(x);
771 PUSH(u);
772 PUSH(v);
773 PUSH(w);
774 PUSH(x);
775 continue;
776 case 5:
777 x = POP();
778 Py_INCREF(x);
779 w = POP();
780 Py_INCREF(w);
781 v = POP();
782 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000783 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000784 Py_INCREF(u);
785 t = TOP();
786 Py_INCREF(t);
787 PUSH(u);
788 PUSH(v);
789 PUSH(w);
790 PUSH(x);
791 PUSH(t);
792 PUSH(u);
793 PUSH(v);
794 PUSH(w);
795 PUSH(x);
796 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000797 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000798 Py_FatalError("invalid argument to DUP_TOPX"
799 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000800 }
Tim Peters35ba6892000-10-11 07:04:49 +0000801 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000802
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 case UNARY_POSITIVE:
804 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000805 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000806 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000808 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000809 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000810
Guido van Rossum374a9221991-04-04 10:40:29 +0000811 case UNARY_NEGATIVE:
812 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000813 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000814 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000816 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000818
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 case UNARY_NOT:
820 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000821 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000822 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000823 if (err == 0) {
824 Py_INCREF(Py_True);
825 PUSH(Py_True);
826 continue;
827 }
828 else if (err > 0) {
829 Py_INCREF(Py_False);
830 PUSH(Py_False);
831 err = 0;
832 continue;
833 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case UNARY_CONVERT:
837 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 x = PyObject_Repr(v);
839 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 Rossum7928cd71991-10-24 14:59:31 +0000844 case UNARY_INVERT:
845 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000850 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000851
Guido van Rossum50564e81996-01-12 01:13:16 +0000852 case BINARY_POWER:
853 w = POP();
854 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 Py_DECREF(v);
857 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000858 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000859 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000860 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000861
Guido van Rossum374a9221991-04-04 10:40:29 +0000862 case BINARY_MULTIPLY:
863 w = POP();
864 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000865 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000866 Py_DECREF(v);
867 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000871
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 case BINARY_DIVIDE:
873 w = POP();
874 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000875 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000876 Py_DECREF(v);
877 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000879 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000881
Guido van Rossum4668b002001-08-08 05:00:18 +0000882 case BINARY_FLOOR_DIVIDE:
883 w = POP();
884 v = POP();
885 x = PyNumber_FloorDivide(v, w);
886 Py_DECREF(v);
887 Py_DECREF(w);
888 PUSH(x);
889 if (x != NULL) continue;
890 break;
891
892 case BINARY_TRUE_DIVIDE:
893 w = POP();
894 v = POP();
895 x = PyNumber_TrueDivide(v, w);
896 Py_DECREF(v);
897 Py_DECREF(w);
898 PUSH(x);
899 if (x != NULL) continue;
900 break;
901
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 case BINARY_MODULO:
903 w = POP();
904 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000905 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000906 Py_DECREF(v);
907 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000909 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000911
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 case BINARY_ADD:
913 w = POP();
914 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000915 if (PyInt_Check(v) && PyInt_Check(w)) {
916 /* INLINE: int + int */
917 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000918 a = PyInt_AS_LONG(v);
919 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000920 i = a + b;
921 if ((i^a) < 0 && (i^b) < 0) {
922 PyErr_SetString(PyExc_OverflowError,
923 "integer addition");
924 x = NULL;
925 }
926 else
927 x = PyInt_FromLong(i);
928 }
929 else
930 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000931 Py_DECREF(v);
932 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000934 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000936
Guido van Rossum374a9221991-04-04 10:40:29 +0000937 case BINARY_SUBTRACT:
938 w = POP();
939 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000940 if (PyInt_Check(v) && PyInt_Check(w)) {
941 /* INLINE: int - int */
942 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000943 a = PyInt_AS_LONG(v);
944 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000945 i = a - b;
946 if ((i^a) < 0 && (i^~b) < 0) {
947 PyErr_SetString(PyExc_OverflowError,
948 "integer subtraction");
949 x = NULL;
950 }
951 else
952 x = PyInt_FromLong(i);
953 }
954 else
955 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000956 Py_DECREF(v);
957 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000959 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000961
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 case BINARY_SUBSCR:
963 w = POP();
964 v = POP();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000965 if (v->ob_type == &PyList_Type && PyInt_Check(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000966 /* INLINE: list[int] */
967 long i = PyInt_AsLong(w);
968 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000969 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000970 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000971 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000972 PyErr_SetString(PyExc_IndexError,
973 "list index out of range");
974 x = NULL;
975 }
976 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000977 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000978 Py_INCREF(x);
979 }
980 }
981 else
982 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000983 Py_DECREF(v);
984 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000986 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000988
Guido van Rossum7928cd71991-10-24 14:59:31 +0000989 case BINARY_LSHIFT:
990 w = POP();
991 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000992 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000993 Py_DECREF(v);
994 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000996 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000997 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000998
Guido van Rossum7928cd71991-10-24 14:59:31 +0000999 case BINARY_RSHIFT:
1000 w = POP();
1001 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001002 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001003 Py_DECREF(v);
1004 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001005 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001006 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001007 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001008
Guido van Rossum7928cd71991-10-24 14:59:31 +00001009 case BINARY_AND:
1010 w = POP();
1011 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001012 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 Py_DECREF(v);
1014 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001015 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001016 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001017 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001018
Guido van Rossum7928cd71991-10-24 14:59:31 +00001019 case BINARY_XOR:
1020 w = POP();
1021 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001022 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001023 Py_DECREF(v);
1024 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001025 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001026 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001028
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 case BINARY_OR:
1030 w = POP();
1031 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001032 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001033 Py_DECREF(v);
1034 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001035 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001036 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001037 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001038
1039 case INPLACE_POWER:
1040 w = POP();
1041 v = POP();
1042 x = PyNumber_InPlacePower(v, w, Py_None);
1043 Py_DECREF(v);
1044 Py_DECREF(w);
1045 PUSH(x);
1046 if (x != NULL) continue;
1047 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001048
Thomas Wouters434d0822000-08-24 20:11:32 +00001049 case INPLACE_MULTIPLY:
1050 w = POP();
1051 v = POP();
1052 x = PyNumber_InPlaceMultiply(v, w);
1053 Py_DECREF(v);
1054 Py_DECREF(w);
1055 PUSH(x);
1056 if (x != NULL) continue;
1057 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001058
Thomas Wouters434d0822000-08-24 20:11:32 +00001059 case INPLACE_DIVIDE:
1060 w = POP();
1061 v = POP();
1062 x = PyNumber_InPlaceDivide(v, w);
1063 Py_DECREF(v);
1064 Py_DECREF(w);
1065 PUSH(x);
1066 if (x != NULL) continue;
1067 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001068
Guido van Rossum4668b002001-08-08 05:00:18 +00001069 case INPLACE_FLOOR_DIVIDE:
1070 w = POP();
1071 v = POP();
1072 x = PyNumber_InPlaceFloorDivide(v, w);
1073 Py_DECREF(v);
1074 Py_DECREF(w);
1075 PUSH(x);
1076 if (x != NULL) continue;
1077 break;
1078
1079 case INPLACE_TRUE_DIVIDE:
1080 w = POP();
1081 v = POP();
1082 x = PyNumber_InPlaceTrueDivide(v, w);
1083 Py_DECREF(v);
1084 Py_DECREF(w);
1085 PUSH(x);
1086 if (x != NULL) continue;
1087 break;
1088
Thomas Wouters434d0822000-08-24 20:11:32 +00001089 case INPLACE_MODULO:
1090 w = POP();
1091 v = POP();
1092 x = PyNumber_InPlaceRemainder(v, w);
1093 Py_DECREF(v);
1094 Py_DECREF(w);
1095 PUSH(x);
1096 if (x != NULL) continue;
1097 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001098
Thomas Wouters434d0822000-08-24 20:11:32 +00001099 case INPLACE_ADD:
1100 w = POP();
1101 v = POP();
1102 if (PyInt_Check(v) && PyInt_Check(w)) {
1103 /* INLINE: int + int */
1104 register long a, b, i;
1105 a = PyInt_AS_LONG(v);
1106 b = PyInt_AS_LONG(w);
1107 i = a + b;
1108 if ((i^a) < 0 && (i^b) < 0) {
1109 PyErr_SetString(PyExc_OverflowError,
1110 "integer addition");
1111 x = NULL;
1112 }
1113 else
1114 x = PyInt_FromLong(i);
1115 }
1116 else
1117 x = PyNumber_InPlaceAdd(v, w);
1118 Py_DECREF(v);
1119 Py_DECREF(w);
1120 PUSH(x);
1121 if (x != NULL) continue;
1122 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001123
Thomas Wouters434d0822000-08-24 20:11:32 +00001124 case INPLACE_SUBTRACT:
1125 w = POP();
1126 v = POP();
1127 if (PyInt_Check(v) && PyInt_Check(w)) {
1128 /* INLINE: int - int */
1129 register long a, b, i;
1130 a = PyInt_AS_LONG(v);
1131 b = PyInt_AS_LONG(w);
1132 i = a - b;
1133 if ((i^a) < 0 && (i^~b) < 0) {
1134 PyErr_SetString(PyExc_OverflowError,
1135 "integer subtraction");
1136 x = NULL;
1137 }
1138 else
1139 x = PyInt_FromLong(i);
1140 }
1141 else
1142 x = PyNumber_InPlaceSubtract(v, w);
1143 Py_DECREF(v);
1144 Py_DECREF(w);
1145 PUSH(x);
1146 if (x != NULL) continue;
1147 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001148
Thomas Wouters434d0822000-08-24 20:11:32 +00001149 case INPLACE_LSHIFT:
1150 w = POP();
1151 v = POP();
1152 x = PyNumber_InPlaceLshift(v, w);
1153 Py_DECREF(v);
1154 Py_DECREF(w);
1155 PUSH(x);
1156 if (x != NULL) continue;
1157 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001158
Thomas Wouters434d0822000-08-24 20:11:32 +00001159 case INPLACE_RSHIFT:
1160 w = POP();
1161 v = POP();
1162 x = PyNumber_InPlaceRshift(v, w);
1163 Py_DECREF(v);
1164 Py_DECREF(w);
1165 PUSH(x);
1166 if (x != NULL) continue;
1167 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001168
Thomas Wouters434d0822000-08-24 20:11:32 +00001169 case INPLACE_AND:
1170 w = POP();
1171 v = POP();
1172 x = PyNumber_InPlaceAnd(v, w);
1173 Py_DECREF(v);
1174 Py_DECREF(w);
1175 PUSH(x);
1176 if (x != NULL) continue;
1177 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001178
Thomas Wouters434d0822000-08-24 20:11:32 +00001179 case INPLACE_XOR:
1180 w = POP();
1181 v = POP();
1182 x = PyNumber_InPlaceXor(v, w);
1183 Py_DECREF(v);
1184 Py_DECREF(w);
1185 PUSH(x);
1186 if (x != NULL) continue;
1187 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001188
Thomas Wouters434d0822000-08-24 20:11:32 +00001189 case INPLACE_OR:
1190 w = POP();
1191 v = POP();
1192 x = PyNumber_InPlaceOr(v, w);
1193 Py_DECREF(v);
1194 Py_DECREF(w);
1195 PUSH(x);
1196 if (x != NULL) continue;
1197 break;
1198
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 case SLICE+0:
1200 case SLICE+1:
1201 case SLICE+2:
1202 case SLICE+3:
1203 if ((opcode-SLICE) & 2)
1204 w = POP();
1205 else
1206 w = NULL;
1207 if ((opcode-SLICE) & 1)
1208 v = POP();
1209 else
1210 v = NULL;
1211 u = POP();
1212 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001213 Py_DECREF(u);
1214 Py_XDECREF(v);
1215 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001216 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001217 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001218 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001219
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 case STORE_SLICE+0:
1221 case STORE_SLICE+1:
1222 case STORE_SLICE+2:
1223 case STORE_SLICE+3:
1224 if ((opcode-STORE_SLICE) & 2)
1225 w = POP();
1226 else
1227 w = NULL;
1228 if ((opcode-STORE_SLICE) & 1)
1229 v = POP();
1230 else
1231 v = NULL;
1232 u = POP();
1233 t = POP();
1234 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001235 Py_DECREF(t);
1236 Py_DECREF(u);
1237 Py_XDECREF(v);
1238 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001239 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001241
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 case DELETE_SLICE+0:
1243 case DELETE_SLICE+1:
1244 case DELETE_SLICE+2:
1245 case DELETE_SLICE+3:
1246 if ((opcode-DELETE_SLICE) & 2)
1247 w = POP();
1248 else
1249 w = NULL;
1250 if ((opcode-DELETE_SLICE) & 1)
1251 v = POP();
1252 else
1253 v = NULL;
1254 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001255 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001257 Py_DECREF(u);
1258 Py_XDECREF(v);
1259 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001260 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001262
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 case STORE_SUBSCR:
1264 w = POP();
1265 v = POP();
1266 u = POP();
1267 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001268 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001269 Py_DECREF(u);
1270 Py_DECREF(v);
1271 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001272 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001274
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 case DELETE_SUBSCR:
1276 w = POP();
1277 v = POP();
1278 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001279 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 Py_DECREF(v);
1281 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001282 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001284
Guido van Rossum374a9221991-04-04 10:40:29 +00001285 case PRINT_EXPR:
1286 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001287 w = PySys_GetObject("displayhook");
1288 if (w == NULL) {
1289 PyErr_SetString(PyExc_RuntimeError,
1290 "lost sys.displayhook");
1291 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001292 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001293 }
1294 if (err == 0) {
1295 x = Py_BuildValue("(O)", v);
1296 if (x == NULL)
1297 err = -1;
1298 }
1299 if (err == 0) {
1300 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001301 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001302 if (w == NULL)
1303 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001306 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001308
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001309 case PRINT_ITEM_TO:
1310 w = stream = POP();
1311 /* fall through to PRINT_ITEM */
1312
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 case PRINT_ITEM:
1314 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001315 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001316 w = PySys_GetObject("stdout");
1317 if (w == NULL) {
1318 PyErr_SetString(PyExc_RuntimeError,
1319 "lost sys.stdout");
1320 err = -1;
1321 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001322 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001323 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001324 err = PyFile_WriteString(" ", w);
1325 if (err == 0)
1326 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001327 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001328 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001329 char *s = PyString_AsString(v);
1330 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001331 if (len > 0 &&
1332 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001333 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001336 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001337 Py_XDECREF(stream);
1338 stream = NULL;
1339 if (err == 0)
1340 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001342
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001343 case PRINT_NEWLINE_TO:
1344 w = stream = POP();
1345 /* fall through to PRINT_NEWLINE */
1346
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001348 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001349 w = PySys_GetObject("stdout");
1350 if (w == NULL)
1351 PyErr_SetString(PyExc_RuntimeError,
1352 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001353 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001354 if (w != NULL) {
1355 err = PyFile_WriteString("\n", w);
1356 if (err == 0)
1357 PyFile_SoftSpace(w, 0);
1358 }
1359 Py_XDECREF(stream);
1360 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001362
Thomas Wouters434d0822000-08-24 20:11:32 +00001363
1364#ifdef CASE_TOO_BIG
1365 default: switch (opcode) {
1366#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 case BREAK_LOOP:
1368 why = WHY_BREAK;
1369 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001370
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001371 case CONTINUE_LOOP:
1372 retval = PyInt_FromLong(oparg);
1373 why = WHY_CONTINUE;
1374 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001375
Guido van Rossumf10570b1995-07-07 22:53:21 +00001376 case RAISE_VARARGS:
1377 u = v = w = NULL;
1378 switch (oparg) {
1379 case 3:
1380 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001381 /* Fallthrough */
1382 case 2:
1383 v = POP(); /* value */
1384 /* Fallthrough */
1385 case 1:
1386 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001387 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001388 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001389 break;
1390 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001391 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001392 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001393 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001394 break;
1395 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001397
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001399 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001400 PyErr_SetString(PyExc_SystemError,
1401 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001402 break;
1403 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001404 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001405 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001407
Guido van Rossum374a9221991-04-04 10:40:29 +00001408 case RETURN_VALUE:
1409 retval = POP();
1410 why = WHY_RETURN;
1411 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001412
Tim Peters5ca576e2001-06-18 22:08:13 +00001413 case YIELD_VALUE:
1414 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001415 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001416 f->f_lasti = INSTR_OFFSET();
1417 why = WHY_YIELD;
1418 break;
1419
1420
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001421 case EXEC_STMT:
1422 w = POP();
1423 v = POP();
1424 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001425 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 Py_DECREF(u);
1427 Py_DECREF(v);
1428 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001429 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001430
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 case POP_BLOCK:
1432 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 while (STACK_LEVEL() > b->b_level) {
1435 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 }
1438 }
1439 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001440
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 case END_FINALLY:
1442 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001443 if (PyInt_Check(v)) {
1444 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001445 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001446 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001447 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 retval = POP();
1449 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001450 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001452 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001453 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001455 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001457 else if (v != Py_None) {
1458 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 "'finally' pops bad exception");
1460 why = WHY_EXCEPTION;
1461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001464
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001466 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001467 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001468 w = POP();
1469 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001471 Py_DECREF(u);
1472 Py_DECREF(v);
1473 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001475
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 case STORE_NAME:
1477 w = GETNAMEV(oparg);
1478 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001479 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001480 PyErr_Format(PyExc_SystemError,
1481 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001482 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001483 break;
1484 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 err = PyDict_SetItem(x, w, v);
1486 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001488
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001490 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001491 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001492 PyErr_Format(PyExc_SystemError,
1493 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001494 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001495 break;
1496 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001498 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001499 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001501
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001502 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001504 if (PyTuple_Check(v)) {
1505 if (PyTuple_Size(v) != oparg) {
1506 PyErr_SetString(PyExc_ValueError,
1507 "unpack tuple of wrong size");
1508 why = WHY_EXCEPTION;
1509 }
1510 else {
1511 for (; --oparg >= 0; ) {
1512 w = PyTuple_GET_ITEM(v, oparg);
1513 Py_INCREF(w);
1514 PUSH(w);
1515 }
1516 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001518 else if (PyList_Check(v)) {
1519 if (PyList_Size(v) != oparg) {
1520 PyErr_SetString(PyExc_ValueError,
1521 "unpack list of wrong size");
1522 why = WHY_EXCEPTION;
1523 }
1524 else {
1525 for (; --oparg >= 0; ) {
1526 w = PyList_GET_ITEM(v, oparg);
1527 Py_INCREF(w);
1528 PUSH(w);
1529 }
1530 }
1531 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001532 else if (unpack_iterable(v, oparg,
1533 stack_pointer + oparg))
1534 stack_pointer += oparg;
1535 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001536 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001539
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001541 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 v = POP();
1543 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1545 Py_DECREF(v);
1546 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001548
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001550 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001552 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1553 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001556
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001557 case STORE_GLOBAL:
1558 w = GETNAMEV(oparg);
1559 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 err = PyDict_SetItem(f->f_globals, w, v);
1561 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001562 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001563
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001564 case DELETE_GLOBAL:
1565 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001566 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001567 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001568 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001569 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001570
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 case LOAD_CONST:
1572 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 PUSH(x);
1575 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001576
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001578 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001579 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001580 PyErr_Format(PyExc_SystemError,
1581 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001582 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001583 break;
1584 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001585 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001591 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001592 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001593 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 break;
1595 }
1596 }
1597 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 PUSH(x);
1600 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001601
Guido van Rossum374a9221991-04-04 10:40:29 +00001602 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001603 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001604 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001608 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001609 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001610 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001611 break;
1612 }
1613 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 PUSH(x);
1616 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001617
Guido van Rossum9bfef441993-03-29 10:43:31 +00001618 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001619 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001620 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001621 format_exc_check_arg(
1622 PyExc_UnboundLocalError,
1623 UNBOUNDLOCAL_ERROR_MSG,
1624 PyTuple_GetItem(co->co_varnames, oparg)
1625 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001626 break;
1627 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001628 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001629 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001630 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001631 break;
1632
1633 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001634 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001635 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001636 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001637
1638 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001639 x = GETLOCAL(oparg);
1640 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001641 format_exc_check_arg(
1642 PyExc_UnboundLocalError,
1643 UNBOUNDLOCAL_ERROR_MSG,
1644 PyTuple_GetItem(co->co_varnames, oparg)
1645 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001646 break;
1647 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001648 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001649 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001650
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001651 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001652 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001653 Py_INCREF(x);
1654 PUSH(x);
1655 break;
1656
1657 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001658 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001659 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001660 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001661 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001662 v = PyTuple_GetItem(co->co_cellvars,
1663 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001664 format_exc_check_arg(
1665 PyExc_UnboundLocalError,
1666 UNBOUNDLOCAL_ERROR_MSG,
1667 v);
1668 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001669 v = PyTuple_GetItem(
1670 co->co_freevars,
1671 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001672 format_exc_check_arg(
1673 PyExc_NameError,
1674 UNBOUNDFREE_ERROR_MSG,
1675 v);
1676 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001677 err = -1;
1678 break;
1679 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001680 PUSH(w);
1681 break;
1682
1683 case STORE_DEREF:
1684 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001685 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001686 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001687 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001688 continue;
1689
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 if (x != NULL) {
1693 for (; --oparg >= 0;) {
1694 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 }
1697 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001698 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 }
1700 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001701
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001703 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 if (x != NULL) {
1705 for (; --oparg >= 0;) {
1706 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001707 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 }
1709 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001710 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 }
1712 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001713
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001715 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001717 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001719
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001721 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 x = PyObject_GetAttr(v, w);
1724 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001726 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001728
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 case COMPARE_OP:
1730 w = POP();
1731 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001732 if (PyInt_Check(v) && PyInt_Check(w)) {
1733 /* INLINE: cmp(int, int) */
1734 register long a, b;
1735 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001736 a = PyInt_AS_LONG(v);
1737 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001738 switch (oparg) {
1739 case LT: res = a < b; break;
1740 case LE: res = a <= b; break;
1741 case EQ: res = a == b; break;
1742 case NE: res = a != b; break;
1743 case GT: res = a > b; break;
1744 case GE: res = a >= b; break;
1745 case IS: res = v == w; break;
1746 case IS_NOT: res = v != w; break;
1747 default: goto slow_compare;
1748 }
1749 x = res ? Py_True : Py_False;
1750 Py_INCREF(x);
1751 }
1752 else {
1753 slow_compare:
1754 x = cmp_outcome(oparg, v, w);
1755 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 Py_DECREF(v);
1757 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001759 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001761
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001763 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001764 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001765 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001766 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001767 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001768 break;
1769 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001770 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001771 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001772 w,
1773 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001774 f->f_locals == NULL ?
1775 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001776 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001777 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001778 if (w == NULL) {
1779 x = NULL;
1780 break;
1781 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 x = PyEval_CallObject(x, w);
1783 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001784 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001785 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001787
Thomas Wouters52152252000-08-17 22:55:00 +00001788 case IMPORT_STAR:
1789 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001791 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001792 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001793 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001794 break;
1795 }
Thomas Wouters52152252000-08-17 22:55:00 +00001796 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001797 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001798 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001799 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001801
Thomas Wouters52152252000-08-17 22:55:00 +00001802 case IMPORT_FROM:
1803 w = GETNAMEV(oparg);
1804 v = TOP();
1805 x = import_from(v, w);
1806 PUSH(x);
1807 if (x != NULL) continue;
1808 break;
1809
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 case JUMP_FORWARD:
1811 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001812 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001813
Guido van Rossum374a9221991-04-04 10:40:29 +00001814 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001816 if (err > 0)
1817 err = 0;
1818 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001820 else
1821 break;
1822 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001823
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001825 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001826 if (err > 0) {
1827 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001828 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001829 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001830 else if (err == 0)
1831 ;
1832 else
1833 break;
1834 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001835
Guido van Rossum374a9221991-04-04 10:40:29 +00001836 case JUMP_ABSOLUTE:
1837 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001838 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001839
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001840 case GET_ITER:
1841 /* before: [obj]; after [getiter(obj)] */
1842 v = POP();
1843 x = PyObject_GetIter(v);
1844 Py_DECREF(v);
1845 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001846 PUSH(x);
1847 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001848 }
1849 break;
1850
1851 case FOR_ITER:
1852 /* before: [iter]; after: [iter, iter()] *or* [] */
1853 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001854 x = PyIter_Next(v);
1855 if (x != NULL) {
1856 PUSH(x);
1857 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001858 }
Tim Petersf4848da2001-05-05 00:14:56 +00001859 if (!PyErr_Occurred()) {
1860 /* iterator ended normally */
1861 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001862 Py_DECREF(v);
1863 JUMPBY(oparg);
1864 continue;
1865 }
1866 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001867
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 case FOR_LOOP:
1869 /* for v in s: ...
1870 On entry: stack contains s, i.
1871 On exit: stack contains s, i+1, s[i];
1872 but if loop exhausted:
1873 s, i are popped, and we jump */
1874 w = POP(); /* Loop index */
1875 v = POP(); /* Sequence object */
1876 u = loop_subscript(v, w);
1877 if (u != NULL) {
1878 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001879 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001881 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001882 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001883 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 }
1885 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001886 Py_DECREF(v);
1887 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001888 /* A NULL can mean "s exhausted"
1889 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001890 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001891 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001892 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001893 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001894 continue;
1895 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 }
1897 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001898
Guido van Rossum374a9221991-04-04 10:40:29 +00001899 case SETUP_LOOP:
1900 case SETUP_EXCEPT:
1901 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001902 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001903 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001904 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001905
Guido van Rossum374a9221991-04-04 10:40:29 +00001906 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001907#ifdef LLTRACE
1908 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001910#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001911 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001912 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001913 continue;
1914 /* Trace each line of code reached */
1915 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001916 /* Inline call_trace() for performance: */
1917 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001918 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001919 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1920 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001921 tstate->use_tracing = (tstate->c_tracefunc
1922 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001923 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001924 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001925
1926 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001927 {
1928 int na = oparg & 0xff;
1929 int nk = (oparg>>8) & 0xff;
1930 int n = na + 2 * nk;
1931 PyObject **pfunc = stack_pointer - n - 1;
1932 PyObject *func = *pfunc;
1933 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1934
1935 /* Always dispatch PyCFunction first, because
1936 these are presumed to be the most frequent
1937 callable object.
1938 */
1939 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001940 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001941 if (flags > 1 || nk != 0)
1942 x = do_call(func, &stack_pointer,
1943 na, nk);
1944 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001945 PyObject *callargs;
1946 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001947 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001948 Py_XDECREF(callargs);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001949 } else if (!(flags & METH_KEYWORDS))
1950 x = fast_cfunction(func,
1951 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001952 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001953 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001954 && PyMethod_GET_SELF(func) != NULL) {
1955 /* optimize access to bound methods */
1956 PyObject *self = PyMethod_GET_SELF(func);
1957 Py_INCREF(self);
1958 func = PyMethod_GET_FUNCTION(func);
1959 Py_INCREF(func);
1960 Py_DECREF(*pfunc);
1961 *pfunc = self;
1962 na++;
1963 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001964 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001965 Py_INCREF(func);
1966 if (PyFunction_Check(func)) {
1967 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001968 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001969 } else {
1970 x = do_call(func, &stack_pointer,
1971 na, nk);
1972 }
1973 Py_DECREF(func);
1974 }
1975
1976 while (stack_pointer > pfunc) {
1977 w = POP();
1978 Py_DECREF(w);
1979 }
1980 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001981 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001982 continue;
1983 break;
1984 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001985
Jeremy Hylton76901512000-03-28 23:49:17 +00001986 case CALL_FUNCTION_VAR:
1987 case CALL_FUNCTION_KW:
1988 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001989 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001990 int na = oparg & 0xff;
1991 int nk = (oparg>>8) & 0xff;
1992 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001993 int n = na + 2 * nk;
1994 PyObject **pfunc, *func;
1995 if (flags & CALL_FLAG_VAR)
1996 n++;
1997 if (flags & CALL_FLAG_KW)
1998 n++;
1999 pfunc = stack_pointer - n - 1;
2000 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002001 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002002
Guido van Rossumac7be682001-01-17 15:42:30 +00002003 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002004 && PyMethod_GET_SELF(func) != NULL) {
2005 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002006 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002007 func = PyMethod_GET_FUNCTION(func);
2008 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002009 Py_DECREF(*pfunc);
2010 *pfunc = self;
2011 na++;
2012 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002013 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002014 Py_INCREF(func);
2015 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002016 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002017
Jeremy Hylton76901512000-03-28 23:49:17 +00002018 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002019 w = POP();
2020 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002021 }
2022 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002023 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002024 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002025 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002026 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002027
Guido van Rossum681d79a1995-07-18 14:51:37 +00002028 case MAKE_FUNCTION:
2029 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 x = PyFunction_New(v, f->f_globals);
2031 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002032 /* XXX Maybe this should be a separate opcode? */
2033 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002035 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002037 x = NULL;
2038 break;
2039 }
2040 while (--oparg >= 0) {
2041 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002042 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002043 }
2044 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002046 }
2047 PUSH(x);
2048 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002049
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002050 case MAKE_CLOSURE:
2051 {
2052 int nfree;
2053 v = POP(); /* code object */
2054 x = PyFunction_New(v, f->f_globals);
2055 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2056 Py_DECREF(v);
2057 /* XXX Maybe this should be a separate opcode? */
2058 if (x != NULL && nfree > 0) {
2059 v = PyTuple_New(nfree);
2060 if (v == NULL) {
2061 Py_DECREF(x);
2062 x = NULL;
2063 break;
2064 }
2065 while (--nfree >= 0) {
2066 w = POP();
2067 PyTuple_SET_ITEM(v, nfree, w);
2068 }
2069 err = PyFunction_SetClosure(x, v);
2070 Py_DECREF(v);
2071 }
2072 if (x != NULL && oparg > 0) {
2073 v = PyTuple_New(oparg);
2074 if (v == NULL) {
2075 Py_DECREF(x);
2076 x = NULL;
2077 break;
2078 }
2079 while (--oparg >= 0) {
2080 w = POP();
2081 PyTuple_SET_ITEM(v, oparg, w);
2082 }
2083 err = PyFunction_SetDefaults(x, v);
2084 Py_DECREF(v);
2085 }
2086 PUSH(x);
2087 break;
2088 }
2089
Guido van Rossum8861b741996-07-30 16:49:37 +00002090 case BUILD_SLICE:
2091 if (oparg == 3)
2092 w = POP();
2093 else
2094 w = NULL;
2095 v = POP();
2096 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002097 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002098 Py_DECREF(u);
2099 Py_DECREF(v);
2100 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002101 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002102 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002103 break;
2104
Fred Drakeef8ace32000-08-24 00:32:09 +00002105 case EXTENDED_ARG:
2106 opcode = NEXTOP();
2107 oparg = oparg<<16 | NEXTARG();
2108 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002109
Guido van Rossum374a9221991-04-04 10:40:29 +00002110 default:
2111 fprintf(stderr,
2112 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002113 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002114 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002115 why = WHY_EXCEPTION;
2116 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002117
2118#ifdef CASE_TOO_BIG
2119 }
2120#endif
2121
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 } /* switch */
2123
2124 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002125
Guido van Rossum374a9221991-04-04 10:40:29 +00002126 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002127
Guido van Rossum374a9221991-04-04 10:40:29 +00002128 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002129 if (err == 0 && x != NULL) {
2130#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002131 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002133 fprintf(stderr,
2134 "XXX undetected error\n");
2135 else
2136#endif
2137 continue; /* Normal, fast path */
2138 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002141 err = 0;
2142 }
2143
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002145
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002148 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002149 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 why = WHY_EXCEPTION;
2151 }
2152 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002153#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002155 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002157 fprintf(stderr,
2158 "XXX undetected error (why=%d)\n",
2159 why);
2160 why = WHY_EXCEPTION;
2161 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002162 }
2163#endif
2164
2165 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002166
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002168 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002170 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002172
Fred Drake9e3ad782001-07-03 23:39:52 +00002173 if (tstate->use_tracing) {
2174 if (tstate->c_tracefunc)
2175 call_exc_trace(tstate->c_tracefunc,
2176 tstate->c_traceobj, f);
2177 if (tstate->c_profilefunc)
2178 call_exc_trace(tstate->c_profilefunc,
2179 tstate->c_profileobj,f);
2180 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002181 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002182
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002184
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 if (why == WHY_RERAISE)
2186 why = WHY_EXCEPTION;
2187
2188 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002189
Tim Peters5ca576e2001-06-18 22:08:13 +00002190 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002192
2193 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2194 /* For a continue inside a try block,
2195 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002196 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002197 b->b_handler);
2198 why = WHY_NOT;
2199 JUMPTO(PyInt_AS_LONG(retval));
2200 Py_DECREF(retval);
2201 break;
2202 }
2203
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 while (STACK_LEVEL() > b->b_level) {
2205 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 }
2208 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2209 why = WHY_NOT;
2210 JUMPTO(b->b_handler);
2211 break;
2212 }
2213 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002214 (b->b_type == SETUP_EXCEPT &&
2215 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002217 PyObject *exc, *val, *tb;
2218 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002219 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002220 val = Py_None;
2221 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002222 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002223 /* Make the raw exception data
2224 available to the handler,
2225 so a program can emulate the
2226 Python main loop. Don't do
2227 this for 'finally'. */
2228 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002229 PyErr_NormalizeException(
2230 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002231 set_exc_info(tstate,
2232 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002233 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002234 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002235 PUSH(val);
2236 PUSH(exc);
2237 }
2238 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002239 if (why == WHY_RETURN ||
2240 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002241 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002242 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002243 PUSH(v);
2244 }
2245 why = WHY_NOT;
2246 JUMPTO(b->b_handler);
2247 break;
2248 }
2249 } /* unwind stack */
2250
2251 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002252
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 if (why != WHY_NOT)
2254 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002255
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002257
Tim Peters5ca576e2001-06-18 22:08:13 +00002258 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002259 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002260
Fred Drake9e3ad782001-07-03 23:39:52 +00002261 if (tstate->use_tracing) {
2262 if (tstate->c_tracefunc
2263 && (why == WHY_RETURN || why == WHY_YIELD)) {
2264 if (call_trace(tstate->c_tracefunc,
2265 tstate->c_traceobj, f,
2266 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002267 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002268 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002269 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002270 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002271 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002272 if (tstate->c_profilefunc
2273 && (why == WHY_RETURN || why == WHY_YIELD)) {
2274 if (call_trace(tstate->c_profilefunc,
2275 tstate->c_profileobj, f,
2276 PyTrace_RETURN, retval)) {
2277 Py_XDECREF(retval);
2278 retval = NULL;
2279 why = WHY_EXCEPTION;
2280 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002281 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002282 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002283
Guido van Rossuma027efa1997-05-05 20:56:21 +00002284 reset_exc_info(tstate);
2285
Tim Peters5ca576e2001-06-18 22:08:13 +00002286 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002287 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002288 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002289
Guido van Rossum96a42c81992-01-12 02:29:51 +00002290 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002291}
2292
Tim Peters6d6c1a32001-08-02 04:15:00 +00002293PyObject *
2294PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002295 PyObject **args, int argcount, PyObject **kws, int kwcount,
2296 PyObject **defs, int defcount, PyObject *closure)
2297{
2298 register PyFrameObject *f;
2299 register PyObject *retval = NULL;
2300 register PyObject **fastlocals, **freevars;
2301 PyThreadState *tstate = PyThreadState_GET();
2302 PyObject *x, *u;
2303
2304 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002305 PyErr_SetString(PyExc_SystemError,
2306 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002307 return NULL;
2308 }
2309
2310 f = PyFrame_New(tstate, /*back*/
2311 co, /*code*/
2312 globals, locals);
2313 if (f == NULL)
2314 return NULL;
2315
2316 fastlocals = f->f_localsplus;
2317 freevars = f->f_localsplus + f->f_nlocals;
2318
2319 if (co->co_argcount > 0 ||
2320 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2321 int i;
2322 int n = argcount;
2323 PyObject *kwdict = NULL;
2324 if (co->co_flags & CO_VARKEYWORDS) {
2325 kwdict = PyDict_New();
2326 if (kwdict == NULL)
2327 goto fail;
2328 i = co->co_argcount;
2329 if (co->co_flags & CO_VARARGS)
2330 i++;
2331 SETLOCAL(i, kwdict);
2332 }
2333 if (argcount > co->co_argcount) {
2334 if (!(co->co_flags & CO_VARARGS)) {
2335 PyErr_Format(PyExc_TypeError,
2336 "%.200s() takes %s %d "
2337 "%sargument%s (%d given)",
2338 PyString_AsString(co->co_name),
2339 defcount ? "at most" : "exactly",
2340 co->co_argcount,
2341 kwcount ? "non-keyword " : "",
2342 co->co_argcount == 1 ? "" : "s",
2343 argcount);
2344 goto fail;
2345 }
2346 n = co->co_argcount;
2347 }
2348 for (i = 0; i < n; i++) {
2349 x = args[i];
2350 Py_INCREF(x);
2351 SETLOCAL(i, x);
2352 }
2353 if (co->co_flags & CO_VARARGS) {
2354 u = PyTuple_New(argcount - n);
2355 if (u == NULL)
2356 goto fail;
2357 SETLOCAL(co->co_argcount, u);
2358 for (i = n; i < argcount; i++) {
2359 x = args[i];
2360 Py_INCREF(x);
2361 PyTuple_SET_ITEM(u, i-n, x);
2362 }
2363 }
2364 for (i = 0; i < kwcount; i++) {
2365 PyObject *keyword = kws[2*i];
2366 PyObject *value = kws[2*i + 1];
2367 int j;
2368 if (keyword == NULL || !PyString_Check(keyword)) {
2369 PyErr_Format(PyExc_TypeError,
2370 "%.200s() keywords must be strings",
2371 PyString_AsString(co->co_name));
2372 goto fail;
2373 }
2374 /* XXX slow -- speed up using dictionary? */
2375 for (j = 0; j < co->co_argcount; j++) {
2376 PyObject *nm = PyTuple_GET_ITEM(
2377 co->co_varnames, j);
2378 int cmp = PyObject_RichCompareBool(
2379 keyword, nm, Py_EQ);
2380 if (cmp > 0)
2381 break;
2382 else if (cmp < 0)
2383 goto fail;
2384 }
2385 /* Check errors from Compare */
2386 if (PyErr_Occurred())
2387 goto fail;
2388 if (j >= co->co_argcount) {
2389 if (kwdict == NULL) {
2390 PyErr_Format(PyExc_TypeError,
2391 "%.200s() got an unexpected "
2392 "keyword argument '%.400s'",
2393 PyString_AsString(co->co_name),
2394 PyString_AsString(keyword));
2395 goto fail;
2396 }
2397 PyDict_SetItem(kwdict, keyword, value);
2398 }
2399 else {
2400 if (GETLOCAL(j) != NULL) {
2401 PyErr_Format(PyExc_TypeError,
2402 "%.200s() got multiple "
2403 "values for keyword "
2404 "argument '%.400s'",
2405 PyString_AsString(co->co_name),
2406 PyString_AsString(keyword));
2407 goto fail;
2408 }
2409 Py_INCREF(value);
2410 SETLOCAL(j, value);
2411 }
2412 }
2413 if (argcount < co->co_argcount) {
2414 int m = co->co_argcount - defcount;
2415 for (i = argcount; i < m; i++) {
2416 if (GETLOCAL(i) == NULL) {
2417 PyErr_Format(PyExc_TypeError,
2418 "%.200s() takes %s %d "
2419 "%sargument%s (%d given)",
2420 PyString_AsString(co->co_name),
2421 ((co->co_flags & CO_VARARGS) ||
2422 defcount) ? "at least"
2423 : "exactly",
2424 m, kwcount ? "non-keyword " : "",
2425 m == 1 ? "" : "s", i);
2426 goto fail;
2427 }
2428 }
2429 if (n > m)
2430 i = n - m;
2431 else
2432 i = 0;
2433 for (; i < defcount; i++) {
2434 if (GETLOCAL(m+i) == NULL) {
2435 PyObject *def = defs[i];
2436 Py_INCREF(def);
2437 SETLOCAL(m+i, def);
2438 }
2439 }
2440 }
2441 }
2442 else {
2443 if (argcount > 0 || kwcount > 0) {
2444 PyErr_Format(PyExc_TypeError,
2445 "%.200s() takes no arguments (%d given)",
2446 PyString_AsString(co->co_name),
2447 argcount + kwcount);
2448 goto fail;
2449 }
2450 }
2451 /* Allocate and initialize storage for cell vars, and copy free
2452 vars into frame. This isn't too efficient right now. */
2453 if (f->f_ncells) {
2454 int i = 0, j = 0, nargs, found;
2455 char *cellname, *argname;
2456 PyObject *c;
2457
2458 nargs = co->co_argcount;
2459 if (co->co_flags & CO_VARARGS)
2460 nargs++;
2461 if (co->co_flags & CO_VARKEYWORDS)
2462 nargs++;
2463
2464 /* Check for cells that shadow args */
2465 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2466 cellname = PyString_AS_STRING(
2467 PyTuple_GET_ITEM(co->co_cellvars, i));
2468 found = 0;
2469 while (j < nargs) {
2470 argname = PyString_AS_STRING(
2471 PyTuple_GET_ITEM(co->co_varnames, j));
2472 if (strcmp(cellname, argname) == 0) {
2473 c = PyCell_New(GETLOCAL(j));
2474 if (c == NULL)
2475 goto fail;
2476 GETLOCAL(f->f_nlocals + i) = c;
2477 found = 1;
2478 break;
2479 }
2480 j++;
2481 }
2482 if (found == 0) {
2483 c = PyCell_New(NULL);
2484 if (c == NULL)
2485 goto fail;
2486 SETLOCAL(f->f_nlocals + i, c);
2487 }
2488 }
2489 /* Initialize any that are left */
2490 while (i < f->f_ncells) {
2491 c = PyCell_New(NULL);
2492 if (c == NULL)
2493 goto fail;
2494 SETLOCAL(f->f_nlocals + i, c);
2495 i++;
2496 }
2497 }
2498 if (f->f_nfreevars) {
2499 int i;
2500 for (i = 0; i < f->f_nfreevars; ++i) {
2501 PyObject *o = PyTuple_GET_ITEM(closure, i);
2502 Py_INCREF(o);
2503 freevars[f->f_ncells + i] = o;
2504 }
2505 }
2506
Fred Drake9e3ad782001-07-03 23:39:52 +00002507 if (tstate->use_tracing) {
2508 if (tstate->c_tracefunc != NULL) {
2509 /* tstate->c_tracefunc, if defined, is a
2510 function that will be called on *every* entry
2511 to a code block. Its return value, if not
2512 None, is a function that will be called at
2513 the start of each executed line of code.
2514 (Actually, the function must return itself
2515 in order to continue tracing.) The trace
2516 functions are called with three arguments:
2517 a pointer to the current frame, a string
2518 indicating why the function is called, and
2519 an argument which depends on the situation.
2520 The global trace function is also called
2521 whenever an exception is detected. */
2522 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2523 f, PyTrace_CALL, Py_None)) {
2524 /* XXX Need way to compute arguments?? */
2525 /* Trace function raised an error */
2526 goto fail;
2527 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002528 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002529 if (tstate->c_profilefunc != NULL) {
2530 /* Similar for c_profilefunc, except it needn't
2531 return itself and isn't called for "line" events */
2532 if (call_trace(tstate->c_profilefunc,
2533 tstate->c_profileobj,
2534 f, PyTrace_CALL, Py_None)) {
2535 /* XXX Need way to compute arguments?? */
2536 /* Profile function raised an error */
2537 goto fail;
2538 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002539 }
2540 }
2541
2542 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002543 /* Don't need to keep the reference to f_back, it will be set
2544 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002545 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002546 f->f_back = NULL;
2547
2548 /* Create a new generator that owns the ready to run frame
2549 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002550 return gen_new(f);
2551 }
2552
2553 retval = eval_frame(f);
2554
2555 fail: /* Jump here from prelude on failure */
2556
2557 Py_DECREF(f);
2558 return retval;
2559}
2560
2561
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002563set_exc_info(PyThreadState *tstate,
2564 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002565{
2566 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002567 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002568
Guido van Rossuma027efa1997-05-05 20:56:21 +00002569 frame = tstate->frame;
2570 if (frame->f_exc_type == NULL) {
2571 /* This frame didn't catch an exception before */
2572 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573 if (tstate->exc_type == NULL) {
2574 Py_INCREF(Py_None);
2575 tstate->exc_type = Py_None;
2576 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002577 tmp_type = frame->f_exc_type;
2578 tmp_value = frame->f_exc_value;
2579 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002580 Py_XINCREF(tstate->exc_type);
2581 Py_XINCREF(tstate->exc_value);
2582 Py_XINCREF(tstate->exc_traceback);
2583 frame->f_exc_type = tstate->exc_type;
2584 frame->f_exc_value = tstate->exc_value;
2585 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002586 Py_XDECREF(tmp_type);
2587 Py_XDECREF(tmp_value);
2588 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002589 }
2590 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002591 tmp_type = tstate->exc_type;
2592 tmp_value = tstate->exc_value;
2593 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594 Py_XINCREF(type);
2595 Py_XINCREF(value);
2596 Py_XINCREF(tb);
2597 tstate->exc_type = type;
2598 tstate->exc_value = value;
2599 tstate->exc_traceback = tb;
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 /* For b/w compatibility */
2604 PySys_SetObject("exc_type", type);
2605 PySys_SetObject("exc_value", value);
2606 PySys_SetObject("exc_traceback", tb);
2607}
2608
2609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611{
2612 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002613 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002614 frame = tstate->frame;
2615 if (frame->f_exc_type != NULL) {
2616 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002617 tmp_type = tstate->exc_type;
2618 tmp_value = tstate->exc_value;
2619 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002620 Py_XINCREF(frame->f_exc_type);
2621 Py_XINCREF(frame->f_exc_value);
2622 Py_XINCREF(frame->f_exc_traceback);
2623 tstate->exc_type = frame->f_exc_type;
2624 tstate->exc_value = frame->f_exc_value;
2625 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002626 Py_XDECREF(tmp_type);
2627 Py_XDECREF(tmp_value);
2628 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002629 /* For b/w compatibility */
2630 PySys_SetObject("exc_type", frame->f_exc_type);
2631 PySys_SetObject("exc_value", frame->f_exc_value);
2632 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2633 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002634 tmp_type = frame->f_exc_type;
2635 tmp_value = frame->f_exc_value;
2636 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002637 frame->f_exc_type = NULL;
2638 frame->f_exc_value = NULL;
2639 frame->f_exc_traceback = NULL;
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}
2644
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002645/* Logic for the raise statement (too complicated for inlining).
2646 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002647static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002649{
Guido van Rossumd295f121998-04-09 21:39:57 +00002650 if (type == NULL) {
2651 /* Reraise */
2652 PyThreadState *tstate = PyThreadState_Get();
2653 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2654 value = tstate->exc_value;
2655 tb = tstate->exc_traceback;
2656 Py_XINCREF(type);
2657 Py_XINCREF(value);
2658 Py_XINCREF(tb);
2659 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002660
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002661 /* We support the following forms of raise:
2662 raise <class>, <classinstance>
2663 raise <class>, <argument tuple>
2664 raise <class>, None
2665 raise <class>, <argument>
2666 raise <classinstance>, None
2667 raise <string>, <object>
2668 raise <string>, None
2669
2670 An omitted second argument is the same as None.
2671
2672 In addition, raise <tuple>, <anything> is the same as
2673 raising the tuple's first item (and it better have one!);
2674 this rule is applied recursively.
2675
2676 Finally, an optional third argument can be supplied, which
2677 gives the traceback to be substituted (useful when
2678 re-raising an exception after examining it). */
2679
2680 /* First, check the traceback argument, replacing None with
2681 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 if (tb == Py_None) {
2683 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002684 tb = NULL;
2685 }
2686 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002688 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002689 goto raise_error;
2690 }
2691
2692 /* Next, replace a missing value with None */
2693 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 value = Py_None;
2695 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002696 }
2697
2698 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2700 PyObject *tmp = type;
2701 type = PyTuple_GET_ITEM(type, 0);
2702 Py_INCREF(type);
2703 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002704 }
2705
Barry Warsaw4249f541997-08-22 21:26:19 +00002706 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002707 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002708
2709 else if (PyClass_Check(type))
2710 PyErr_NormalizeException(&type, &value, &tb);
2711
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002714 if (value != Py_None) {
2715 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002716 "instance exception may not have a separate value");
2717 goto raise_error;
2718 }
2719 else {
2720 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002721 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002722 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2724 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002725 }
2726 }
2727 else {
2728 /* Not something you can raise. You get an exception
2729 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002730 PyErr_Format(PyExc_TypeError,
2731 "exceptions must be strings, classes, or "
2732 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 goto raise_error;
2734 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 if (tb == NULL)
2737 return WHY_EXCEPTION;
2738 else
2739 return WHY_RERAISE;
2740 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 Py_XDECREF(value);
2742 Py_XDECREF(type);
2743 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002744 return WHY_EXCEPTION;
2745}
2746
Tim Petersd6d010b2001-06-21 02:49:55 +00002747/* Iterate v argcnt times and store the results on the stack (via decreasing
2748 sp). Return 1 for success, 0 if error. */
2749
Barry Warsawe42b18f1997-08-25 22:13:04 +00002750static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002751unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002752{
Tim Petersd6d010b2001-06-21 02:49:55 +00002753 int i = 0;
2754 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002755 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002756
Tim Petersd6d010b2001-06-21 02:49:55 +00002757 assert(v != NULL);
2758
2759 it = PyObject_GetIter(v);
2760 if (it == NULL)
2761 goto Error;
2762
2763 for (; i < argcnt; i++) {
2764 w = PyIter_Next(it);
2765 if (w == NULL) {
2766 /* Iterator done, via error or exhaustion. */
2767 if (!PyErr_Occurred()) {
2768 PyErr_Format(PyExc_ValueError,
2769 "need more than %d value%s to unpack",
2770 i, i == 1 ? "" : "s");
2771 }
2772 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002773 }
2774 *--sp = w;
2775 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002776
2777 /* We better have exhausted the iterator now. */
2778 w = PyIter_Next(it);
2779 if (w == NULL) {
2780 if (PyErr_Occurred())
2781 goto Error;
2782 Py_DECREF(it);
2783 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002784 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002785 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002786 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002787Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002788 for (; i > 0; i--, sp++)
2789 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002790 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002791 return 0;
2792}
2793
2794
Guido van Rossum96a42c81992-01-12 02:29:51 +00002795#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002796static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002797prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002799 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002800 if (PyObject_Print(v, stdout, 0) != 0)
2801 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002802 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002803 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002805#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002807static void
Fred Drake5755ce62001-06-27 19:19:46 +00002808call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002809{
Guido van Rossumb209a111997-04-29 18:18:01 +00002810 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002811 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002813 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 value = Py_None;
2815 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002816 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002817 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002818 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002819 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002820 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002821 }
Fred Drake5755ce62001-06-27 19:19:46 +00002822 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002824 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002826 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 Py_XDECREF(type);
2828 Py_XDECREF(value);
2829 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002830 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002831}
2832
2833static int
Fred Drake5755ce62001-06-27 19:19:46 +00002834call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2835 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002836{
Fred Drake5755ce62001-06-27 19:19:46 +00002837 register PyThreadState *tstate = frame->f_tstate;
2838 int result;
2839 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002840 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002841 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002842 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002843 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002844 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2845 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002846 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002847 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002848}
2849
Fred Drake5755ce62001-06-27 19:19:46 +00002850void
2851PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002852{
Fred Drake5755ce62001-06-27 19:19:46 +00002853 PyThreadState *tstate = PyThreadState_Get();
2854 PyObject *temp = tstate->c_profileobj;
2855 Py_XINCREF(arg);
2856 tstate->c_profilefunc = NULL;
2857 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002858 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002859 Py_XDECREF(temp);
2860 tstate->c_profilefunc = func;
2861 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002862 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002863}
2864
2865void
2866PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2867{
2868 PyThreadState *tstate = PyThreadState_Get();
2869 PyObject *temp = tstate->c_traceobj;
2870 Py_XINCREF(arg);
2871 tstate->c_tracefunc = NULL;
2872 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002873 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002874 Py_XDECREF(temp);
2875 tstate->c_tracefunc = func;
2876 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002877 tstate->use_tracing = ((func != NULL)
2878 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002879}
2880
Guido van Rossumb209a111997-04-29 18:18:01 +00002881PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002882PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002883{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002884 PyThreadState *tstate = PyThreadState_Get();
2885 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002886 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002887 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002888 else
2889 return current_frame->f_builtins;
2890}
2891
Guido van Rossumb209a111997-04-29 18:18:01 +00002892PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002893PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002894{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002895 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002896 if (current_frame == NULL)
2897 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002898 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002899 return current_frame->f_locals;
2900}
2901
Guido van Rossumb209a111997-04-29 18:18:01 +00002902PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002903PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002904{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002905 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002906 if (current_frame == NULL)
2907 return NULL;
2908 else
2909 return current_frame->f_globals;
2910}
2911
Guido van Rossumb209a111997-04-29 18:18:01 +00002912PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002913PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002914{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002915 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002916 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002917}
2918
Guido van Rossum6135a871995-01-09 17:53:26 +00002919int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002920PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002921{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002922 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002923 return current_frame == NULL ? 0 : current_frame->f_restricted;
2924}
2925
Guido van Rossumbe270261997-05-22 22:26:18 +00002926int
Tim Peters5ba58662001-07-16 02:29:45 +00002927PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002928{
2929 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002930 int result = 0;
2931
2932 if (current_frame != NULL) {
2933 const int codeflags = current_frame->f_code->co_flags;
2934 if (codeflags & CO_NESTED) {
2935 result = 1;
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00002936 cf->cf_flags |= CO_NESTED;
Tim Peters5ba58662001-07-16 02:29:45 +00002937 }
2938 if (codeflags & CO_GENERATOR_ALLOWED) {
2939 result = 1;
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00002940 cf->cf_flags |= CO_GENERATOR_ALLOWED;
Tim Peters5ba58662001-07-16 02:29:45 +00002941 }
2942 }
2943 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002944}
2945
2946int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002947Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948{
Guido van Rossumb209a111997-04-29 18:18:01 +00002949 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002950 if (f == NULL)
2951 return 0;
2952 if (!PyFile_SoftSpace(f, 0))
2953 return 0;
2954 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955}
2956
Guido van Rossum3f5da241990-12-20 15:06:42 +00002957
Guido van Rossum681d79a1995-07-18 14:51:37 +00002958/* External interface to call any callable object.
2959 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002960
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002961#undef PyEval_CallObject
2962/* for backward compatibility: export this interface */
2963
Guido van Rossumb209a111997-04-29 18:18:01 +00002964PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002966{
Guido van Rossumb209a111997-04-29 18:18:01 +00002967 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002969#define PyEval_CallObject(func,arg) \
2970 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002971
Guido van Rossumb209a111997-04-29 18:18:01 +00002972PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002973PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002974{
Jeremy Hylton52820442001-01-03 23:52:36 +00002975 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002976
2977 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002978 arg = PyTuple_New(0);
2979 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002980 PyErr_SetString(PyExc_TypeError,
2981 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002982 return NULL;
2983 }
2984 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002985 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002986
Guido van Rossumb209a111997-04-29 18:18:01 +00002987 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002988 PyErr_SetString(PyExc_TypeError,
2989 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002990 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002991 return NULL;
2992 }
2993
Tim Peters6d6c1a32001-08-02 04:15:00 +00002994 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002995 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002996 return result;
2997}
2998
Tim Peters6d6c1a32001-08-02 04:15:00 +00002999char *
3000PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003001{
3002 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003003 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003004 else if (PyFunction_Check(func))
3005 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3006 else if (PyCFunction_Check(func))
3007 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3008 else if (PyClass_Check(func))
3009 return PyString_AsString(((PyClassObject*)func)->cl_name);
3010 else if (PyInstance_Check(func)) {
3011 return PyString_AsString(
3012 ((PyInstanceObject*)func)->in_class->cl_name);
3013 } else {
3014 return func->ob_type->tp_name;
3015 }
3016}
3017
Tim Peters6d6c1a32001-08-02 04:15:00 +00003018char *
3019PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003020{
3021 if (PyMethod_Check(func))
3022 return "()";
3023 else if (PyFunction_Check(func))
3024 return "()";
3025 else if (PyCFunction_Check(func))
3026 return "()";
3027 else if (PyClass_Check(func))
3028 return " constructor";
3029 else if (PyInstance_Check(func)) {
3030 return " instance";
3031 } else {
3032 return " object";
3033 }
3034}
3035
Jeremy Hylton52820442001-01-03 23:52:36 +00003036#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3037
3038/* The two fast_xxx() functions optimize calls for which no argument
3039 tuple is necessary; the objects are passed directly from the stack.
3040 fast_cfunction() is called for METH_OLDARGS functions.
3041 fast_function() is for functions with no special argument handling.
3042*/
3043
3044static PyObject *
3045fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3046{
3047 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3048 PyObject *self = PyCFunction_GET_SELF(func);
3049
Jeremy Hylton910d7d42001-08-12 21:52:24 +00003050 if (na == 0)
3051 return (*meth)(self, NULL);
3052 else if (na == 1) {
3053 PyObject *arg = EXT_POP(*pp_stack);
3054 PyObject *result = (*meth)(self, arg);
3055 Py_DECREF(arg);
3056 return result;
3057 } else {
3058 PyObject *args = load_args(pp_stack, na);
3059 PyObject *result = (*meth)(self, args);
3060 Py_DECREF(args);
3061 return result;
Jeremy Hylton52820442001-01-03 23:52:36 +00003062 }
3063}
3064
3065static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003066fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003067{
3068 PyObject *co = PyFunction_GET_CODE(func);
3069 PyObject *globals = PyFunction_GET_GLOBALS(func);
3070 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003071 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003072 PyObject **d = NULL;
3073 int nd = 0;
3074
3075 if (argdefs != NULL) {
3076 d = &PyTuple_GET_ITEM(argdefs, 0);
3077 nd = ((PyTupleObject *)argdefs)->ob_size;
3078 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003079 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003080 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003081 (*pp_stack)-2*nk, nk, d, nd,
3082 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003083}
3084
3085static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003086update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3087 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003088{
3089 PyObject *kwdict = NULL;
3090 if (orig_kwdict == NULL)
3091 kwdict = PyDict_New();
3092 else {
3093 kwdict = PyDict_Copy(orig_kwdict);
3094 Py_DECREF(orig_kwdict);
3095 }
3096 if (kwdict == NULL)
3097 return NULL;
3098 while (--nk >= 0) {
3099 int err;
3100 PyObject *value = EXT_POP(*pp_stack);
3101 PyObject *key = EXT_POP(*pp_stack);
3102 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003103 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003104 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003105 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003106 PyEval_GetFuncName(func),
3107 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003108 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003109 Py_DECREF(key);
3110 Py_DECREF(value);
3111 Py_DECREF(kwdict);
3112 return NULL;
3113 }
3114 err = PyDict_SetItem(kwdict, key, value);
3115 Py_DECREF(key);
3116 Py_DECREF(value);
3117 if (err) {
3118 Py_DECREF(kwdict);
3119 return NULL;
3120 }
3121 }
3122 return kwdict;
3123}
3124
3125static PyObject *
3126update_star_args(int nstack, int nstar, PyObject *stararg,
3127 PyObject ***pp_stack)
3128{
3129 PyObject *callargs, *w;
3130
3131 callargs = PyTuple_New(nstack + nstar);
3132 if (callargs == NULL) {
3133 return NULL;
3134 }
3135 if (nstar) {
3136 int i;
3137 for (i = 0; i < nstar; i++) {
3138 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3139 Py_INCREF(a);
3140 PyTuple_SET_ITEM(callargs, nstack + i, a);
3141 }
3142 }
3143 while (--nstack >= 0) {
3144 w = EXT_POP(*pp_stack);
3145 PyTuple_SET_ITEM(callargs, nstack, w);
3146 }
3147 return callargs;
3148}
3149
3150static PyObject *
3151load_args(PyObject ***pp_stack, int na)
3152{
3153 PyObject *args = PyTuple_New(na);
3154 PyObject *w;
3155
3156 if (args == NULL)
3157 return NULL;
3158 while (--na >= 0) {
3159 w = EXT_POP(*pp_stack);
3160 PyTuple_SET_ITEM(args, na, w);
3161 }
3162 return args;
3163}
3164
3165static PyObject *
3166do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3167{
3168 PyObject *callargs = NULL;
3169 PyObject *kwdict = NULL;
3170 PyObject *result = NULL;
3171
3172 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003173 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003174 if (kwdict == NULL)
3175 goto call_fail;
3176 }
3177 callargs = load_args(pp_stack, na);
3178 if (callargs == NULL)
3179 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003180 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003181 call_fail:
3182 Py_XDECREF(callargs);
3183 Py_XDECREF(kwdict);
3184 return result;
3185}
3186
3187static PyObject *
3188ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3189{
3190 int nstar = 0;
3191 PyObject *callargs = NULL;
3192 PyObject *stararg = NULL;
3193 PyObject *kwdict = NULL;
3194 PyObject *result = NULL;
3195
3196 if (flags & CALL_FLAG_KW) {
3197 kwdict = EXT_POP(*pp_stack);
3198 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003199 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003200 "%s%s argument after ** "
3201 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003202 PyEval_GetFuncName(func),
3203 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003204 goto ext_call_fail;
3205 }
3206 }
3207 if (flags & CALL_FLAG_VAR) {
3208 stararg = EXT_POP(*pp_stack);
3209 if (!PyTuple_Check(stararg)) {
3210 PyObject *t = NULL;
3211 t = PySequence_Tuple(stararg);
3212 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003213 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3214 PyErr_Format(PyExc_TypeError,
3215 "%s%s argument after * "
3216 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003217 PyEval_GetFuncName(func),
3218 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003219 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003220 goto ext_call_fail;
3221 }
3222 Py_DECREF(stararg);
3223 stararg = t;
3224 }
3225 nstar = PyTuple_GET_SIZE(stararg);
3226 }
3227 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003228 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003229 if (kwdict == NULL)
3230 goto ext_call_fail;
3231 }
3232 callargs = update_star_args(na, nstar, stararg, pp_stack);
3233 if (callargs == NULL)
3234 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003235 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003236 ext_call_fail:
3237 Py_XDECREF(callargs);
3238 Py_XDECREF(kwdict);
3239 Py_XDECREF(stararg);
3240 return result;
3241}
3242
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003243#define SLICE_ERROR_MSG \
3244 "standard sequence type does not support step size other than one"
3245
Guido van Rossumb209a111997-04-29 18:18:01 +00003246static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003247loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248{
Guido van Rossumb209a111997-04-29 18:18:01 +00003249 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003250 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003251 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003252 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 return NULL;
3254 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003255 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003256 v = (*sq->sq_item)(v, i);
3257 if (v)
3258 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003259 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003260 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003261 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262}
3263
Guido van Rossum20c6add2000-05-08 14:06:50 +00003264/* Extract a slice index from a PyInt or PyLong, the index is bound to
3265 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3266 and error. Returns 1 on success.*/
3267
3268int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003269_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270{
3271 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003272 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003273 if (PyInt_Check(v)) {
3274 x = PyInt_AsLong(v);
3275 } else if (PyLong_Check(v)) {
3276 x = PyLong_AsLong(v);
3277 if (x==-1 && PyErr_Occurred()) {
3278 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003279 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003280
Guido van Rossumac7be682001-01-17 15:42:30 +00003281 if (!PyErr_ExceptionMatches(
3282 PyExc_OverflowError)) {
3283 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003284 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003285 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003286 }
3287
Guido van Rossumac7be682001-01-17 15:42:30 +00003288 /* Clear the OverflowError */
3289 PyErr_Clear();
3290
3291 /* It's an overflow error, so we need to
3292 check the sign of the long integer,
3293 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003294 the error. */
3295
3296 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003297 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003298 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003299
3300 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003301 cmp = PyObject_RichCompareBool(v, long_zero,
3302 Py_GT);
3303 Py_DECREF(long_zero);
3304 if (cmp < 0)
3305 return 0;
3306 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003307 x = INT_MAX;
3308 else
3309 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003310 }
3311 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003312 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003313 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003314 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003316 /* Truncate -- very long indices are truncated anyway */
3317 if (x > INT_MAX)
3318 x = INT_MAX;
3319 else if (x < -INT_MAX)
3320 x = 0;
3321 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003322 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003323 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324}
3325
Guido van Rossumb209a111997-04-29 18:18:01 +00003326static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003327apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003329 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003330 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003332 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003333 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003334 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003336
3337static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003338assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3339 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003341 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003342 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003343 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003344 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003345 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003346 if (x == NULL)
3347 return PySequence_DelSlice(u, ilow, ihigh);
3348 else
3349 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350}
3351
Guido van Rossumb209a111997-04-29 18:18:01 +00003352static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003353cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354{
Guido van Rossumac7be682001-01-17 15:42:30 +00003355 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003357 case IS:
3358 case IS_NOT:
3359 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003360 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003361 res = !res;
3362 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 case IN:
3364 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003365 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003366 if (res < 0)
3367 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003368 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003369 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 break;
3371 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003372 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003373 break;
3374 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003375 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003377 v = res ? Py_True : Py_False;
3378 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 return v;
3380}
3381
Thomas Wouters52152252000-08-17 22:55:00 +00003382static PyObject *
3383import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003384{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003385 PyObject *x;
3386
3387 x = PyObject_GetAttr(v, name);
3388 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003389 PyErr_Format(PyExc_ImportError,
3390 "cannot import name %.230s",
3391 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003392 }
Thomas Wouters52152252000-08-17 22:55:00 +00003393 return x;
3394}
Guido van Rossumac7be682001-01-17 15:42:30 +00003395
Thomas Wouters52152252000-08-17 22:55:00 +00003396static int
3397import_all_from(PyObject *locals, PyObject *v)
3398{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003399 PyObject *all = PyObject_GetAttrString(v, "__all__");
3400 PyObject *dict, *name, *value;
3401 int skip_leading_underscores = 0;
3402 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003403
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003404 if (all == NULL) {
3405 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3406 return -1; /* Unexpected error */
3407 PyErr_Clear();
3408 dict = PyObject_GetAttrString(v, "__dict__");
3409 if (dict == NULL) {
3410 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3411 return -1;
3412 PyErr_SetString(PyExc_ImportError,
3413 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003414 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003415 }
3416 all = PyMapping_Keys(dict);
3417 Py_DECREF(dict);
3418 if (all == NULL)
3419 return -1;
3420 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003421 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003422
3423 for (pos = 0, err = 0; ; pos++) {
3424 name = PySequence_GetItem(all, pos);
3425 if (name == NULL) {
3426 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3427 err = -1;
3428 else
3429 PyErr_Clear();
3430 break;
3431 }
3432 if (skip_leading_underscores &&
3433 PyString_Check(name) &&
3434 PyString_AS_STRING(name)[0] == '_')
3435 {
3436 Py_DECREF(name);
3437 continue;
3438 }
3439 value = PyObject_GetAttr(v, name);
3440 if (value == NULL)
3441 err = -1;
3442 else
3443 err = PyDict_SetItem(locals, name, value);
3444 Py_DECREF(name);
3445 Py_XDECREF(value);
3446 if (err != 0)
3447 break;
3448 }
3449 Py_DECREF(all);
3450 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003451}
3452
Guido van Rossumb209a111997-04-29 18:18:01 +00003453static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003454build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003455{
Tim Peters6d6c1a32001-08-02 04:15:00 +00003456 PyObject *metaclass = NULL;
3457
3458 if (PyDict_Check(methods))
3459 metaclass = PyDict_GetItemString(methods, "__metaclass__");
3460
3461 if (metaclass == NULL) {
3462 if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0)
3463 metaclass = (PyObject *)
3464 PyTuple_GET_ITEM(bases, 0)->ob_type;
3465 else {
3466 PyObject *g = PyEval_GetGlobals();
3467 if (g != NULL && PyDict_Check(g))
3468 metaclass = PyDict_GetItemString(
3469 g, "__metaclass__");
3470 if (metaclass == NULL)
3471 metaclass = (PyObject *) &PyClass_Type;
Guido van Rossum25831651993-05-19 14:50:45 +00003472 }
3473 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003474 return PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
Guido van Rossum25831651993-05-19 14:50:45 +00003475}
3476
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003477static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003478exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3479 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003480{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003481 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003482 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003483 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003484
Guido van Rossumb209a111997-04-29 18:18:01 +00003485 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3486 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003487 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003488 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003489 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003490 locals = PyTuple_GetItem(prog, 2);
3491 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003492 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003493 if (globals == Py_None) {
3494 globals = PyEval_GetGlobals();
3495 if (locals == Py_None) {
3496 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003497 plain = 1;
3498 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003499 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003500 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003501 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003502 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003503 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003504 !PyCode_Check(prog) &&
3505 !PyFile_Check(prog)) {
3506 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003507 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003508 return -1;
3509 }
Fred Drake661ea262000-10-24 19:57:45 +00003510 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003511 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003512 "exec: arg 2 must be a dictionary or None");
3513 return -1;
3514 }
3515 if (!PyDict_Check(locals)) {
3516 PyErr_SetString(PyExc_TypeError,
3517 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003518 return -1;
3519 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003520 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003521 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003522 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003523 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003524 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003525 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003526 FILE *fp = PyFile_AsFile(prog);
3527 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003528 PyCompilerFlags cf;
3529 cf.cf_flags = 0;
3530 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003531 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3532 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003533 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003534 v = PyRun_File(fp, name, Py_file_input, globals,
3535 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003536 }
3537 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003538 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003539 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003540 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003541 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003542 cf.cf_flags = 0;
3543 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003544 v = PyRun_StringFlags(str, Py_file_input, globals,
3545 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003546 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003547 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003548 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003549 if (plain)
3550 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003551 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003552 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003553 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003554 return 0;
3555}
Guido van Rossum24c13741995-02-14 09:42:43 +00003556
Guido van Rossumac7be682001-01-17 15:42:30 +00003557static void
Paul Prescode68140d2000-08-30 20:25:01 +00003558format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3559{
3560 char *obj_str;
3561
3562 if (!obj)
3563 return;
3564
3565 obj_str = PyString_AsString(obj);
3566 if (!obj_str)
3567 return;
3568
3569 PyErr_Format(exc, format_str, obj_str);
3570}
Guido van Rossum950361c1997-01-24 13:49:28 +00003571
3572#ifdef DYNAMIC_EXECUTION_PROFILE
3573
3574PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003575getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003576{
3577 int i;
3578 PyObject *l = PyList_New(256);
3579 if (l == NULL) return NULL;
3580 for (i = 0; i < 256; i++) {
3581 PyObject *x = PyInt_FromLong(a[i]);
3582 if (x == NULL) {
3583 Py_DECREF(l);
3584 return NULL;
3585 }
3586 PyList_SetItem(l, i, x);
3587 }
3588 for (i = 0; i < 256; i++)
3589 a[i] = 0;
3590 return l;
3591}
3592
3593PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003594_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003595{
3596#ifndef DXPAIRS
3597 return getarray(dxp);
3598#else
3599 int i;
3600 PyObject *l = PyList_New(257);
3601 if (l == NULL) return NULL;
3602 for (i = 0; i < 257; i++) {
3603 PyObject *x = getarray(dxpairs[i]);
3604 if (x == NULL) {
3605 Py_DECREF(l);
3606 return NULL;
3607 }
3608 PyList_SetItem(l, i, x);
3609 }
3610 return l;
3611#endif
3612}
3613
3614#endif