blob: f052e9726aff7ee1f9ceda960c7639e0cf873085 [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 *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000169gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000170{
171 PyObject *result;
172
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000173 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000174
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000175 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000176 PyErr_SetObject(PyExc_StopIteration, Py_None);
177 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000178 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000179
180 return result;
181}
182
183static PyObject *
184gen_getiter(PyObject *gen)
185{
186 Py_INCREF(gen);
187 return gen;
188}
189
190static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000191 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000192 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000193 {NULL, NULL} /* Sentinel */
194};
195
Tim Peters6d6c1a32001-08-02 04:15:00 +0000196static struct memberlist gen_memberlist[] = {
197 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
198 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
199 {NULL} /* Sentinel */
200};
Tim Peters5ca576e2001-06-18 22:08:13 +0000201
202statichere PyTypeObject gentype = {
203 PyObject_HEAD_INIT(&PyType_Type)
204 0, /* ob_size */
205 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000206 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000207 0, /* tp_itemsize */
208 /* methods */
209 (destructor)gen_dealloc, /* tp_dealloc */
210 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000212 0, /* tp_setattr */
213 0, /* tp_compare */
214 0, /* tp_repr */
215 0, /* tp_as_number */
216 0, /* tp_as_sequence */
217 0, /* tp_as_mapping */
218 0, /* tp_hash */
219 0, /* tp_call */
220 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000222 0, /* tp_setattro */
223 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000224 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000226 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000227 0, /* tp_clear */
228 0, /* tp_richcompare */
229 0, /* tp_weaklistoffset */
230 (getiterfunc)gen_getiter, /* tp_iter */
231 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000232 gen_methods, /* tp_methods */
233 gen_memberlist, /* tp_members */
234 0, /* tp_getset */
235 0, /* tp_base */
236 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000237};
238
239
Guido van Rossume59214e1994-08-30 08:01:59 +0000240#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000241
Guido van Rossum2571cc81999-04-07 16:07:23 +0000242#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000244#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000245#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000246
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247extern int _PyThread_Started; /* Flag for Py_Exit */
248
Guido van Rossum65d5b571998-12-21 19:32:43 +0000249static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000250static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251
252void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000256 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 interpreter_lock = PyThread_allocate_lock();
259 PyThread_acquire_lock(interpreter_lock, 1);
260 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000262
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000265{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000266 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267}
268
269void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000271{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000272 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273}
274
275void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000276PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000277{
278 if (tstate == NULL)
279 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000280 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000281 if (PyThreadState_Swap(tstate) != NULL)
282 Py_FatalError(
283 "PyEval_AcquireThread: non-NULL old thread state");
284}
285
286void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000287PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000288{
289 if (tstate == NULL)
290 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
291 if (PyThreadState_Swap(NULL) != tstate)
292 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000293 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000294}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000295
296/* This function is called from PyOS_AfterFork to ensure that newly
297 created child processes don't hold locks referring to threads which
298 are not running in the child process. (This could also be done using
299 pthread_atfork mechanism, at least for the pthreads implementation.) */
300
301void
302PyEval_ReInitThreads(void)
303{
304 if (!interpreter_lock)
305 return;
306 /*XXX Can't use PyThread_free_lock here because it does too
307 much error-checking. Doing this cleanly would require
308 adding a new function to each thread_*.h. Instead, just
309 create a new lock and waste a little bit of memory */
310 interpreter_lock = PyThread_allocate_lock();
311 PyThread_acquire_lock(interpreter_lock, 1);
312 main_thread = PyThread_get_thread_ident();
313}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314#endif
315
Guido van Rossumff4949e1992-08-05 19:58:53 +0000316/* Functions save_thread and restore_thread are always defined so
317 dynamically loaded modules needn't be compiled separately for use
318 with and without threads: */
319
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000320PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000321PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000323 PyThreadState *tstate = PyThreadState_Swap(NULL);
324 if (tstate == NULL)
325 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000327 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000328 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000329#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000330 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331}
332
333void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000336 if (tstate == NULL)
337 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000338#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000339 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000340 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000341 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 }
344#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000345 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000346}
347
348
Guido van Rossuma9672091994-09-14 13:31:22 +0000349/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
350 signal handlers or Mac I/O completion routines) can schedule calls
351 to a function to be called synchronously.
352 The synchronous function is called with one void* argument.
353 It should return 0 for success or -1 for failure -- failure should
354 be accompanied by an exception.
355
356 If registry succeeds, the registry function returns 0; if it fails
357 (e.g. due to too many pending calls) it returns -1 (without setting
358 an exception condition).
359
360 Note that because registry may occur from within signal handlers,
361 or other asynchronous events, calling malloc() is unsafe!
362
363#ifdef WITH_THREAD
364 Any thread can schedule pending calls, but only the main thread
365 will execute them.
366#endif
367
368 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
369 There are two possible race conditions:
370 (1) nested asynchronous registry calls;
371 (2) registry calls made while pending calls are being processed.
372 While (1) is very unlikely, (2) is a real possibility.
373 The current code is safe against (2), but not against (1).
374 The safety against (2) is derived from the fact that only one
375 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000376
Guido van Rossuma027efa1997-05-05 20:56:21 +0000377 XXX Darn! With the advent of thread state, we should have an array
378 of pending calls per thread in the thread state! Later...
379*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000380
Guido van Rossuma9672091994-09-14 13:31:22 +0000381#define NPENDINGCALLS 32
382static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000383 int (*func)(void *);
384 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000385} pendingcalls[NPENDINGCALLS];
386static volatile int pendingfirst = 0;
387static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000388static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389
390int
Thomas Wouters334fb892000-07-25 12:56:38 +0000391Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000392{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000393 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000394 int i, j;
395 /* XXX Begin critical section */
396 /* XXX If you want this to be safe against nested
397 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000398 if (busy)
399 return -1;
400 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000401 i = pendinglast;
402 j = (i + 1) % NPENDINGCALLS;
403 if (j == pendingfirst)
404 return -1; /* Queue full */
405 pendingcalls[i].func = func;
406 pendingcalls[i].arg = arg;
407 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000408 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000409 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000410 /* XXX End critical section */
411 return 0;
412}
413
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000415Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000416{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000419 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 return 0;
421#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000423 return 0;
424 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000426 for (;;) {
427 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000428 int (*func)(void *);
429 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000430 i = pendingfirst;
431 if (i == pendinglast)
432 break; /* Queue empty */
433 func = pendingcalls[i].func;
434 arg = pendingcalls[i].arg;
435 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000436 if (func(arg) < 0) {
437 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000438 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000439 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000440 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000441 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000442 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000443 return 0;
444}
445
446
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000447/* The interpreter's recursion limit */
448
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000449static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000450
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000451int
452Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000453{
454 return recursion_limit;
455}
456
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000457void
458Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000459{
460 recursion_limit = new_limit;
461}
462
Guido van Rossum374a9221991-04-04 10:40:29 +0000463/* Status code for main loop (reason for stack unwind) */
464
465enum why_code {
466 WHY_NOT, /* No error */
467 WHY_EXCEPTION, /* Exception occurred */
468 WHY_RERAISE, /* Exception re-raised by 'finally' */
469 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000470 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000471 WHY_CONTINUE, /* 'continue' statement */
472 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000473};
474
Tim Petersdbd9ba62000-07-09 03:09:57 +0000475static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000476static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000477
Guido van Rossum374a9221991-04-04 10:40:29 +0000478
Guido van Rossumb209a111997-04-29 18:18:01 +0000479PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000480PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000482 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 (PyObject **)NULL, 0,
485 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000486 (PyObject **)NULL, 0,
487 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488}
489
490
491/* Interpreter main loop */
492
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000494eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000495{
Guido van Rossum950361c1997-01-24 13:49:28 +0000496#ifdef DXPAIRS
497 int lastopcode = 0;
498#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000499 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000500 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000501 register int opcode=0; /* Current opcode */
502 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000503 register enum why_code why; /* Reason for block stack unwind */
504 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 register PyObject *x; /* Result object -- NULL if error */
506 register PyObject *v; /* Temporary objects popped off stack */
507 register PyObject *w;
508 register PyObject *u;
509 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000510 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000511 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000512 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000513 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000514 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000515 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000516#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000517 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000518#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000519#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000521 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000522#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000523
524/* Code access macros */
525
526#define GETCONST(i) Getconst(f, i)
527#define GETNAME(i) Getname(f, i)
528#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000529#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000530#define NEXTOP() (*next_instr++)
531#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000532#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000533#define JUMPBY(x) (next_instr += (x))
534
535/* Stack manipulation macros */
536
537#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
538#define EMPTY() (STACK_LEVEL() == 0)
539#define TOP() (stack_pointer[-1])
540#define BASIC_PUSH(v) (*stack_pointer++ = (v))
541#define BASIC_POP() (*--stack_pointer)
542
Guido van Rossum96a42c81992-01-12 02:29:51 +0000543#ifdef LLTRACE
544#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
545#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000546#else
547#define PUSH(v) BASIC_PUSH(v)
548#define POP() BASIC_POP()
549#endif
550
Guido van Rossum681d79a1995-07-18 14:51:37 +0000551/* Local variable macros */
552
553#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000554#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000555 GETLOCAL(i) = value; } while (0)
556
Guido van Rossuma027efa1997-05-05 20:56:21 +0000557/* Start of code */
558
Tim Peters5ca576e2001-06-18 22:08:13 +0000559 if (f == NULL)
560 return NULL;
561
Guido van Rossum8861b741996-07-30 16:49:37 +0000562#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000563 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000564 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000565 return NULL;
566 }
567#endif
568
Tim Peters5ca576e2001-06-18 22:08:13 +0000569 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000570 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000571 --tstate->recursion_depth;
572 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000573 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000575 return NULL;
576 }
577
Tim Peters5ca576e2001-06-18 22:08:13 +0000578 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000579 co = f->f_code;
580 fastlocals = f->f_localsplus;
581 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000582 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000583 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000584 stack_pointer = f->f_stacktop;
585 assert(stack_pointer != NULL);
586 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000587
588#ifdef LLTRACE
589 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
590#endif
591#if defined(Py_DEBUG) || defined(LLTRACE)
592 filename = PyString_AsString(co->co_filename);
593#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000594
Guido van Rossum374a9221991-04-04 10:40:29 +0000595 why = WHY_NOT;
596 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000597 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000598 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000599
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 /* Do periodic things. Doing this every time through
602 the loop would add too much overhead, so we do it
603 only every Nth instruction. We also do it if
604 ``things_to_do'' is set, i.e. when an asynchronous
605 event needs attention (e.g. a signal handler or
606 async I/O handler); see Py_AddPendingCall() and
607 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000608
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000610 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000611 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000612 if (Py_MakePendingCalls() < 0) {
613 why = WHY_EXCEPTION;
614 goto on_error;
615 }
616 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000617#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000618 /* If we have true signals, the signal handler
619 will call Py_AddPendingCall() so we don't
620 have to call sigcheck(). On the Mac and
621 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000622 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000623 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000624 goto on_error;
625 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000626#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000627
Guido van Rossume59214e1994-08-30 08:01:59 +0000628#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000629 if (interpreter_lock) {
630 /* Give another thread a chance */
631
Guido van Rossum25ce5661997-08-02 03:10:38 +0000632 if (PyThreadState_Swap(NULL) != tstate)
633 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000634 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000635
636 /* Other threads may run now */
637
Guido van Rossum65d5b571998-12-21 19:32:43 +0000638 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000639 if (PyThreadState_Swap(tstate) != NULL)
640 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000641 }
642#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000643 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000644
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000646
Guido van Rossum408027e1996-12-30 16:17:54 +0000647#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000648 f->f_lasti = INSTR_OFFSET();
649#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000650
Guido van Rossum374a9221991-04-04 10:40:29 +0000651 opcode = NEXTOP();
652 if (HAS_ARG(opcode))
653 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000654 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000655#ifdef DYNAMIC_EXECUTION_PROFILE
656#ifdef DXPAIRS
657 dxpairs[lastopcode][opcode]++;
658 lastopcode = opcode;
659#endif
660 dxp[opcode]++;
661#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000662
Guido van Rossum96a42c81992-01-12 02:29:51 +0000663#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000664 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000665
Guido van Rossum96a42c81992-01-12 02:29:51 +0000666 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000667 if (HAS_ARG(opcode)) {
668 printf("%d: %d, %d\n",
669 (int) (INSTR_OFFSET() - 3),
670 opcode, oparg);
671 }
672 else {
673 printf("%d: %d\n",
674 (int) (INSTR_OFFSET() - 1), opcode);
675 }
676 }
677#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000679
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000681
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 /* BEWARE!
683 It is essential that any operation that fails sets either
684 x to NULL, err to nonzero, or why to anything but WHY_NOT,
685 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000686
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000688
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 case POP_TOP:
690 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000691 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000692 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000693
Guido van Rossum374a9221991-04-04 10:40:29 +0000694 case ROT_TWO:
695 v = POP();
696 w = POP();
697 PUSH(v);
698 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000699 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000700
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 case ROT_THREE:
702 v = POP();
703 w = POP();
704 x = POP();
705 PUSH(v);
706 PUSH(x);
707 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000708 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000709
Thomas Wouters434d0822000-08-24 20:11:32 +0000710 case ROT_FOUR:
711 u = POP();
712 v = POP();
713 w = POP();
714 x = POP();
715 PUSH(u);
716 PUSH(x);
717 PUSH(w);
718 PUSH(v);
719 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000720
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 case DUP_TOP:
722 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000723 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000725 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000726
Thomas Wouters434d0822000-08-24 20:11:32 +0000727 case DUP_TOPX:
728 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000729 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000730 x = TOP();
731 Py_INCREF(x);
732 PUSH(x);
733 continue;
734 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000735 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000736 Py_INCREF(x);
737 w = TOP();
738 Py_INCREF(w);
739 PUSH(x);
740 PUSH(w);
741 PUSH(x);
742 continue;
743 case 3:
744 x = POP();
745 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000746 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000747 Py_INCREF(w);
748 v = TOP();
749 Py_INCREF(v);
750 PUSH(w);
751 PUSH(x);
752 PUSH(v);
753 PUSH(w);
754 PUSH(x);
755 continue;
756 case 4:
757 x = POP();
758 Py_INCREF(x);
759 w = POP();
760 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000761 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000762 Py_INCREF(v);
763 u = TOP();
764 Py_INCREF(u);
765 PUSH(v);
766 PUSH(w);
767 PUSH(x);
768 PUSH(u);
769 PUSH(v);
770 PUSH(w);
771 PUSH(x);
772 continue;
773 case 5:
774 x = POP();
775 Py_INCREF(x);
776 w = POP();
777 Py_INCREF(w);
778 v = POP();
779 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000780 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000781 Py_INCREF(u);
782 t = TOP();
783 Py_INCREF(t);
784 PUSH(u);
785 PUSH(v);
786 PUSH(w);
787 PUSH(x);
788 PUSH(t);
789 PUSH(u);
790 PUSH(v);
791 PUSH(w);
792 PUSH(x);
793 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000794 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000795 Py_FatalError("invalid argument to DUP_TOPX"
796 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000797 }
Tim Peters35ba6892000-10-11 07:04:49 +0000798 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000799
Guido van Rossum374a9221991-04-04 10:40:29 +0000800 case UNARY_POSITIVE:
801 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000802 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000803 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000804 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000805 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000806 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000807
Guido van Rossum374a9221991-04-04 10:40:29 +0000808 case UNARY_NEGATIVE:
809 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000810 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000811 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000812 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000813 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000815
Guido van Rossum374a9221991-04-04 10:40:29 +0000816 case UNARY_NOT:
817 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000818 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000819 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000820 if (err == 0) {
821 Py_INCREF(Py_True);
822 PUSH(Py_True);
823 continue;
824 }
825 else if (err > 0) {
826 Py_INCREF(Py_False);
827 PUSH(Py_False);
828 err = 0;
829 continue;
830 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000832
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 case UNARY_CONVERT:
834 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000835 x = PyObject_Repr(v);
836 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000838 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000840
Guido van Rossum7928cd71991-10-24 14:59:31 +0000841 case UNARY_INVERT:
842 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000843 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000844 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000845 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000846 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000847 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000848
Guido van Rossum50564e81996-01-12 01:13:16 +0000849 case BINARY_POWER:
850 w = POP();
851 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000852 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 Py_DECREF(v);
854 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000855 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000856 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000857 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000858
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 case BINARY_MULTIPLY:
860 w = POP();
861 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000862 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000863 Py_DECREF(v);
864 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000866 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000868
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 case BINARY_DIVIDE:
870 w = POP();
871 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000872 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000873 Py_DECREF(v);
874 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000876 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000878
Guido van Rossum4668b002001-08-08 05:00:18 +0000879 case BINARY_FLOOR_DIVIDE:
880 w = POP();
881 v = POP();
882 x = PyNumber_FloorDivide(v, w);
883 Py_DECREF(v);
884 Py_DECREF(w);
885 PUSH(x);
886 if (x != NULL) continue;
887 break;
888
889 case BINARY_TRUE_DIVIDE:
890 w = POP();
891 v = POP();
892 x = PyNumber_TrueDivide(v, w);
893 Py_DECREF(v);
894 Py_DECREF(w);
895 PUSH(x);
896 if (x != NULL) continue;
897 break;
898
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 case BINARY_MODULO:
900 w = POP();
901 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000902 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000903 Py_DECREF(v);
904 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000906 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000908
Guido van Rossum374a9221991-04-04 10:40:29 +0000909 case BINARY_ADD:
910 w = POP();
911 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000912 if (PyInt_Check(v) && PyInt_Check(w)) {
913 /* INLINE: int + int */
914 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000915 a = PyInt_AS_LONG(v);
916 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000917 i = a + b;
918 if ((i^a) < 0 && (i^b) < 0) {
919 PyErr_SetString(PyExc_OverflowError,
920 "integer addition");
921 x = NULL;
922 }
923 else
924 x = PyInt_FromLong(i);
925 }
926 else
927 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 Py_DECREF(v);
929 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000931 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000933
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 case BINARY_SUBTRACT:
935 w = POP();
936 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000937 if (PyInt_Check(v) && PyInt_Check(w)) {
938 /* INLINE: int - int */
939 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000940 a = PyInt_AS_LONG(v);
941 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000942 i = a - b;
943 if ((i^a) < 0 && (i^~b) < 0) {
944 PyErr_SetString(PyExc_OverflowError,
945 "integer subtraction");
946 x = NULL;
947 }
948 else
949 x = PyInt_FromLong(i);
950 }
951 else
952 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000953 Py_DECREF(v);
954 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000956 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000958
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 case BINARY_SUBSCR:
960 w = POP();
961 v = POP();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000962 if (v->ob_type == &PyList_Type && PyInt_Check(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000963 /* INLINE: list[int] */
964 long i = PyInt_AsLong(w);
965 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000966 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000967 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000968 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000969 PyErr_SetString(PyExc_IndexError,
970 "list index out of range");
971 x = NULL;
972 }
973 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000974 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 Py_INCREF(x);
976 }
977 }
978 else
979 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000980 Py_DECREF(v);
981 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000983 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000984 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000985
Guido van Rossum7928cd71991-10-24 14:59:31 +0000986 case BINARY_LSHIFT:
987 w = POP();
988 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000989 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000990 Py_DECREF(v);
991 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000992 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000993 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000994 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000995
Guido van Rossum7928cd71991-10-24 14:59:31 +0000996 case BINARY_RSHIFT:
997 w = POP();
998 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000999 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001000 Py_DECREF(v);
1001 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001002 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001003 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001004 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001005
Guido van Rossum7928cd71991-10-24 14:59:31 +00001006 case BINARY_AND:
1007 w = POP();
1008 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001009 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001010 Py_DECREF(v);
1011 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001012 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001013 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001014 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001015
Guido van Rossum7928cd71991-10-24 14:59:31 +00001016 case BINARY_XOR:
1017 w = POP();
1018 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001019 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001020 Py_DECREF(v);
1021 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001022 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001023 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001024 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001025
Guido van Rossum7928cd71991-10-24 14:59:31 +00001026 case BINARY_OR:
1027 w = POP();
1028 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001029 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001030 Py_DECREF(v);
1031 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001032 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001033 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001034 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001035
1036 case INPLACE_POWER:
1037 w = POP();
1038 v = POP();
1039 x = PyNumber_InPlacePower(v, w, Py_None);
1040 Py_DECREF(v);
1041 Py_DECREF(w);
1042 PUSH(x);
1043 if (x != NULL) continue;
1044 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001045
Thomas Wouters434d0822000-08-24 20:11:32 +00001046 case INPLACE_MULTIPLY:
1047 w = POP();
1048 v = POP();
1049 x = PyNumber_InPlaceMultiply(v, w);
1050 Py_DECREF(v);
1051 Py_DECREF(w);
1052 PUSH(x);
1053 if (x != NULL) continue;
1054 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001055
Thomas Wouters434d0822000-08-24 20:11:32 +00001056 case INPLACE_DIVIDE:
1057 w = POP();
1058 v = POP();
1059 x = PyNumber_InPlaceDivide(v, w);
1060 Py_DECREF(v);
1061 Py_DECREF(w);
1062 PUSH(x);
1063 if (x != NULL) continue;
1064 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001065
Guido van Rossum4668b002001-08-08 05:00:18 +00001066 case INPLACE_FLOOR_DIVIDE:
1067 w = POP();
1068 v = POP();
1069 x = PyNumber_InPlaceFloorDivide(v, w);
1070 Py_DECREF(v);
1071 Py_DECREF(w);
1072 PUSH(x);
1073 if (x != NULL) continue;
1074 break;
1075
1076 case INPLACE_TRUE_DIVIDE:
1077 w = POP();
1078 v = POP();
1079 x = PyNumber_InPlaceTrueDivide(v, w);
1080 Py_DECREF(v);
1081 Py_DECREF(w);
1082 PUSH(x);
1083 if (x != NULL) continue;
1084 break;
1085
Thomas Wouters434d0822000-08-24 20:11:32 +00001086 case INPLACE_MODULO:
1087 w = POP();
1088 v = POP();
1089 x = PyNumber_InPlaceRemainder(v, w);
1090 Py_DECREF(v);
1091 Py_DECREF(w);
1092 PUSH(x);
1093 if (x != NULL) continue;
1094 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001095
Thomas Wouters434d0822000-08-24 20:11:32 +00001096 case INPLACE_ADD:
1097 w = POP();
1098 v = POP();
1099 if (PyInt_Check(v) && PyInt_Check(w)) {
1100 /* INLINE: int + int */
1101 register long a, b, i;
1102 a = PyInt_AS_LONG(v);
1103 b = PyInt_AS_LONG(w);
1104 i = a + b;
1105 if ((i^a) < 0 && (i^b) < 0) {
1106 PyErr_SetString(PyExc_OverflowError,
1107 "integer addition");
1108 x = NULL;
1109 }
1110 else
1111 x = PyInt_FromLong(i);
1112 }
1113 else
1114 x = PyNumber_InPlaceAdd(v, w);
1115 Py_DECREF(v);
1116 Py_DECREF(w);
1117 PUSH(x);
1118 if (x != NULL) continue;
1119 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001120
Thomas Wouters434d0822000-08-24 20:11:32 +00001121 case INPLACE_SUBTRACT:
1122 w = POP();
1123 v = POP();
1124 if (PyInt_Check(v) && PyInt_Check(w)) {
1125 /* INLINE: int - int */
1126 register long a, b, i;
1127 a = PyInt_AS_LONG(v);
1128 b = PyInt_AS_LONG(w);
1129 i = a - b;
1130 if ((i^a) < 0 && (i^~b) < 0) {
1131 PyErr_SetString(PyExc_OverflowError,
1132 "integer subtraction");
1133 x = NULL;
1134 }
1135 else
1136 x = PyInt_FromLong(i);
1137 }
1138 else
1139 x = PyNumber_InPlaceSubtract(v, w);
1140 Py_DECREF(v);
1141 Py_DECREF(w);
1142 PUSH(x);
1143 if (x != NULL) continue;
1144 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001145
Thomas Wouters434d0822000-08-24 20:11:32 +00001146 case INPLACE_LSHIFT:
1147 w = POP();
1148 v = POP();
1149 x = PyNumber_InPlaceLshift(v, w);
1150 Py_DECREF(v);
1151 Py_DECREF(w);
1152 PUSH(x);
1153 if (x != NULL) continue;
1154 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001155
Thomas Wouters434d0822000-08-24 20:11:32 +00001156 case INPLACE_RSHIFT:
1157 w = POP();
1158 v = POP();
1159 x = PyNumber_InPlaceRshift(v, w);
1160 Py_DECREF(v);
1161 Py_DECREF(w);
1162 PUSH(x);
1163 if (x != NULL) continue;
1164 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001165
Thomas Wouters434d0822000-08-24 20:11:32 +00001166 case INPLACE_AND:
1167 w = POP();
1168 v = POP();
1169 x = PyNumber_InPlaceAnd(v, w);
1170 Py_DECREF(v);
1171 Py_DECREF(w);
1172 PUSH(x);
1173 if (x != NULL) continue;
1174 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001175
Thomas Wouters434d0822000-08-24 20:11:32 +00001176 case INPLACE_XOR:
1177 w = POP();
1178 v = POP();
1179 x = PyNumber_InPlaceXor(v, w);
1180 Py_DECREF(v);
1181 Py_DECREF(w);
1182 PUSH(x);
1183 if (x != NULL) continue;
1184 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001185
Thomas Wouters434d0822000-08-24 20:11:32 +00001186 case INPLACE_OR:
1187 w = POP();
1188 v = POP();
1189 x = PyNumber_InPlaceOr(v, w);
1190 Py_DECREF(v);
1191 Py_DECREF(w);
1192 PUSH(x);
1193 if (x != NULL) continue;
1194 break;
1195
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 case SLICE+0:
1197 case SLICE+1:
1198 case SLICE+2:
1199 case SLICE+3:
1200 if ((opcode-SLICE) & 2)
1201 w = POP();
1202 else
1203 w = NULL;
1204 if ((opcode-SLICE) & 1)
1205 v = POP();
1206 else
1207 v = NULL;
1208 u = POP();
1209 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001210 Py_DECREF(u);
1211 Py_XDECREF(v);
1212 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001214 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001216
Guido van Rossum374a9221991-04-04 10:40:29 +00001217 case STORE_SLICE+0:
1218 case STORE_SLICE+1:
1219 case STORE_SLICE+2:
1220 case STORE_SLICE+3:
1221 if ((opcode-STORE_SLICE) & 2)
1222 w = POP();
1223 else
1224 w = NULL;
1225 if ((opcode-STORE_SLICE) & 1)
1226 v = POP();
1227 else
1228 v = NULL;
1229 u = POP();
1230 t = POP();
1231 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001232 Py_DECREF(t);
1233 Py_DECREF(u);
1234 Py_XDECREF(v);
1235 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001236 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001238
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 case DELETE_SLICE+0:
1240 case DELETE_SLICE+1:
1241 case DELETE_SLICE+2:
1242 case DELETE_SLICE+3:
1243 if ((opcode-DELETE_SLICE) & 2)
1244 w = POP();
1245 else
1246 w = NULL;
1247 if ((opcode-DELETE_SLICE) & 1)
1248 v = POP();
1249 else
1250 v = NULL;
1251 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001252 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001254 Py_DECREF(u);
1255 Py_XDECREF(v);
1256 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001257 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001259
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 case STORE_SUBSCR:
1261 w = POP();
1262 v = POP();
1263 u = POP();
1264 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001265 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001266 Py_DECREF(u);
1267 Py_DECREF(v);
1268 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001269 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001271
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 case DELETE_SUBSCR:
1273 w = POP();
1274 v = POP();
1275 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001276 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001277 Py_DECREF(v);
1278 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001279 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001281
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 case PRINT_EXPR:
1283 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001284 w = PySys_GetObject("displayhook");
1285 if (w == NULL) {
1286 PyErr_SetString(PyExc_RuntimeError,
1287 "lost sys.displayhook");
1288 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001289 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001290 }
1291 if (err == 0) {
1292 x = Py_BuildValue("(O)", v);
1293 if (x == NULL)
1294 err = -1;
1295 }
1296 if (err == 0) {
1297 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001298 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001299 if (w == NULL)
1300 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001302 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001303 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001305
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001306 case PRINT_ITEM_TO:
1307 w = stream = POP();
1308 /* fall through to PRINT_ITEM */
1309
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 case PRINT_ITEM:
1311 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001312 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001313 w = PySys_GetObject("stdout");
1314 if (w == NULL) {
1315 PyErr_SetString(PyExc_RuntimeError,
1316 "lost sys.stdout");
1317 err = -1;
1318 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001319 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001320 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001321 err = PyFile_WriteString(" ", w);
1322 if (err == 0)
1323 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001324 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001325 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001326 char *s = PyString_AsString(v);
1327 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001328 if (len > 0 &&
1329 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001330 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001331 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001333 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001334 Py_XDECREF(stream);
1335 stream = NULL;
1336 if (err == 0)
1337 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001339
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001340 case PRINT_NEWLINE_TO:
1341 w = stream = POP();
1342 /* fall through to PRINT_NEWLINE */
1343
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001345 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001346 w = PySys_GetObject("stdout");
1347 if (w == NULL)
1348 PyErr_SetString(PyExc_RuntimeError,
1349 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001350 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001351 if (w != NULL) {
1352 err = PyFile_WriteString("\n", w);
1353 if (err == 0)
1354 PyFile_SoftSpace(w, 0);
1355 }
1356 Py_XDECREF(stream);
1357 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001359
Thomas Wouters434d0822000-08-24 20:11:32 +00001360
1361#ifdef CASE_TOO_BIG
1362 default: switch (opcode) {
1363#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 case BREAK_LOOP:
1365 why = WHY_BREAK;
1366 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001367
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001368 case CONTINUE_LOOP:
1369 retval = PyInt_FromLong(oparg);
1370 why = WHY_CONTINUE;
1371 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001372
Guido van Rossumf10570b1995-07-07 22:53:21 +00001373 case RAISE_VARARGS:
1374 u = v = w = NULL;
1375 switch (oparg) {
1376 case 3:
1377 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001378 /* Fallthrough */
1379 case 2:
1380 v = POP(); /* value */
1381 /* Fallthrough */
1382 case 1:
1383 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001384 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001385 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001386 break;
1387 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001388 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001389 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001390 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001391 break;
1392 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001394
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001396 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001397 PyErr_SetString(PyExc_SystemError,
1398 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001399 break;
1400 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001401 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001402 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001404
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 case RETURN_VALUE:
1406 retval = POP();
1407 why = WHY_RETURN;
1408 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001409
Tim Peters5ca576e2001-06-18 22:08:13 +00001410 case YIELD_VALUE:
1411 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001412 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001413 f->f_lasti = INSTR_OFFSET();
1414 why = WHY_YIELD;
1415 break;
1416
1417
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001418 case EXEC_STMT:
1419 w = POP();
1420 v = POP();
1421 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001422 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 Py_DECREF(u);
1424 Py_DECREF(v);
1425 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001426 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001427
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 case POP_BLOCK:
1429 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 while (STACK_LEVEL() > b->b_level) {
1432 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 }
1435 }
1436 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001437
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 case END_FINALLY:
1439 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 if (PyInt_Check(v)) {
1441 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001442 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001443 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001444 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 retval = POP();
1446 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001447 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001449 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001450 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001452 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001454 else if (v != Py_None) {
1455 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 "'finally' pops bad exception");
1457 why = WHY_EXCEPTION;
1458 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001459 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001461
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001463 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001465 w = POP();
1466 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001467 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 Py_DECREF(u);
1469 Py_DECREF(v);
1470 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001472
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 case STORE_NAME:
1474 w = GETNAMEV(oparg);
1475 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001476 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001477 PyErr_Format(PyExc_SystemError,
1478 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001479 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001480 break;
1481 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001482 err = PyDict_SetItem(x, w, v);
1483 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001485
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001487 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001488 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001489 PyErr_Format(PyExc_SystemError,
1490 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001491 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001492 break;
1493 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001495 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001496 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001498
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001499 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001501 if (PyTuple_Check(v)) {
1502 if (PyTuple_Size(v) != oparg) {
1503 PyErr_SetString(PyExc_ValueError,
1504 "unpack tuple of wrong size");
1505 why = WHY_EXCEPTION;
1506 }
1507 else {
1508 for (; --oparg >= 0; ) {
1509 w = PyTuple_GET_ITEM(v, oparg);
1510 Py_INCREF(w);
1511 PUSH(w);
1512 }
1513 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001515 else if (PyList_Check(v)) {
1516 if (PyList_Size(v) != oparg) {
1517 PyErr_SetString(PyExc_ValueError,
1518 "unpack list of wrong size");
1519 why = WHY_EXCEPTION;
1520 }
1521 else {
1522 for (; --oparg >= 0; ) {
1523 w = PyList_GET_ITEM(v, oparg);
1524 Py_INCREF(w);
1525 PUSH(w);
1526 }
1527 }
1528 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001529 else if (unpack_iterable(v, oparg,
1530 stack_pointer + oparg))
1531 stack_pointer += oparg;
1532 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001533 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001536
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001538 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 v = POP();
1540 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1542 Py_DECREF(v);
1543 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001545
Guido van Rossum374a9221991-04-04 10:40:29 +00001546 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001547 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001549 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1550 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001553
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001554 case STORE_GLOBAL:
1555 w = GETNAMEV(oparg);
1556 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 err = PyDict_SetItem(f->f_globals, w, v);
1558 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001559 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001560
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001561 case DELETE_GLOBAL:
1562 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001564 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001565 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001566 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001567
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 case LOAD_CONST:
1569 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001570 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 PUSH(x);
1572 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001573
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001575 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001576 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001577 PyErr_Format(PyExc_SystemError,
1578 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001579 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001580 break;
1581 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001584 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001588 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001589 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001590 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 break;
1592 }
1593 }
1594 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 PUSH(x);
1597 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001598
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001600 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001601 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001602 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001605 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001606 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001607 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 break;
1609 }
1610 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 PUSH(x);
1613 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001614
Guido van Rossum9bfef441993-03-29 10:43:31 +00001615 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001616 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001617 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001618 format_exc_check_arg(
1619 PyExc_UnboundLocalError,
1620 UNBOUNDLOCAL_ERROR_MSG,
1621 PyTuple_GetItem(co->co_varnames, oparg)
1622 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001623 break;
1624 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001625 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001626 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001627 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001628 break;
1629
1630 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001631 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001632 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001633 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001634
1635 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001636 x = GETLOCAL(oparg);
1637 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001638 format_exc_check_arg(
1639 PyExc_UnboundLocalError,
1640 UNBOUNDLOCAL_ERROR_MSG,
1641 PyTuple_GetItem(co->co_varnames, oparg)
1642 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001643 break;
1644 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001645 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001646 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001647
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001648 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001649 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001650 Py_INCREF(x);
1651 PUSH(x);
1652 break;
1653
1654 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001655 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001656 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001657 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001658 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001659 v = PyTuple_GetItem(co->co_cellvars,
1660 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001661 format_exc_check_arg(
1662 PyExc_UnboundLocalError,
1663 UNBOUNDLOCAL_ERROR_MSG,
1664 v);
1665 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001666 v = PyTuple_GetItem(
1667 co->co_freevars,
1668 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001669 format_exc_check_arg(
1670 PyExc_NameError,
1671 UNBOUNDFREE_ERROR_MSG,
1672 v);
1673 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001674 err = -1;
1675 break;
1676 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001677 PUSH(w);
1678 break;
1679
1680 case STORE_DEREF:
1681 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001682 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001683 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001684 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001685 continue;
1686
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 if (x != NULL) {
1690 for (; --oparg >= 0;) {
1691 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001692 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 }
1694 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001695 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 }
1697 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001698
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 if (x != NULL) {
1702 for (; --oparg >= 0;) {
1703 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001704 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 }
1706 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001707 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 }
1709 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001710
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001712 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001714 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001716
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001718 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 x = PyObject_GetAttr(v, w);
1721 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001723 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001725
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 case COMPARE_OP:
1727 w = POP();
1728 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001729 if (PyInt_Check(v) && PyInt_Check(w)) {
1730 /* INLINE: cmp(int, int) */
1731 register long a, b;
1732 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001733 a = PyInt_AS_LONG(v);
1734 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001735 switch (oparg) {
1736 case LT: res = a < b; break;
1737 case LE: res = a <= b; break;
1738 case EQ: res = a == b; break;
1739 case NE: res = a != b; break;
1740 case GT: res = a > b; break;
1741 case GE: res = a >= b; break;
1742 case IS: res = v == w; break;
1743 case IS_NOT: res = v != w; break;
1744 default: goto slow_compare;
1745 }
1746 x = res ? Py_True : Py_False;
1747 Py_INCREF(x);
1748 }
1749 else {
1750 slow_compare:
1751 x = cmp_outcome(oparg, v, w);
1752 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 Py_DECREF(v);
1754 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001756 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001758
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001760 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001761 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001762 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001763 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001764 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001765 break;
1766 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001767 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001768 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001769 w,
1770 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001771 f->f_locals == NULL ?
1772 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001773 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775 if (w == NULL) {
1776 x = NULL;
1777 break;
1778 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 x = PyEval_CallObject(x, w);
1780 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001781 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001782 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001784
Thomas Wouters52152252000-08-17 22:55:00 +00001785 case IMPORT_STAR:
1786 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001787 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001788 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001789 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001790 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001791 break;
1792 }
Thomas Wouters52152252000-08-17 22:55:00 +00001793 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001795 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001796 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001798
Thomas Wouters52152252000-08-17 22:55:00 +00001799 case IMPORT_FROM:
1800 w = GETNAMEV(oparg);
1801 v = TOP();
1802 x = import_from(v, w);
1803 PUSH(x);
1804 if (x != NULL) continue;
1805 break;
1806
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 case JUMP_FORWARD:
1808 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001809 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001810
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001812 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001813 if (err > 0)
1814 err = 0;
1815 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001817 else
1818 break;
1819 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001820
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001822 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001823 if (err > 0) {
1824 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001826 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001827 else if (err == 0)
1828 ;
1829 else
1830 break;
1831 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001832
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 case JUMP_ABSOLUTE:
1834 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001835 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001836
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001837 case GET_ITER:
1838 /* before: [obj]; after [getiter(obj)] */
1839 v = POP();
1840 x = PyObject_GetIter(v);
1841 Py_DECREF(v);
1842 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001843 PUSH(x);
1844 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001845 }
1846 break;
1847
1848 case FOR_ITER:
1849 /* before: [iter]; after: [iter, iter()] *or* [] */
1850 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001851 x = PyIter_Next(v);
1852 if (x != NULL) {
1853 PUSH(x);
1854 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001855 }
Tim Petersf4848da2001-05-05 00:14:56 +00001856 if (!PyErr_Occurred()) {
1857 /* iterator ended normally */
1858 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001859 Py_DECREF(v);
1860 JUMPBY(oparg);
1861 continue;
1862 }
1863 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001864
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 case FOR_LOOP:
1866 /* for v in s: ...
1867 On entry: stack contains s, i.
1868 On exit: stack contains s, i+1, s[i];
1869 but if loop exhausted:
1870 s, i are popped, and we jump */
1871 w = POP(); /* Loop index */
1872 v = POP(); /* Sequence object */
1873 u = loop_subscript(v, w);
1874 if (u != NULL) {
1875 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001878 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001880 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001881 }
1882 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001883 Py_DECREF(v);
1884 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001885 /* A NULL can mean "s exhausted"
1886 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001887 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001888 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001889 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001890 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001891 continue;
1892 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001893 }
1894 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001895
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 case SETUP_LOOP:
1897 case SETUP_EXCEPT:
1898 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001899 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001900 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001901 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001902
Guido van Rossum374a9221991-04-04 10:40:29 +00001903 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001904#ifdef LLTRACE
1905 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001906 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001907#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001908 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001909 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001910 continue;
1911 /* Trace each line of code reached */
1912 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001913 /* Inline call_trace() for performance: */
1914 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001915 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001916 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1917 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001918 tstate->use_tracing = (tstate->c_tracefunc
1919 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001920 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001921 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001922
1923 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001924 {
1925 int na = oparg & 0xff;
1926 int nk = (oparg>>8) & 0xff;
1927 int n = na + 2 * nk;
1928 PyObject **pfunc = stack_pointer - n - 1;
1929 PyObject *func = *pfunc;
1930 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1931
1932 /* Always dispatch PyCFunction first, because
1933 these are presumed to be the most frequent
1934 callable object.
1935 */
1936 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001937 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001938 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001939 x = do_call(func, &stack_pointer,
1940 na, nk);
1941 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001942 PyObject *callargs;
1943 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001944 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001945 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001946 } else
1947 x = fast_cfunction(func,
1948 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001949 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001950 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001951 && PyMethod_GET_SELF(func) != NULL) {
1952 /* optimize access to bound methods */
1953 PyObject *self = PyMethod_GET_SELF(func);
1954 Py_INCREF(self);
1955 func = PyMethod_GET_FUNCTION(func);
1956 Py_INCREF(func);
1957 Py_DECREF(*pfunc);
1958 *pfunc = self;
1959 na++;
1960 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001961 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001962 Py_INCREF(func);
1963 if (PyFunction_Check(func)) {
1964 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001965 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001966 } else {
1967 x = do_call(func, &stack_pointer,
1968 na, nk);
1969 }
1970 Py_DECREF(func);
1971 }
1972
1973 while (stack_pointer > pfunc) {
1974 w = POP();
1975 Py_DECREF(w);
1976 }
1977 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001978 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 continue;
1980 break;
1981 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001982
Jeremy Hylton76901512000-03-28 23:49:17 +00001983 case CALL_FUNCTION_VAR:
1984 case CALL_FUNCTION_KW:
1985 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001986 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001987 int na = oparg & 0xff;
1988 int nk = (oparg>>8) & 0xff;
1989 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001990 int n = na + 2 * nk;
1991 PyObject **pfunc, *func;
1992 if (flags & CALL_FLAG_VAR)
1993 n++;
1994 if (flags & CALL_FLAG_KW)
1995 n++;
1996 pfunc = stack_pointer - n - 1;
1997 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001998 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001999
Guido van Rossumac7be682001-01-17 15:42:30 +00002000 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002001 && PyMethod_GET_SELF(func) != NULL) {
2002 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002003 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002004 func = PyMethod_GET_FUNCTION(func);
2005 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002006 Py_DECREF(*pfunc);
2007 *pfunc = self;
2008 na++;
2009 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002010 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 Py_INCREF(func);
2012 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002013 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002014
Jeremy Hylton76901512000-03-28 23:49:17 +00002015 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002016 w = POP();
2017 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002018 }
2019 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002020 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002021 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002022 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002023 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002024
Guido van Rossum681d79a1995-07-18 14:51:37 +00002025 case MAKE_FUNCTION:
2026 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002027 x = PyFunction_New(v, f->f_globals);
2028 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002029 /* XXX Maybe this should be a separate opcode? */
2030 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002031 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002032 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002033 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002034 x = NULL;
2035 break;
2036 }
2037 while (--oparg >= 0) {
2038 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002039 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002040 }
2041 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002042 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002043 }
2044 PUSH(x);
2045 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002046
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002047 case MAKE_CLOSURE:
2048 {
2049 int nfree;
2050 v = POP(); /* code object */
2051 x = PyFunction_New(v, f->f_globals);
2052 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2053 Py_DECREF(v);
2054 /* XXX Maybe this should be a separate opcode? */
2055 if (x != NULL && nfree > 0) {
2056 v = PyTuple_New(nfree);
2057 if (v == NULL) {
2058 Py_DECREF(x);
2059 x = NULL;
2060 break;
2061 }
2062 while (--nfree >= 0) {
2063 w = POP();
2064 PyTuple_SET_ITEM(v, nfree, w);
2065 }
2066 err = PyFunction_SetClosure(x, v);
2067 Py_DECREF(v);
2068 }
2069 if (x != NULL && oparg > 0) {
2070 v = PyTuple_New(oparg);
2071 if (v == NULL) {
2072 Py_DECREF(x);
2073 x = NULL;
2074 break;
2075 }
2076 while (--oparg >= 0) {
2077 w = POP();
2078 PyTuple_SET_ITEM(v, oparg, w);
2079 }
2080 err = PyFunction_SetDefaults(x, v);
2081 Py_DECREF(v);
2082 }
2083 PUSH(x);
2084 break;
2085 }
2086
Guido van Rossum8861b741996-07-30 16:49:37 +00002087 case BUILD_SLICE:
2088 if (oparg == 3)
2089 w = POP();
2090 else
2091 w = NULL;
2092 v = POP();
2093 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002094 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002095 Py_DECREF(u);
2096 Py_DECREF(v);
2097 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002098 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002099 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002100 break;
2101
Fred Drakeef8ace32000-08-24 00:32:09 +00002102 case EXTENDED_ARG:
2103 opcode = NEXTOP();
2104 oparg = oparg<<16 | NEXTARG();
2105 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002106
Guido van Rossum374a9221991-04-04 10:40:29 +00002107 default:
2108 fprintf(stderr,
2109 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002110 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002112 why = WHY_EXCEPTION;
2113 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002114
2115#ifdef CASE_TOO_BIG
2116 }
2117#endif
2118
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 } /* switch */
2120
2121 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002122
Guido van Rossum374a9221991-04-04 10:40:29 +00002123 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002124
Guido van Rossum374a9221991-04-04 10:40:29 +00002125 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002126 if (err == 0 && x != NULL) {
2127#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002128 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002130 fprintf(stderr,
2131 "XXX undetected error\n");
2132 else
2133#endif
2134 continue; /* Normal, fast path */
2135 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002136 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002137 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002138 err = 0;
2139 }
2140
Guido van Rossum374a9221991-04-04 10:40:29 +00002141 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002142
Guido van Rossum374a9221991-04-04 10:40:29 +00002143 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002145 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002146 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002147 why = WHY_EXCEPTION;
2148 }
2149 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002150#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002152 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002154 fprintf(stderr,
2155 "XXX undetected error (why=%d)\n",
2156 why);
2157 why = WHY_EXCEPTION;
2158 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002159 }
2160#endif
2161
2162 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002163
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002165 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002167 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002169
Fred Drake9e3ad782001-07-03 23:39:52 +00002170 if (tstate->use_tracing) {
2171 if (tstate->c_tracefunc)
2172 call_exc_trace(tstate->c_tracefunc,
2173 tstate->c_traceobj, f);
2174 if (tstate->c_profilefunc)
2175 call_exc_trace(tstate->c_profilefunc,
2176 tstate->c_profileobj,f);
2177 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002178 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002179
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002181
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 if (why == WHY_RERAISE)
2183 why = WHY_EXCEPTION;
2184
2185 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002186
Tim Peters5ca576e2001-06-18 22:08:13 +00002187 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002188 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002189
2190 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2191 /* For a continue inside a try block,
2192 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002193 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002194 b->b_handler);
2195 why = WHY_NOT;
2196 JUMPTO(PyInt_AS_LONG(retval));
2197 Py_DECREF(retval);
2198 break;
2199 }
2200
Guido van Rossum374a9221991-04-04 10:40:29 +00002201 while (STACK_LEVEL() > b->b_level) {
2202 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 }
2205 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2206 why = WHY_NOT;
2207 JUMPTO(b->b_handler);
2208 break;
2209 }
2210 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002211 (b->b_type == SETUP_EXCEPT &&
2212 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002214 PyObject *exc, *val, *tb;
2215 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002217 val = Py_None;
2218 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002219 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002220 /* Make the raw exception data
2221 available to the handler,
2222 so a program can emulate the
2223 Python main loop. Don't do
2224 this for 'finally'. */
2225 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002226 PyErr_NormalizeException(
2227 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002228 set_exc_info(tstate,
2229 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002230 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002231 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 PUSH(val);
2233 PUSH(exc);
2234 }
2235 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002236 if (why == WHY_RETURN ||
2237 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002239 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002240 PUSH(v);
2241 }
2242 why = WHY_NOT;
2243 JUMPTO(b->b_handler);
2244 break;
2245 }
2246 } /* unwind stack */
2247
2248 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002249
Guido van Rossum374a9221991-04-04 10:40:29 +00002250 if (why != WHY_NOT)
2251 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002252
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002254
Tim Peters5ca576e2001-06-18 22:08:13 +00002255 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002256 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002257
Fred Drake9e3ad782001-07-03 23:39:52 +00002258 if (tstate->use_tracing) {
2259 if (tstate->c_tracefunc
2260 && (why == WHY_RETURN || why == WHY_YIELD)) {
2261 if (call_trace(tstate->c_tracefunc,
2262 tstate->c_traceobj, f,
2263 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002264 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002265 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002266 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002267 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002268 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002269 if (tstate->c_profilefunc
2270 && (why == WHY_RETURN || why == WHY_YIELD)) {
2271 if (call_trace(tstate->c_profilefunc,
2272 tstate->c_profileobj, f,
2273 PyTrace_RETURN, retval)) {
2274 Py_XDECREF(retval);
2275 retval = NULL;
2276 why = WHY_EXCEPTION;
2277 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002278 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002279 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002280
Guido van Rossuma027efa1997-05-05 20:56:21 +00002281 reset_exc_info(tstate);
2282
Tim Peters5ca576e2001-06-18 22:08:13 +00002283 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002284 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002285 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002286
Guido van Rossum96a42c81992-01-12 02:29:51 +00002287 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002288}
2289
Tim Peters6d6c1a32001-08-02 04:15:00 +00002290PyObject *
2291PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002292 PyObject **args, int argcount, PyObject **kws, int kwcount,
2293 PyObject **defs, int defcount, PyObject *closure)
2294{
2295 register PyFrameObject *f;
2296 register PyObject *retval = NULL;
2297 register PyObject **fastlocals, **freevars;
2298 PyThreadState *tstate = PyThreadState_GET();
2299 PyObject *x, *u;
2300
2301 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002302 PyErr_SetString(PyExc_SystemError,
2303 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002304 return NULL;
2305 }
2306
2307 f = PyFrame_New(tstate, /*back*/
2308 co, /*code*/
2309 globals, locals);
2310 if (f == NULL)
2311 return NULL;
2312
2313 fastlocals = f->f_localsplus;
2314 freevars = f->f_localsplus + f->f_nlocals;
2315
2316 if (co->co_argcount > 0 ||
2317 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2318 int i;
2319 int n = argcount;
2320 PyObject *kwdict = NULL;
2321 if (co->co_flags & CO_VARKEYWORDS) {
2322 kwdict = PyDict_New();
2323 if (kwdict == NULL)
2324 goto fail;
2325 i = co->co_argcount;
2326 if (co->co_flags & CO_VARARGS)
2327 i++;
2328 SETLOCAL(i, kwdict);
2329 }
2330 if (argcount > co->co_argcount) {
2331 if (!(co->co_flags & CO_VARARGS)) {
2332 PyErr_Format(PyExc_TypeError,
2333 "%.200s() takes %s %d "
2334 "%sargument%s (%d given)",
2335 PyString_AsString(co->co_name),
2336 defcount ? "at most" : "exactly",
2337 co->co_argcount,
2338 kwcount ? "non-keyword " : "",
2339 co->co_argcount == 1 ? "" : "s",
2340 argcount);
2341 goto fail;
2342 }
2343 n = co->co_argcount;
2344 }
2345 for (i = 0; i < n; i++) {
2346 x = args[i];
2347 Py_INCREF(x);
2348 SETLOCAL(i, x);
2349 }
2350 if (co->co_flags & CO_VARARGS) {
2351 u = PyTuple_New(argcount - n);
2352 if (u == NULL)
2353 goto fail;
2354 SETLOCAL(co->co_argcount, u);
2355 for (i = n; i < argcount; i++) {
2356 x = args[i];
2357 Py_INCREF(x);
2358 PyTuple_SET_ITEM(u, i-n, x);
2359 }
2360 }
2361 for (i = 0; i < kwcount; i++) {
2362 PyObject *keyword = kws[2*i];
2363 PyObject *value = kws[2*i + 1];
2364 int j;
2365 if (keyword == NULL || !PyString_Check(keyword)) {
2366 PyErr_Format(PyExc_TypeError,
2367 "%.200s() keywords must be strings",
2368 PyString_AsString(co->co_name));
2369 goto fail;
2370 }
2371 /* XXX slow -- speed up using dictionary? */
2372 for (j = 0; j < co->co_argcount; j++) {
2373 PyObject *nm = PyTuple_GET_ITEM(
2374 co->co_varnames, j);
2375 int cmp = PyObject_RichCompareBool(
2376 keyword, nm, Py_EQ);
2377 if (cmp > 0)
2378 break;
2379 else if (cmp < 0)
2380 goto fail;
2381 }
2382 /* Check errors from Compare */
2383 if (PyErr_Occurred())
2384 goto fail;
2385 if (j >= co->co_argcount) {
2386 if (kwdict == NULL) {
2387 PyErr_Format(PyExc_TypeError,
2388 "%.200s() got an unexpected "
2389 "keyword argument '%.400s'",
2390 PyString_AsString(co->co_name),
2391 PyString_AsString(keyword));
2392 goto fail;
2393 }
2394 PyDict_SetItem(kwdict, keyword, value);
2395 }
2396 else {
2397 if (GETLOCAL(j) != NULL) {
2398 PyErr_Format(PyExc_TypeError,
2399 "%.200s() got multiple "
2400 "values for keyword "
2401 "argument '%.400s'",
2402 PyString_AsString(co->co_name),
2403 PyString_AsString(keyword));
2404 goto fail;
2405 }
2406 Py_INCREF(value);
2407 SETLOCAL(j, value);
2408 }
2409 }
2410 if (argcount < co->co_argcount) {
2411 int m = co->co_argcount - defcount;
2412 for (i = argcount; i < m; i++) {
2413 if (GETLOCAL(i) == NULL) {
2414 PyErr_Format(PyExc_TypeError,
2415 "%.200s() takes %s %d "
2416 "%sargument%s (%d given)",
2417 PyString_AsString(co->co_name),
2418 ((co->co_flags & CO_VARARGS) ||
2419 defcount) ? "at least"
2420 : "exactly",
2421 m, kwcount ? "non-keyword " : "",
2422 m == 1 ? "" : "s", i);
2423 goto fail;
2424 }
2425 }
2426 if (n > m)
2427 i = n - m;
2428 else
2429 i = 0;
2430 for (; i < defcount; i++) {
2431 if (GETLOCAL(m+i) == NULL) {
2432 PyObject *def = defs[i];
2433 Py_INCREF(def);
2434 SETLOCAL(m+i, def);
2435 }
2436 }
2437 }
2438 }
2439 else {
2440 if (argcount > 0 || kwcount > 0) {
2441 PyErr_Format(PyExc_TypeError,
2442 "%.200s() takes no arguments (%d given)",
2443 PyString_AsString(co->co_name),
2444 argcount + kwcount);
2445 goto fail;
2446 }
2447 }
2448 /* Allocate and initialize storage for cell vars, and copy free
2449 vars into frame. This isn't too efficient right now. */
2450 if (f->f_ncells) {
2451 int i = 0, j = 0, nargs, found;
2452 char *cellname, *argname;
2453 PyObject *c;
2454
2455 nargs = co->co_argcount;
2456 if (co->co_flags & CO_VARARGS)
2457 nargs++;
2458 if (co->co_flags & CO_VARKEYWORDS)
2459 nargs++;
2460
2461 /* Check for cells that shadow args */
2462 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2463 cellname = PyString_AS_STRING(
2464 PyTuple_GET_ITEM(co->co_cellvars, i));
2465 found = 0;
2466 while (j < nargs) {
2467 argname = PyString_AS_STRING(
2468 PyTuple_GET_ITEM(co->co_varnames, j));
2469 if (strcmp(cellname, argname) == 0) {
2470 c = PyCell_New(GETLOCAL(j));
2471 if (c == NULL)
2472 goto fail;
2473 GETLOCAL(f->f_nlocals + i) = c;
2474 found = 1;
2475 break;
2476 }
2477 j++;
2478 }
2479 if (found == 0) {
2480 c = PyCell_New(NULL);
2481 if (c == NULL)
2482 goto fail;
2483 SETLOCAL(f->f_nlocals + i, c);
2484 }
2485 }
2486 /* Initialize any that are left */
2487 while (i < f->f_ncells) {
2488 c = PyCell_New(NULL);
2489 if (c == NULL)
2490 goto fail;
2491 SETLOCAL(f->f_nlocals + i, c);
2492 i++;
2493 }
2494 }
2495 if (f->f_nfreevars) {
2496 int i;
2497 for (i = 0; i < f->f_nfreevars; ++i) {
2498 PyObject *o = PyTuple_GET_ITEM(closure, i);
2499 Py_INCREF(o);
2500 freevars[f->f_ncells + i] = o;
2501 }
2502 }
2503
Fred Drake9e3ad782001-07-03 23:39:52 +00002504 if (tstate->use_tracing) {
2505 if (tstate->c_tracefunc != NULL) {
2506 /* tstate->c_tracefunc, if defined, is a
2507 function that will be called on *every* entry
2508 to a code block. Its return value, if not
2509 None, is a function that will be called at
2510 the start of each executed line of code.
2511 (Actually, the function must return itself
2512 in order to continue tracing.) The trace
2513 functions are called with three arguments:
2514 a pointer to the current frame, a string
2515 indicating why the function is called, and
2516 an argument which depends on the situation.
2517 The global trace function is also called
2518 whenever an exception is detected. */
2519 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2520 f, PyTrace_CALL, Py_None)) {
2521 /* XXX Need way to compute arguments?? */
2522 /* Trace function raised an error */
2523 goto fail;
2524 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002525 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002526 if (tstate->c_profilefunc != NULL) {
2527 /* Similar for c_profilefunc, except it needn't
2528 return itself and isn't called for "line" events */
2529 if (call_trace(tstate->c_profilefunc,
2530 tstate->c_profileobj,
2531 f, PyTrace_CALL, Py_None)) {
2532 /* XXX Need way to compute arguments?? */
2533 /* Profile function raised an error */
2534 goto fail;
2535 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002536 }
2537 }
2538
2539 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002540 /* Don't need to keep the reference to f_back, it will be set
2541 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002542 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002543 f->f_back = NULL;
2544
2545 /* Create a new generator that owns the ready to run frame
2546 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002547 return gen_new(f);
2548 }
2549
2550 retval = eval_frame(f);
2551
2552 fail: /* Jump here from prelude on failure */
2553
2554 Py_DECREF(f);
2555 return retval;
2556}
2557
2558
Guido van Rossuma027efa1997-05-05 20:56:21 +00002559static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002560set_exc_info(PyThreadState *tstate,
2561 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562{
2563 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002564 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002565
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 frame = tstate->frame;
2567 if (frame->f_exc_type == NULL) {
2568 /* This frame didn't catch an exception before */
2569 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 if (tstate->exc_type == NULL) {
2571 Py_INCREF(Py_None);
2572 tstate->exc_type = Py_None;
2573 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002574 tmp_type = frame->f_exc_type;
2575 tmp_value = frame->f_exc_value;
2576 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 Py_XINCREF(tstate->exc_type);
2578 Py_XINCREF(tstate->exc_value);
2579 Py_XINCREF(tstate->exc_traceback);
2580 frame->f_exc_type = tstate->exc_type;
2581 frame->f_exc_value = tstate->exc_value;
2582 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002583 Py_XDECREF(tmp_type);
2584 Py_XDECREF(tmp_value);
2585 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 }
2587 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002588 tmp_type = tstate->exc_type;
2589 tmp_value = tstate->exc_value;
2590 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 Py_XINCREF(type);
2592 Py_XINCREF(value);
2593 Py_XINCREF(tb);
2594 tstate->exc_type = type;
2595 tstate->exc_value = value;
2596 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002597 Py_XDECREF(tmp_type);
2598 Py_XDECREF(tmp_value);
2599 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600 /* For b/w compatibility */
2601 PySys_SetObject("exc_type", type);
2602 PySys_SetObject("exc_value", value);
2603 PySys_SetObject("exc_traceback", tb);
2604}
2605
2606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002608{
2609 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002610 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 frame = tstate->frame;
2612 if (frame->f_exc_type != NULL) {
2613 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002614 tmp_type = tstate->exc_type;
2615 tmp_value = tstate->exc_value;
2616 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 Py_XINCREF(frame->f_exc_type);
2618 Py_XINCREF(frame->f_exc_value);
2619 Py_XINCREF(frame->f_exc_traceback);
2620 tstate->exc_type = frame->f_exc_type;
2621 tstate->exc_value = frame->f_exc_value;
2622 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002623 Py_XDECREF(tmp_type);
2624 Py_XDECREF(tmp_value);
2625 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626 /* For b/w compatibility */
2627 PySys_SetObject("exc_type", frame->f_exc_type);
2628 PySys_SetObject("exc_value", frame->f_exc_value);
2629 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2630 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 tmp_type = frame->f_exc_type;
2632 tmp_value = frame->f_exc_value;
2633 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 frame->f_exc_type = NULL;
2635 frame->f_exc_value = NULL;
2636 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002637 Py_XDECREF(tmp_type);
2638 Py_XDECREF(tmp_value);
2639 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640}
2641
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002642/* Logic for the raise statement (too complicated for inlining).
2643 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002644static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002645do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002646{
Guido van Rossumd295f121998-04-09 21:39:57 +00002647 if (type == NULL) {
2648 /* Reraise */
2649 PyThreadState *tstate = PyThreadState_Get();
2650 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2651 value = tstate->exc_value;
2652 tb = tstate->exc_traceback;
2653 Py_XINCREF(type);
2654 Py_XINCREF(value);
2655 Py_XINCREF(tb);
2656 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002657
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002658 /* We support the following forms of raise:
2659 raise <class>, <classinstance>
2660 raise <class>, <argument tuple>
2661 raise <class>, None
2662 raise <class>, <argument>
2663 raise <classinstance>, None
2664 raise <string>, <object>
2665 raise <string>, None
2666
2667 An omitted second argument is the same as None.
2668
2669 In addition, raise <tuple>, <anything> is the same as
2670 raising the tuple's first item (and it better have one!);
2671 this rule is applied recursively.
2672
2673 Finally, an optional third argument can be supplied, which
2674 gives the traceback to be substituted (useful when
2675 re-raising an exception after examining it). */
2676
2677 /* First, check the traceback argument, replacing None with
2678 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 if (tb == Py_None) {
2680 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681 tb = NULL;
2682 }
2683 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002685 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 goto raise_error;
2687 }
2688
2689 /* Next, replace a missing value with None */
2690 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 value = Py_None;
2692 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 }
2694
2695 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2697 PyObject *tmp = type;
2698 type = PyTuple_GET_ITEM(type, 0);
2699 Py_INCREF(type);
2700 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002701 }
2702
Barry Warsaw4249f541997-08-22 21:26:19 +00002703 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002704 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002705
2706 else if (PyClass_Check(type))
2707 PyErr_NormalizeException(&type, &value, &tb);
2708
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002710 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 if (value != Py_None) {
2712 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 "instance exception may not have a separate value");
2714 goto raise_error;
2715 }
2716 else {
2717 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002719 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2721 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002722 }
2723 }
2724 else {
2725 /* Not something you can raise. You get an exception
2726 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002727 PyErr_Format(PyExc_TypeError,
2728 "exceptions must be strings, classes, or "
2729 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002730 goto raise_error;
2731 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 if (tb == NULL)
2734 return WHY_EXCEPTION;
2735 else
2736 return WHY_RERAISE;
2737 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 Py_XDECREF(value);
2739 Py_XDECREF(type);
2740 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002741 return WHY_EXCEPTION;
2742}
2743
Tim Petersd6d010b2001-06-21 02:49:55 +00002744/* Iterate v argcnt times and store the results on the stack (via decreasing
2745 sp). Return 1 for success, 0 if error. */
2746
Barry Warsawe42b18f1997-08-25 22:13:04 +00002747static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002748unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002749{
Tim Petersd6d010b2001-06-21 02:49:55 +00002750 int i = 0;
2751 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002752 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002753
Tim Petersd6d010b2001-06-21 02:49:55 +00002754 assert(v != NULL);
2755
2756 it = PyObject_GetIter(v);
2757 if (it == NULL)
2758 goto Error;
2759
2760 for (; i < argcnt; i++) {
2761 w = PyIter_Next(it);
2762 if (w == NULL) {
2763 /* Iterator done, via error or exhaustion. */
2764 if (!PyErr_Occurred()) {
2765 PyErr_Format(PyExc_ValueError,
2766 "need more than %d value%s to unpack",
2767 i, i == 1 ? "" : "s");
2768 }
2769 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002770 }
2771 *--sp = w;
2772 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002773
2774 /* We better have exhausted the iterator now. */
2775 w = PyIter_Next(it);
2776 if (w == NULL) {
2777 if (PyErr_Occurred())
2778 goto Error;
2779 Py_DECREF(it);
2780 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002781 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002782 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002783 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002784Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002785 for (; i > 0; i--, sp++)
2786 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002787 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002788 return 0;
2789}
2790
2791
Guido van Rossum96a42c81992-01-12 02:29:51 +00002792#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002796 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 if (PyObject_Print(v, stdout, 0) != 0)
2798 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002799 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002800 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002802#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804static void
Fred Drake5755ce62001-06-27 19:19:46 +00002805call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002806{
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002810 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 value = Py_None;
2812 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002813 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002815 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002817 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002818 }
Fred Drake5755ce62001-06-27 19:19:46 +00002819 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 Py_XDECREF(type);
2825 Py_XDECREF(value);
2826 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002828}
2829
2830static int
Fred Drake5755ce62001-06-27 19:19:46 +00002831call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2832 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002833{
Fred Drake5755ce62001-06-27 19:19:46 +00002834 register PyThreadState *tstate = frame->f_tstate;
2835 int result;
2836 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002837 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002838 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002839 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002840 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002841 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2842 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002843 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002844 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002845}
2846
Fred Drake5755ce62001-06-27 19:19:46 +00002847void
2848PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002849{
Fred Drake5755ce62001-06-27 19:19:46 +00002850 PyThreadState *tstate = PyThreadState_Get();
2851 PyObject *temp = tstate->c_profileobj;
2852 Py_XINCREF(arg);
2853 tstate->c_profilefunc = NULL;
2854 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002855 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002856 Py_XDECREF(temp);
2857 tstate->c_profilefunc = func;
2858 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002859 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002860}
2861
2862void
2863PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2864{
2865 PyThreadState *tstate = PyThreadState_Get();
2866 PyObject *temp = tstate->c_traceobj;
2867 Py_XINCREF(arg);
2868 tstate->c_tracefunc = NULL;
2869 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002870 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002871 Py_XDECREF(temp);
2872 tstate->c_tracefunc = func;
2873 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002874 tstate->use_tracing = ((func != NULL)
2875 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002876}
2877
Guido van Rossumb209a111997-04-29 18:18:01 +00002878PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002879PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002880{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002881 PyThreadState *tstate = PyThreadState_Get();
2882 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002883 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002884 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002885 else
2886 return current_frame->f_builtins;
2887}
2888
Guido van Rossumb209a111997-04-29 18:18:01 +00002889PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002890PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002891{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002892 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002893 if (current_frame == NULL)
2894 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002895 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002896 return current_frame->f_locals;
2897}
2898
Guido van Rossumb209a111997-04-29 18:18:01 +00002899PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002900PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002901{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002902 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002903 if (current_frame == NULL)
2904 return NULL;
2905 else
2906 return current_frame->f_globals;
2907}
2908
Guido van Rossumb209a111997-04-29 18:18:01 +00002909PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002910PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002911{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002912 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002913 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002914}
2915
Guido van Rossum6135a871995-01-09 17:53:26 +00002916int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002917PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002918{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002919 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002920 return current_frame == NULL ? 0 : current_frame->f_restricted;
2921}
2922
Guido van Rossumbe270261997-05-22 22:26:18 +00002923int
Tim Peters5ba58662001-07-16 02:29:45 +00002924PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002925{
2926 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002927 int result = 0;
2928
2929 if (current_frame != NULL) {
2930 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002931 const int compilerflags = codeflags & PyCF_MASK;
2932 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002933 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002934 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002935 }
2936 }
2937 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002938}
2939
2940int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002941Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942{
Guido van Rossumb209a111997-04-29 18:18:01 +00002943 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002944 if (f == NULL)
2945 return 0;
2946 if (!PyFile_SoftSpace(f, 0))
2947 return 0;
2948 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949}
2950
Guido van Rossum3f5da241990-12-20 15:06:42 +00002951
Guido van Rossum681d79a1995-07-18 14:51:37 +00002952/* External interface to call any callable object.
2953 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002954
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002955#undef PyEval_CallObject
2956/* for backward compatibility: export this interface */
2957
Guido van Rossumb209a111997-04-29 18:18:01 +00002958PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002959PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002960{
Guido van Rossumb209a111997-04-29 18:18:01 +00002961 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002962}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002963#define PyEval_CallObject(func,arg) \
2964 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002965
Guido van Rossumb209a111997-04-29 18:18:01 +00002966PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002967PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968{
Jeremy Hylton52820442001-01-03 23:52:36 +00002969 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002970
2971 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002972 arg = PyTuple_New(0);
2973 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002974 PyErr_SetString(PyExc_TypeError,
2975 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002976 return NULL;
2977 }
2978 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002979 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002980
Guido van Rossumb209a111997-04-29 18:18:01 +00002981 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002982 PyErr_SetString(PyExc_TypeError,
2983 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002984 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002985 return NULL;
2986 }
2987
Tim Peters6d6c1a32001-08-02 04:15:00 +00002988 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002989 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002990 return result;
2991}
2992
Tim Peters6d6c1a32001-08-02 04:15:00 +00002993char *
2994PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00002995{
2996 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00002997 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00002998 else if (PyFunction_Check(func))
2999 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3000 else if (PyCFunction_Check(func))
3001 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3002 else if (PyClass_Check(func))
3003 return PyString_AsString(((PyClassObject*)func)->cl_name);
3004 else if (PyInstance_Check(func)) {
3005 return PyString_AsString(
3006 ((PyInstanceObject*)func)->in_class->cl_name);
3007 } else {
3008 return func->ob_type->tp_name;
3009 }
3010}
3011
Tim Peters6d6c1a32001-08-02 04:15:00 +00003012char *
3013PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003014{
3015 if (PyMethod_Check(func))
3016 return "()";
3017 else if (PyFunction_Check(func))
3018 return "()";
3019 else if (PyCFunction_Check(func))
3020 return "()";
3021 else if (PyClass_Check(func))
3022 return " constructor";
3023 else if (PyInstance_Check(func)) {
3024 return " instance";
3025 } else {
3026 return " object";
3027 }
3028}
3029
Jeremy Hylton52820442001-01-03 23:52:36 +00003030#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3031
3032/* The two fast_xxx() functions optimize calls for which no argument
3033 tuple is necessary; the objects are passed directly from the stack.
3034 fast_cfunction() is called for METH_OLDARGS functions.
3035 fast_function() is for functions with no special argument handling.
3036*/
3037
3038static PyObject *
3039fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3040{
3041 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3042 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003043 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003044
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003045 switch (flags) {
3046 case METH_OLDARGS:
3047 if (na == 0)
3048 return (*meth)(self, NULL);
3049 else if (na == 1) {
3050 PyObject *arg = EXT_POP(*pp_stack);
3051 PyObject *result = (*meth)(self, arg);
3052 Py_DECREF(arg);
3053 return result;
3054 } else {
3055 PyObject *args = load_args(pp_stack, na);
3056 PyObject *result = (*meth)(self, args);
3057 Py_DECREF(args);
3058 return result;
3059 }
3060 break;
3061 case METH_NOARGS:
3062 if (na == 0)
3063 return (*meth)(self, NULL);
3064 PyErr_Format(PyExc_TypeError,
3065 "%.200s() takes no arguments (%d given)",
3066 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3067 return NULL;
3068 break;
3069 case METH_O:
3070 if (na == 1) {
3071 PyObject *arg = EXT_POP(*pp_stack);
3072 PyObject *result = (*meth)(self, arg);
3073 Py_DECREF(arg);
3074 return result;
3075 }
3076 PyErr_Format(PyExc_TypeError,
3077 "%.200s() takes exactly one argument (%d given)",
3078 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3079 return NULL;
3080 break;
3081 default:
3082 fprintf(stderr, "%.200s() flags = %d\n",
3083 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3084 PyErr_BadInternalCall();
3085 return NULL;
3086 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003087}
3088
3089static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003090fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003091{
3092 PyObject *co = PyFunction_GET_CODE(func);
3093 PyObject *globals = PyFunction_GET_GLOBALS(func);
3094 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003095 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003096 PyObject **d = NULL;
3097 int nd = 0;
3098
3099 if (argdefs != NULL) {
3100 d = &PyTuple_GET_ITEM(argdefs, 0);
3101 nd = ((PyTupleObject *)argdefs)->ob_size;
3102 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003103 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003104 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003105 (*pp_stack)-2*nk, nk, d, nd,
3106 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003107}
3108
3109static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003110update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3111 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003112{
3113 PyObject *kwdict = NULL;
3114 if (orig_kwdict == NULL)
3115 kwdict = PyDict_New();
3116 else {
3117 kwdict = PyDict_Copy(orig_kwdict);
3118 Py_DECREF(orig_kwdict);
3119 }
3120 if (kwdict == NULL)
3121 return NULL;
3122 while (--nk >= 0) {
3123 int err;
3124 PyObject *value = EXT_POP(*pp_stack);
3125 PyObject *key = EXT_POP(*pp_stack);
3126 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003127 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003128 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003129 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003130 PyEval_GetFuncName(func),
3131 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003132 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003133 Py_DECREF(key);
3134 Py_DECREF(value);
3135 Py_DECREF(kwdict);
3136 return NULL;
3137 }
3138 err = PyDict_SetItem(kwdict, key, value);
3139 Py_DECREF(key);
3140 Py_DECREF(value);
3141 if (err) {
3142 Py_DECREF(kwdict);
3143 return NULL;
3144 }
3145 }
3146 return kwdict;
3147}
3148
3149static PyObject *
3150update_star_args(int nstack, int nstar, PyObject *stararg,
3151 PyObject ***pp_stack)
3152{
3153 PyObject *callargs, *w;
3154
3155 callargs = PyTuple_New(nstack + nstar);
3156 if (callargs == NULL) {
3157 return NULL;
3158 }
3159 if (nstar) {
3160 int i;
3161 for (i = 0; i < nstar; i++) {
3162 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3163 Py_INCREF(a);
3164 PyTuple_SET_ITEM(callargs, nstack + i, a);
3165 }
3166 }
3167 while (--nstack >= 0) {
3168 w = EXT_POP(*pp_stack);
3169 PyTuple_SET_ITEM(callargs, nstack, w);
3170 }
3171 return callargs;
3172}
3173
3174static PyObject *
3175load_args(PyObject ***pp_stack, int na)
3176{
3177 PyObject *args = PyTuple_New(na);
3178 PyObject *w;
3179
3180 if (args == NULL)
3181 return NULL;
3182 while (--na >= 0) {
3183 w = EXT_POP(*pp_stack);
3184 PyTuple_SET_ITEM(args, na, w);
3185 }
3186 return args;
3187}
3188
3189static PyObject *
3190do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3191{
3192 PyObject *callargs = NULL;
3193 PyObject *kwdict = NULL;
3194 PyObject *result = NULL;
3195
3196 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003197 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003198 if (kwdict == NULL)
3199 goto call_fail;
3200 }
3201 callargs = load_args(pp_stack, na);
3202 if (callargs == NULL)
3203 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003204 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003205 call_fail:
3206 Py_XDECREF(callargs);
3207 Py_XDECREF(kwdict);
3208 return result;
3209}
3210
3211static PyObject *
3212ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3213{
3214 int nstar = 0;
3215 PyObject *callargs = NULL;
3216 PyObject *stararg = NULL;
3217 PyObject *kwdict = NULL;
3218 PyObject *result = NULL;
3219
3220 if (flags & CALL_FLAG_KW) {
3221 kwdict = EXT_POP(*pp_stack);
3222 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003223 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003224 "%s%s argument after ** "
3225 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003226 PyEval_GetFuncName(func),
3227 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003228 goto ext_call_fail;
3229 }
3230 }
3231 if (flags & CALL_FLAG_VAR) {
3232 stararg = EXT_POP(*pp_stack);
3233 if (!PyTuple_Check(stararg)) {
3234 PyObject *t = NULL;
3235 t = PySequence_Tuple(stararg);
3236 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003237 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3238 PyErr_Format(PyExc_TypeError,
3239 "%s%s argument after * "
3240 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003241 PyEval_GetFuncName(func),
3242 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003243 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003244 goto ext_call_fail;
3245 }
3246 Py_DECREF(stararg);
3247 stararg = t;
3248 }
3249 nstar = PyTuple_GET_SIZE(stararg);
3250 }
3251 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003252 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003253 if (kwdict == NULL)
3254 goto ext_call_fail;
3255 }
3256 callargs = update_star_args(na, nstar, stararg, pp_stack);
3257 if (callargs == NULL)
3258 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003259 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003260 ext_call_fail:
3261 Py_XDECREF(callargs);
3262 Py_XDECREF(kwdict);
3263 Py_XDECREF(stararg);
3264 return result;
3265}
3266
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003267#define SLICE_ERROR_MSG \
3268 "standard sequence type does not support step size other than one"
3269
Guido van Rossumb209a111997-04-29 18:18:01 +00003270static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003271loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272{
Guido van Rossumb209a111997-04-29 18:18:01 +00003273 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003274 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003275 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003276 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003277 return NULL;
3278 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003279 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003280 v = (*sq->sq_item)(v, i);
3281 if (v)
3282 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003283 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003284 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003285 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286}
3287
Guido van Rossum20c6add2000-05-08 14:06:50 +00003288/* Extract a slice index from a PyInt or PyLong, the index is bound to
3289 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3290 and error. Returns 1 on success.*/
3291
3292int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003293_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294{
3295 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003296 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003297 if (PyInt_Check(v)) {
3298 x = PyInt_AsLong(v);
3299 } else if (PyLong_Check(v)) {
3300 x = PyLong_AsLong(v);
3301 if (x==-1 && PyErr_Occurred()) {
3302 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003303 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003304
Guido van Rossumac7be682001-01-17 15:42:30 +00003305 if (!PyErr_ExceptionMatches(
3306 PyExc_OverflowError)) {
3307 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003308 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003309 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003310 }
3311
Guido van Rossumac7be682001-01-17 15:42:30 +00003312 /* Clear the OverflowError */
3313 PyErr_Clear();
3314
3315 /* It's an overflow error, so we need to
3316 check the sign of the long integer,
3317 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003318 the error. */
3319
3320 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003321 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003322 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003323
3324 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003325 cmp = PyObject_RichCompareBool(v, long_zero,
3326 Py_GT);
3327 Py_DECREF(long_zero);
3328 if (cmp < 0)
3329 return 0;
3330 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003331 x = INT_MAX;
3332 else
3333 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003334 }
3335 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003336 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003337 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003338 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003340 /* Truncate -- very long indices are truncated anyway */
3341 if (x > INT_MAX)
3342 x = INT_MAX;
3343 else if (x < -INT_MAX)
3344 x = 0;
3345 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003347 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348}
3349
Guido van Rossum50d756e2001-08-18 17:43:36 +00003350#undef ISINT
3351#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3352
Guido van Rossumb209a111997-04-29 18:18:01 +00003353static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003354apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003356 PyTypeObject *tp = u->ob_type;
3357 PySequenceMethods *sq = tp->tp_as_sequence;
3358
3359 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3360 int ilow = 0, ihigh = INT_MAX;
3361 if (!_PyEval_SliceIndex(v, &ilow))
3362 return NULL;
3363 if (!_PyEval_SliceIndex(w, &ihigh))
3364 return NULL;
3365 return PySequence_GetSlice(u, ilow, ihigh);
3366 }
3367 else {
3368 PyObject *slice = PySlice_New(v, w, NULL);
3369 if (slice != NULL)
3370 return PyObject_GetItem(u, slice);
3371 else
3372 return NULL;
3373 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003375
3376static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003377assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3378 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003380 PyTypeObject *tp = u->ob_type;
3381 PySequenceMethods *sq = tp->tp_as_sequence;
3382
3383 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3384 int ilow = 0, ihigh = INT_MAX;
3385 if (!_PyEval_SliceIndex(v, &ilow))
3386 return -1;
3387 if (!_PyEval_SliceIndex(w, &ihigh))
3388 return -1;
3389 if (x == NULL)
3390 return PySequence_DelSlice(u, ilow, ihigh);
3391 else
3392 return PySequence_SetSlice(u, ilow, ihigh, x);
3393 }
3394 else {
3395 PyObject *slice = PySlice_New(v, w, NULL);
3396 if (slice != NULL) {
3397 if (x != NULL)
3398 return PyObject_SetItem(u, slice, x);
3399 else
3400 return PyObject_DelItem(u, slice);
3401 }
3402 else
3403 return -1;
3404 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405}
3406
Guido van Rossumb209a111997-04-29 18:18:01 +00003407static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003408cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409{
Guido van Rossumac7be682001-01-17 15:42:30 +00003410 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003412 case IS:
3413 case IS_NOT:
3414 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003415 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003416 res = !res;
3417 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 case IN:
3419 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003420 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003421 if (res < 0)
3422 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003423 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003424 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425 break;
3426 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003427 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 break;
3429 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003430 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003432 v = res ? Py_True : Py_False;
3433 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003434 return v;
3435}
3436
Thomas Wouters52152252000-08-17 22:55:00 +00003437static PyObject *
3438import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003439{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003440 PyObject *x;
3441
3442 x = PyObject_GetAttr(v, name);
3443 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003444 PyErr_Format(PyExc_ImportError,
3445 "cannot import name %.230s",
3446 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003447 }
Thomas Wouters52152252000-08-17 22:55:00 +00003448 return x;
3449}
Guido van Rossumac7be682001-01-17 15:42:30 +00003450
Thomas Wouters52152252000-08-17 22:55:00 +00003451static int
3452import_all_from(PyObject *locals, PyObject *v)
3453{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003454 PyObject *all = PyObject_GetAttrString(v, "__all__");
3455 PyObject *dict, *name, *value;
3456 int skip_leading_underscores = 0;
3457 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003458
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003459 if (all == NULL) {
3460 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3461 return -1; /* Unexpected error */
3462 PyErr_Clear();
3463 dict = PyObject_GetAttrString(v, "__dict__");
3464 if (dict == NULL) {
3465 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3466 return -1;
3467 PyErr_SetString(PyExc_ImportError,
3468 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003469 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003470 }
3471 all = PyMapping_Keys(dict);
3472 Py_DECREF(dict);
3473 if (all == NULL)
3474 return -1;
3475 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003476 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003477
3478 for (pos = 0, err = 0; ; pos++) {
3479 name = PySequence_GetItem(all, pos);
3480 if (name == NULL) {
3481 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3482 err = -1;
3483 else
3484 PyErr_Clear();
3485 break;
3486 }
3487 if (skip_leading_underscores &&
3488 PyString_Check(name) &&
3489 PyString_AS_STRING(name)[0] == '_')
3490 {
3491 Py_DECREF(name);
3492 continue;
3493 }
3494 value = PyObject_GetAttr(v, name);
3495 if (value == NULL)
3496 err = -1;
3497 else
3498 err = PyDict_SetItem(locals, name, value);
3499 Py_DECREF(name);
3500 Py_XDECREF(value);
3501 if (err != 0)
3502 break;
3503 }
3504 Py_DECREF(all);
3505 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003506}
3507
Guido van Rossumb209a111997-04-29 18:18:01 +00003508static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003509build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003510{
Tim Peters6d6c1a32001-08-02 04:15:00 +00003511 PyObject *metaclass = NULL;
3512
3513 if (PyDict_Check(methods))
3514 metaclass = PyDict_GetItemString(methods, "__metaclass__");
3515
3516 if (metaclass == NULL) {
3517 if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0)
3518 metaclass = (PyObject *)
3519 PyTuple_GET_ITEM(bases, 0)->ob_type;
3520 else {
3521 PyObject *g = PyEval_GetGlobals();
3522 if (g != NULL && PyDict_Check(g))
3523 metaclass = PyDict_GetItemString(
3524 g, "__metaclass__");
3525 if (metaclass == NULL)
3526 metaclass = (PyObject *) &PyClass_Type;
Guido van Rossum25831651993-05-19 14:50:45 +00003527 }
3528 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003529 return PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
Guido van Rossum25831651993-05-19 14:50:45 +00003530}
3531
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003532static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003533exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3534 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003535{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003536 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003537 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003538 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003539
Guido van Rossumb209a111997-04-29 18:18:01 +00003540 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3541 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003542 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003543 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003544 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003545 locals = PyTuple_GetItem(prog, 2);
3546 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003547 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003548 if (globals == Py_None) {
3549 globals = PyEval_GetGlobals();
3550 if (locals == Py_None) {
3551 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003552 plain = 1;
3553 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003554 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003555 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003556 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003557 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003558 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003559 !PyCode_Check(prog) &&
3560 !PyFile_Check(prog)) {
3561 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003562 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003563 return -1;
3564 }
Fred Drake661ea262000-10-24 19:57:45 +00003565 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003566 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003567 "exec: arg 2 must be a dictionary or None");
3568 return -1;
3569 }
3570 if (!PyDict_Check(locals)) {
3571 PyErr_SetString(PyExc_TypeError,
3572 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003573 return -1;
3574 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003575 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003576 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003577 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003578 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003579 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003580 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003581 FILE *fp = PyFile_AsFile(prog);
3582 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003583 PyCompilerFlags cf;
3584 cf.cf_flags = 0;
3585 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003586 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3587 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003588 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003589 v = PyRun_File(fp, name, Py_file_input, globals,
3590 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003591 }
3592 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003593 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003594 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003595 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003596 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003597 cf.cf_flags = 0;
3598 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003599 v = PyRun_StringFlags(str, Py_file_input, globals,
3600 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003601 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003602 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003603 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003604 if (plain)
3605 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003607 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003608 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003609 return 0;
3610}
Guido van Rossum24c13741995-02-14 09:42:43 +00003611
Guido van Rossumac7be682001-01-17 15:42:30 +00003612static void
Paul Prescode68140d2000-08-30 20:25:01 +00003613format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3614{
3615 char *obj_str;
3616
3617 if (!obj)
3618 return;
3619
3620 obj_str = PyString_AsString(obj);
3621 if (!obj_str)
3622 return;
3623
3624 PyErr_Format(exc, format_str, obj_str);
3625}
Guido van Rossum950361c1997-01-24 13:49:28 +00003626
3627#ifdef DYNAMIC_EXECUTION_PROFILE
3628
3629PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003630getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003631{
3632 int i;
3633 PyObject *l = PyList_New(256);
3634 if (l == NULL) return NULL;
3635 for (i = 0; i < 256; i++) {
3636 PyObject *x = PyInt_FromLong(a[i]);
3637 if (x == NULL) {
3638 Py_DECREF(l);
3639 return NULL;
3640 }
3641 PyList_SetItem(l, i, x);
3642 }
3643 for (i = 0; i < 256; i++)
3644 a[i] = 0;
3645 return l;
3646}
3647
3648PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003649_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003650{
3651#ifndef DXPAIRS
3652 return getarray(dxp);
3653#else
3654 int i;
3655 PyObject *l = PyList_New(257);
3656 if (l == NULL) return NULL;
3657 for (i = 0; i < 257; i++) {
3658 PyObject *x = getarray(dxpairs[i]);
3659 if (x == NULL) {
3660 Py_DECREF(l);
3661 return NULL;
3662 }
3663 PyList_SetItem(l, i, x);
3664 }
3665 return l;
3666#endif
3667}
3668
3669#endif