blob: c9c9bf146ec7ff04f2bb190dddf6a24b1df17522 [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;
Guido van Rossum87780df2001-08-23 02:58:07 +0000918 if ((i^a) < 0 && (i^b) < 0)
919 goto slow_add;
920 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000921 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000922 else {
923 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000924 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000925 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000926 Py_DECREF(v);
927 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000929 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000931
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 case BINARY_SUBTRACT:
933 w = POP();
934 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000935 if (PyInt_Check(v) && PyInt_Check(w)) {
936 /* INLINE: int - int */
937 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000938 a = PyInt_AS_LONG(v);
939 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000940 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000941 if ((i^a) < 0 && (i^~b) < 0)
942 goto slow_sub;
943 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000944 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000945 else {
946 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000947 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000948 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000949 Py_DECREF(v);
950 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000952 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000954
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 case BINARY_SUBSCR:
956 w = POP();
957 v = POP();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000958 if (v->ob_type == &PyList_Type && PyInt_Check(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000959 /* INLINE: list[int] */
960 long i = PyInt_AsLong(w);
961 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000962 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000963 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000964 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000965 PyErr_SetString(PyExc_IndexError,
966 "list index out of range");
967 x = NULL;
968 }
969 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000970 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000971 Py_INCREF(x);
972 }
973 }
974 else
975 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000976 Py_DECREF(v);
977 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000979 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000981
Guido van Rossum7928cd71991-10-24 14:59:31 +0000982 case BINARY_LSHIFT:
983 w = POP();
984 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000985 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 Py_DECREF(v);
987 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000988 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000989 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000990 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000991
Guido van Rossum7928cd71991-10-24 14:59:31 +0000992 case BINARY_RSHIFT:
993 w = POP();
994 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000995 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000996 Py_DECREF(v);
997 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000998 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000999 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001001
Guido van Rossum7928cd71991-10-24 14:59:31 +00001002 case BINARY_AND:
1003 w = POP();
1004 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001005 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001006 Py_DECREF(v);
1007 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001009 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001010 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001011
Guido van Rossum7928cd71991-10-24 14:59:31 +00001012 case BINARY_XOR:
1013 w = POP();
1014 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001015 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001016 Py_DECREF(v);
1017 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001018 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001019 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001020 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001021
Guido van Rossum7928cd71991-10-24 14:59:31 +00001022 case BINARY_OR:
1023 w = POP();
1024 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001025 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001026 Py_DECREF(v);
1027 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001028 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001029 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001030 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001031
1032 case INPLACE_POWER:
1033 w = POP();
1034 v = POP();
1035 x = PyNumber_InPlacePower(v, w, Py_None);
1036 Py_DECREF(v);
1037 Py_DECREF(w);
1038 PUSH(x);
1039 if (x != NULL) continue;
1040 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001041
Thomas Wouters434d0822000-08-24 20:11:32 +00001042 case INPLACE_MULTIPLY:
1043 w = POP();
1044 v = POP();
1045 x = PyNumber_InPlaceMultiply(v, w);
1046 Py_DECREF(v);
1047 Py_DECREF(w);
1048 PUSH(x);
1049 if (x != NULL) continue;
1050 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001051
Thomas Wouters434d0822000-08-24 20:11:32 +00001052 case INPLACE_DIVIDE:
1053 w = POP();
1054 v = POP();
1055 x = PyNumber_InPlaceDivide(v, w);
1056 Py_DECREF(v);
1057 Py_DECREF(w);
1058 PUSH(x);
1059 if (x != NULL) continue;
1060 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001061
Guido van Rossum4668b002001-08-08 05:00:18 +00001062 case INPLACE_FLOOR_DIVIDE:
1063 w = POP();
1064 v = POP();
1065 x = PyNumber_InPlaceFloorDivide(v, w);
1066 Py_DECREF(v);
1067 Py_DECREF(w);
1068 PUSH(x);
1069 if (x != NULL) continue;
1070 break;
1071
1072 case INPLACE_TRUE_DIVIDE:
1073 w = POP();
1074 v = POP();
1075 x = PyNumber_InPlaceTrueDivide(v, w);
1076 Py_DECREF(v);
1077 Py_DECREF(w);
1078 PUSH(x);
1079 if (x != NULL) continue;
1080 break;
1081
Thomas Wouters434d0822000-08-24 20:11:32 +00001082 case INPLACE_MODULO:
1083 w = POP();
1084 v = POP();
1085 x = PyNumber_InPlaceRemainder(v, w);
1086 Py_DECREF(v);
1087 Py_DECREF(w);
1088 PUSH(x);
1089 if (x != NULL) continue;
1090 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001091
Thomas Wouters434d0822000-08-24 20:11:32 +00001092 case INPLACE_ADD:
1093 w = POP();
1094 v = POP();
1095 if (PyInt_Check(v) && PyInt_Check(w)) {
1096 /* INLINE: int + int */
1097 register long a, b, i;
1098 a = PyInt_AS_LONG(v);
1099 b = PyInt_AS_LONG(w);
1100 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001101 if ((i^a) < 0 && (i^b) < 0)
1102 goto slow_iadd;
1103 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001104 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001105 else {
1106 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001107 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001108 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001109 Py_DECREF(v);
1110 Py_DECREF(w);
1111 PUSH(x);
1112 if (x != NULL) continue;
1113 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001114
Thomas Wouters434d0822000-08-24 20:11:32 +00001115 case INPLACE_SUBTRACT:
1116 w = POP();
1117 v = POP();
1118 if (PyInt_Check(v) && PyInt_Check(w)) {
1119 /* INLINE: int - int */
1120 register long a, b, i;
1121 a = PyInt_AS_LONG(v);
1122 b = PyInt_AS_LONG(w);
1123 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001124 if ((i^a) < 0 && (i^~b) < 0)
1125 goto slow_isub;
1126 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001127 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001128 else {
1129 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001130 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001131 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001132 Py_DECREF(v);
1133 Py_DECREF(w);
1134 PUSH(x);
1135 if (x != NULL) continue;
1136 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001137
Thomas Wouters434d0822000-08-24 20:11:32 +00001138 case INPLACE_LSHIFT:
1139 w = POP();
1140 v = POP();
1141 x = PyNumber_InPlaceLshift(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 PUSH(x);
1145 if (x != NULL) continue;
1146 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001147
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 case INPLACE_RSHIFT:
1149 w = POP();
1150 v = POP();
1151 x = PyNumber_InPlaceRshift(v, w);
1152 Py_DECREF(v);
1153 Py_DECREF(w);
1154 PUSH(x);
1155 if (x != NULL) continue;
1156 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001157
Thomas Wouters434d0822000-08-24 20:11:32 +00001158 case INPLACE_AND:
1159 w = POP();
1160 v = POP();
1161 x = PyNumber_InPlaceAnd(v, w);
1162 Py_DECREF(v);
1163 Py_DECREF(w);
1164 PUSH(x);
1165 if (x != NULL) continue;
1166 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001167
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 case INPLACE_XOR:
1169 w = POP();
1170 v = POP();
1171 x = PyNumber_InPlaceXor(v, w);
1172 Py_DECREF(v);
1173 Py_DECREF(w);
1174 PUSH(x);
1175 if (x != NULL) continue;
1176 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001177
Thomas Wouters434d0822000-08-24 20:11:32 +00001178 case INPLACE_OR:
1179 w = POP();
1180 v = POP();
1181 x = PyNumber_InPlaceOr(v, w);
1182 Py_DECREF(v);
1183 Py_DECREF(w);
1184 PUSH(x);
1185 if (x != NULL) continue;
1186 break;
1187
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 case SLICE+0:
1189 case SLICE+1:
1190 case SLICE+2:
1191 case SLICE+3:
1192 if ((opcode-SLICE) & 2)
1193 w = POP();
1194 else
1195 w = NULL;
1196 if ((opcode-SLICE) & 1)
1197 v = POP();
1198 else
1199 v = NULL;
1200 u = POP();
1201 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001202 Py_DECREF(u);
1203 Py_XDECREF(v);
1204 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001206 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001208
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 case STORE_SLICE+0:
1210 case STORE_SLICE+1:
1211 case STORE_SLICE+2:
1212 case STORE_SLICE+3:
1213 if ((opcode-STORE_SLICE) & 2)
1214 w = POP();
1215 else
1216 w = NULL;
1217 if ((opcode-STORE_SLICE) & 1)
1218 v = POP();
1219 else
1220 v = NULL;
1221 u = POP();
1222 t = POP();
1223 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001224 Py_DECREF(t);
1225 Py_DECREF(u);
1226 Py_XDECREF(v);
1227 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001228 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001230
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 case DELETE_SLICE+0:
1232 case DELETE_SLICE+1:
1233 case DELETE_SLICE+2:
1234 case DELETE_SLICE+3:
1235 if ((opcode-DELETE_SLICE) & 2)
1236 w = POP();
1237 else
1238 w = NULL;
1239 if ((opcode-DELETE_SLICE) & 1)
1240 v = POP();
1241 else
1242 v = NULL;
1243 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001244 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001246 Py_DECREF(u);
1247 Py_XDECREF(v);
1248 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001249 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001251
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 case STORE_SUBSCR:
1253 w = POP();
1254 v = POP();
1255 u = POP();
1256 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001257 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001258 Py_DECREF(u);
1259 Py_DECREF(v);
1260 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001261 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001263
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 case DELETE_SUBSCR:
1265 w = POP();
1266 v = POP();
1267 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001268 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001269 Py_DECREF(v);
1270 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001271 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001273
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 case PRINT_EXPR:
1275 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001276 w = PySys_GetObject("displayhook");
1277 if (w == NULL) {
1278 PyErr_SetString(PyExc_RuntimeError,
1279 "lost sys.displayhook");
1280 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001281 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001282 }
1283 if (err == 0) {
1284 x = Py_BuildValue("(O)", v);
1285 if (x == NULL)
1286 err = -1;
1287 }
1288 if (err == 0) {
1289 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001290 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001291 if (w == NULL)
1292 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001295 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001297
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001298 case PRINT_ITEM_TO:
1299 w = stream = POP();
1300 /* fall through to PRINT_ITEM */
1301
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 case PRINT_ITEM:
1303 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001304 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001305 w = PySys_GetObject("stdout");
1306 if (w == NULL) {
1307 PyErr_SetString(PyExc_RuntimeError,
1308 "lost sys.stdout");
1309 err = -1;
1310 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001311 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001312 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001313 err = PyFile_WriteString(" ", w);
1314 if (err == 0)
1315 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001316 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001317 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001318 char *s = PyString_AsString(v);
1319 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001320 if (len > 0 &&
1321 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001322 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001323 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001325 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001326 Py_XDECREF(stream);
1327 stream = NULL;
1328 if (err == 0)
1329 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001331
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001332 case PRINT_NEWLINE_TO:
1333 w = stream = POP();
1334 /* fall through to PRINT_NEWLINE */
1335
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001337 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001338 w = PySys_GetObject("stdout");
1339 if (w == NULL)
1340 PyErr_SetString(PyExc_RuntimeError,
1341 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001342 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001343 if (w != NULL) {
1344 err = PyFile_WriteString("\n", w);
1345 if (err == 0)
1346 PyFile_SoftSpace(w, 0);
1347 }
1348 Py_XDECREF(stream);
1349 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001351
Thomas Wouters434d0822000-08-24 20:11:32 +00001352
1353#ifdef CASE_TOO_BIG
1354 default: switch (opcode) {
1355#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 case BREAK_LOOP:
1357 why = WHY_BREAK;
1358 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001359
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001360 case CONTINUE_LOOP:
1361 retval = PyInt_FromLong(oparg);
1362 why = WHY_CONTINUE;
1363 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001364
Guido van Rossumf10570b1995-07-07 22:53:21 +00001365 case RAISE_VARARGS:
1366 u = v = w = NULL;
1367 switch (oparg) {
1368 case 3:
1369 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001370 /* Fallthrough */
1371 case 2:
1372 v = POP(); /* value */
1373 /* Fallthrough */
1374 case 1:
1375 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001376 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001377 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001378 break;
1379 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001380 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001381 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001382 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001383 break;
1384 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001386
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001388 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001389 PyErr_SetString(PyExc_SystemError,
1390 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001391 break;
1392 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001393 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001394 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001396
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 case RETURN_VALUE:
1398 retval = POP();
1399 why = WHY_RETURN;
1400 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001401
Tim Peters5ca576e2001-06-18 22:08:13 +00001402 case YIELD_VALUE:
1403 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001404 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001405 f->f_lasti = INSTR_OFFSET();
1406 why = WHY_YIELD;
1407 break;
1408
1409
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001410 case EXEC_STMT:
1411 w = POP();
1412 v = POP();
1413 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001414 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001415 Py_DECREF(u);
1416 Py_DECREF(v);
1417 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001418 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001419
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 case POP_BLOCK:
1421 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 while (STACK_LEVEL() > b->b_level) {
1424 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001425 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 }
1427 }
1428 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001429
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 case END_FINALLY:
1431 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 if (PyInt_Check(v)) {
1433 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001434 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001435 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001436 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 retval = POP();
1438 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001441 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001442 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001444 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001446 else if (v != Py_None) {
1447 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 "'finally' pops bad exception");
1449 why = WHY_EXCEPTION;
1450 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001451 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001453
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001455 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001457 w = POP();
1458 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 Py_DECREF(u);
1461 Py_DECREF(v);
1462 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001464
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 case STORE_NAME:
1466 w = GETNAMEV(oparg);
1467 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001468 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001469 PyErr_Format(PyExc_SystemError,
1470 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001471 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001472 break;
1473 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 err = PyDict_SetItem(x, w, v);
1475 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001477
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001479 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001480 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001481 PyErr_Format(PyExc_SystemError,
1482 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001483 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001484 break;
1485 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001486 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001487 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001488 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001490
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001491 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001493 if (PyTuple_Check(v)) {
1494 if (PyTuple_Size(v) != oparg) {
1495 PyErr_SetString(PyExc_ValueError,
1496 "unpack tuple of wrong size");
1497 why = WHY_EXCEPTION;
1498 }
1499 else {
1500 for (; --oparg >= 0; ) {
1501 w = PyTuple_GET_ITEM(v, oparg);
1502 Py_INCREF(w);
1503 PUSH(w);
1504 }
1505 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001507 else if (PyList_Check(v)) {
1508 if (PyList_Size(v) != oparg) {
1509 PyErr_SetString(PyExc_ValueError,
1510 "unpack list of wrong size");
1511 why = WHY_EXCEPTION;
1512 }
1513 else {
1514 for (; --oparg >= 0; ) {
1515 w = PyList_GET_ITEM(v, oparg);
1516 Py_INCREF(w);
1517 PUSH(w);
1518 }
1519 }
1520 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001521 else if (unpack_iterable(v, oparg,
1522 stack_pointer + oparg))
1523 stack_pointer += oparg;
1524 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001525 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001530 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 v = POP();
1532 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001533 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1534 Py_DECREF(v);
1535 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001537
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001539 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001541 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1542 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001545
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001546 case STORE_GLOBAL:
1547 w = GETNAMEV(oparg);
1548 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 err = PyDict_SetItem(f->f_globals, w, v);
1550 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001551 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001552
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001553 case DELETE_GLOBAL:
1554 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001556 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001557 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001558 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001559
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 case LOAD_CONST:
1561 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 PUSH(x);
1564 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001565
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001567 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001569 PyErr_Format(PyExc_SystemError,
1570 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001571 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 break;
1573 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001580 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001581 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001582 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 break;
1584 }
1585 }
1586 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 PUSH(x);
1589 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001590
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001592 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001597 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001598 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001599 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 break;
1601 }
1602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 PUSH(x);
1605 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606
Guido van Rossum9bfef441993-03-29 10:43:31 +00001607 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001609 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001610 format_exc_check_arg(
1611 PyExc_UnboundLocalError,
1612 UNBOUNDLOCAL_ERROR_MSG,
1613 PyTuple_GetItem(co->co_varnames, oparg)
1614 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001615 break;
1616 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001618 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001619 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001620 break;
1621
1622 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001623 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001624 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001625 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001626
1627 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001628 x = GETLOCAL(oparg);
1629 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001630 format_exc_check_arg(
1631 PyExc_UnboundLocalError,
1632 UNBOUNDLOCAL_ERROR_MSG,
1633 PyTuple_GetItem(co->co_varnames, oparg)
1634 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001635 break;
1636 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001637 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001638 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001639
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001640 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001641 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001642 Py_INCREF(x);
1643 PUSH(x);
1644 break;
1645
1646 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001647 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001648 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001649 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001650 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001651 v = PyTuple_GetItem(co->co_cellvars,
1652 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001653 format_exc_check_arg(
1654 PyExc_UnboundLocalError,
1655 UNBOUNDLOCAL_ERROR_MSG,
1656 v);
1657 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001658 v = PyTuple_GetItem(
1659 co->co_freevars,
1660 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001661 format_exc_check_arg(
1662 PyExc_NameError,
1663 UNBOUNDFREE_ERROR_MSG,
1664 v);
1665 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001666 err = -1;
1667 break;
1668 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001669 PUSH(w);
1670 break;
1671
1672 case STORE_DEREF:
1673 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001674 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001675 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001676 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001677 continue;
1678
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 if (x != NULL) {
1682 for (; --oparg >= 0;) {
1683 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 }
1686 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001687 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 }
1689 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001690
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001692 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 if (x != NULL) {
1694 for (; --oparg >= 0;) {
1695 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001696 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 }
1698 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001699 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001700 }
1701 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001702
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001704 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001706 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001708
Guido van Rossum374a9221991-04-04 10:40:29 +00001709 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001710 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001712 x = PyObject_GetAttr(v, w);
1713 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001715 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001717
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 case COMPARE_OP:
1719 w = POP();
1720 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001721 if (PyInt_Check(v) && PyInt_Check(w)) {
1722 /* INLINE: cmp(int, int) */
1723 register long a, b;
1724 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001725 a = PyInt_AS_LONG(v);
1726 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001727 switch (oparg) {
1728 case LT: res = a < b; break;
1729 case LE: res = a <= b; break;
1730 case EQ: res = a == b; break;
1731 case NE: res = a != b; break;
1732 case GT: res = a > b; break;
1733 case GE: res = a >= b; break;
1734 case IS: res = v == w; break;
1735 case IS_NOT: res = v != w; break;
1736 default: goto slow_compare;
1737 }
1738 x = res ? Py_True : Py_False;
1739 Py_INCREF(x);
1740 }
1741 else {
1742 slow_compare:
1743 x = cmp_outcome(oparg, v, w);
1744 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001745 Py_DECREF(v);
1746 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001748 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001750
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001752 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001754 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001755 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001756 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001757 break;
1758 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001759 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001761 w,
1762 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001763 f->f_locals == NULL ?
1764 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001765 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001766 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001767 if (w == NULL) {
1768 x = NULL;
1769 break;
1770 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001771 x = PyEval_CallObject(x, w);
1772 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001773 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001774 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001776
Thomas Wouters52152252000-08-17 22:55:00 +00001777 case IMPORT_STAR:
1778 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001780 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001781 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001782 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001783 break;
1784 }
Thomas Wouters52152252000-08-17 22:55:00 +00001785 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001786 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001787 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001788 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001790
Thomas Wouters52152252000-08-17 22:55:00 +00001791 case IMPORT_FROM:
1792 w = GETNAMEV(oparg);
1793 v = TOP();
1794 x = import_from(v, w);
1795 PUSH(x);
1796 if (x != NULL) continue;
1797 break;
1798
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 case JUMP_FORWARD:
1800 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001801 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001802
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001804 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001805 if (err > 0)
1806 err = 0;
1807 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001809 else
1810 break;
1811 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001812
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001814 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001815 if (err > 0) {
1816 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001817 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001818 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001819 else if (err == 0)
1820 ;
1821 else
1822 break;
1823 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001824
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 case JUMP_ABSOLUTE:
1826 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001827 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001828
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001829 case GET_ITER:
1830 /* before: [obj]; after [getiter(obj)] */
1831 v = POP();
1832 x = PyObject_GetIter(v);
1833 Py_DECREF(v);
1834 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001835 PUSH(x);
1836 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001837 }
1838 break;
1839
1840 case FOR_ITER:
1841 /* before: [iter]; after: [iter, iter()] *or* [] */
1842 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001843 x = PyIter_Next(v);
1844 if (x != NULL) {
1845 PUSH(x);
1846 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001847 }
Tim Petersf4848da2001-05-05 00:14:56 +00001848 if (!PyErr_Occurred()) {
1849 /* iterator ended normally */
1850 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001851 Py_DECREF(v);
1852 JUMPBY(oparg);
1853 continue;
1854 }
1855 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001856
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 case FOR_LOOP:
1858 /* for v in s: ...
1859 On entry: stack contains s, i.
1860 On exit: stack contains s, i+1, s[i];
1861 but if loop exhausted:
1862 s, i are popped, and we jump */
1863 w = POP(); /* Loop index */
1864 v = POP(); /* Sequence object */
1865 u = loop_subscript(v, w);
1866 if (u != NULL) {
1867 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001870 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001872 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001873 }
1874 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001875 Py_DECREF(v);
1876 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 /* A NULL can mean "s exhausted"
1878 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001879 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001881 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001882 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001883 continue;
1884 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001885 }
1886 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001887
Guido van Rossum374a9221991-04-04 10:40:29 +00001888 case SETUP_LOOP:
1889 case SETUP_EXCEPT:
1890 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001891 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001892 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001893 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001894
Guido van Rossum374a9221991-04-04 10:40:29 +00001895 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001896#ifdef LLTRACE
1897 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001898 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001899#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001900 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001901 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001902 continue;
1903 /* Trace each line of code reached */
1904 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001905 /* Inline call_trace() for performance: */
1906 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001907 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001908 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1909 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001910 tstate->use_tracing = (tstate->c_tracefunc
1911 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001912 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001913 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001914
1915 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001916 {
1917 int na = oparg & 0xff;
1918 int nk = (oparg>>8) & 0xff;
1919 int n = na + 2 * nk;
1920 PyObject **pfunc = stack_pointer - n - 1;
1921 PyObject *func = *pfunc;
1922 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1923
1924 /* Always dispatch PyCFunction first, because
1925 these are presumed to be the most frequent
1926 callable object.
1927 */
1928 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001929 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001930 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001931 x = do_call(func, &stack_pointer,
1932 na, nk);
1933 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001934 PyObject *callargs;
1935 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001936 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001937 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001938 } else
1939 x = fast_cfunction(func,
1940 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001941 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001942 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001943 && PyMethod_GET_SELF(func) != NULL) {
1944 /* optimize access to bound methods */
1945 PyObject *self = PyMethod_GET_SELF(func);
1946 Py_INCREF(self);
1947 func = PyMethod_GET_FUNCTION(func);
1948 Py_INCREF(func);
1949 Py_DECREF(*pfunc);
1950 *pfunc = self;
1951 na++;
1952 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001953 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001954 Py_INCREF(func);
1955 if (PyFunction_Check(func)) {
1956 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001957 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001958 } else {
1959 x = do_call(func, &stack_pointer,
1960 na, nk);
1961 }
1962 Py_DECREF(func);
1963 }
1964
1965 while (stack_pointer > pfunc) {
1966 w = POP();
1967 Py_DECREF(w);
1968 }
1969 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001970 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001971 continue;
1972 break;
1973 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001974
Jeremy Hylton76901512000-03-28 23:49:17 +00001975 case CALL_FUNCTION_VAR:
1976 case CALL_FUNCTION_KW:
1977 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001978 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001979 int na = oparg & 0xff;
1980 int nk = (oparg>>8) & 0xff;
1981 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001982 int n = na + 2 * nk;
1983 PyObject **pfunc, *func;
1984 if (flags & CALL_FLAG_VAR)
1985 n++;
1986 if (flags & CALL_FLAG_KW)
1987 n++;
1988 pfunc = stack_pointer - n - 1;
1989 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001990 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001991
Guido van Rossumac7be682001-01-17 15:42:30 +00001992 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001993 && PyMethod_GET_SELF(func) != NULL) {
1994 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001995 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 func = PyMethod_GET_FUNCTION(func);
1997 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001998 Py_DECREF(*pfunc);
1999 *pfunc = self;
2000 na++;
2001 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002002 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002003 Py_INCREF(func);
2004 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002005 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002006
Jeremy Hylton76901512000-03-28 23:49:17 +00002007 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002008 w = POP();
2009 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002010 }
2011 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002012 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002013 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002014 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002015 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002016
Guido van Rossum681d79a1995-07-18 14:51:37 +00002017 case MAKE_FUNCTION:
2018 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 x = PyFunction_New(v, f->f_globals);
2020 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002021 /* XXX Maybe this should be a separate opcode? */
2022 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002024 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002026 x = NULL;
2027 break;
2028 }
2029 while (--oparg >= 0) {
2030 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002031 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002032 }
2033 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002035 }
2036 PUSH(x);
2037 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002038
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002039 case MAKE_CLOSURE:
2040 {
2041 int nfree;
2042 v = POP(); /* code object */
2043 x = PyFunction_New(v, f->f_globals);
2044 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2045 Py_DECREF(v);
2046 /* XXX Maybe this should be a separate opcode? */
2047 if (x != NULL && nfree > 0) {
2048 v = PyTuple_New(nfree);
2049 if (v == NULL) {
2050 Py_DECREF(x);
2051 x = NULL;
2052 break;
2053 }
2054 while (--nfree >= 0) {
2055 w = POP();
2056 PyTuple_SET_ITEM(v, nfree, w);
2057 }
2058 err = PyFunction_SetClosure(x, v);
2059 Py_DECREF(v);
2060 }
2061 if (x != NULL && oparg > 0) {
2062 v = PyTuple_New(oparg);
2063 if (v == NULL) {
2064 Py_DECREF(x);
2065 x = NULL;
2066 break;
2067 }
2068 while (--oparg >= 0) {
2069 w = POP();
2070 PyTuple_SET_ITEM(v, oparg, w);
2071 }
2072 err = PyFunction_SetDefaults(x, v);
2073 Py_DECREF(v);
2074 }
2075 PUSH(x);
2076 break;
2077 }
2078
Guido van Rossum8861b741996-07-30 16:49:37 +00002079 case BUILD_SLICE:
2080 if (oparg == 3)
2081 w = POP();
2082 else
2083 w = NULL;
2084 v = POP();
2085 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002086 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 Py_DECREF(u);
2088 Py_DECREF(v);
2089 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002090 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002091 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002092 break;
2093
Fred Drakeef8ace32000-08-24 00:32:09 +00002094 case EXTENDED_ARG:
2095 opcode = NEXTOP();
2096 oparg = oparg<<16 | NEXTARG();
2097 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002098
Guido van Rossum374a9221991-04-04 10:40:29 +00002099 default:
2100 fprintf(stderr,
2101 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002102 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002104 why = WHY_EXCEPTION;
2105 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002106
2107#ifdef CASE_TOO_BIG
2108 }
2109#endif
2110
Guido van Rossum374a9221991-04-04 10:40:29 +00002111 } /* switch */
2112
2113 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002114
Guido van Rossum374a9221991-04-04 10:40:29 +00002115 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002116
Guido van Rossum374a9221991-04-04 10:40:29 +00002117 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002118 if (err == 0 && x != NULL) {
2119#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002120 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002121 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002122 fprintf(stderr,
2123 "XXX undetected error\n");
2124 else
2125#endif
2126 continue; /* Normal, fast path */
2127 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002128 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002130 err = 0;
2131 }
2132
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002134
Guido van Rossum374a9221991-04-04 10:40:29 +00002135 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002137 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002138 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 why = WHY_EXCEPTION;
2140 }
2141 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002142#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002143 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002144 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002146 fprintf(stderr,
2147 "XXX undetected error (why=%d)\n",
2148 why);
2149 why = WHY_EXCEPTION;
2150 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 }
2152#endif
2153
2154 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002155
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002157 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002159 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002160 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002161
Fred Drake9e3ad782001-07-03 23:39:52 +00002162 if (tstate->use_tracing) {
2163 if (tstate->c_tracefunc)
2164 call_exc_trace(tstate->c_tracefunc,
2165 tstate->c_traceobj, f);
2166 if (tstate->c_profilefunc)
2167 call_exc_trace(tstate->c_profilefunc,
2168 tstate->c_profileobj,f);
2169 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002170 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002171
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002173
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 if (why == WHY_RERAISE)
2175 why = WHY_EXCEPTION;
2176
2177 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002178
Tim Peters5ca576e2001-06-18 22:08:13 +00002179 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002181
2182 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2183 /* For a continue inside a try block,
2184 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002185 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002186 b->b_handler);
2187 why = WHY_NOT;
2188 JUMPTO(PyInt_AS_LONG(retval));
2189 Py_DECREF(retval);
2190 break;
2191 }
2192
Guido van Rossum374a9221991-04-04 10:40:29 +00002193 while (STACK_LEVEL() > b->b_level) {
2194 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 }
2197 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2198 why = WHY_NOT;
2199 JUMPTO(b->b_handler);
2200 break;
2201 }
2202 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002203 (b->b_type == SETUP_EXCEPT &&
2204 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002205 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 PyObject *exc, *val, *tb;
2207 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 val = Py_None;
2210 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002212 /* Make the raw exception data
2213 available to the handler,
2214 so a program can emulate the
2215 Python main loop. Don't do
2216 this for 'finally'. */
2217 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002218 PyErr_NormalizeException(
2219 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002220 set_exc_info(tstate,
2221 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002222 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002223 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002224 PUSH(val);
2225 PUSH(exc);
2226 }
2227 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002228 if (why == WHY_RETURN ||
2229 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002230 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002231 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 PUSH(v);
2233 }
2234 why = WHY_NOT;
2235 JUMPTO(b->b_handler);
2236 break;
2237 }
2238 } /* unwind stack */
2239
2240 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002241
Guido van Rossum374a9221991-04-04 10:40:29 +00002242 if (why != WHY_NOT)
2243 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002244
Guido van Rossum374a9221991-04-04 10:40:29 +00002245 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002246
Tim Peters5ca576e2001-06-18 22:08:13 +00002247 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002248 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002249
Fred Drake9e3ad782001-07-03 23:39:52 +00002250 if (tstate->use_tracing) {
2251 if (tstate->c_tracefunc
2252 && (why == WHY_RETURN || why == WHY_YIELD)) {
2253 if (call_trace(tstate->c_tracefunc,
2254 tstate->c_traceobj, f,
2255 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002256 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002257 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002258 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002259 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002260 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002261 if (tstate->c_profilefunc
2262 && (why == WHY_RETURN || why == WHY_YIELD)) {
2263 if (call_trace(tstate->c_profilefunc,
2264 tstate->c_profileobj, f,
2265 PyTrace_RETURN, retval)) {
2266 Py_XDECREF(retval);
2267 retval = NULL;
2268 why = WHY_EXCEPTION;
2269 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002270 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002271 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002272
Guido van Rossuma027efa1997-05-05 20:56:21 +00002273 reset_exc_info(tstate);
2274
Tim Peters5ca576e2001-06-18 22:08:13 +00002275 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002276 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002277 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002278
Guido van Rossum96a42c81992-01-12 02:29:51 +00002279 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002280}
2281
Tim Peters6d6c1a32001-08-02 04:15:00 +00002282PyObject *
2283PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002284 PyObject **args, int argcount, PyObject **kws, int kwcount,
2285 PyObject **defs, int defcount, PyObject *closure)
2286{
2287 register PyFrameObject *f;
2288 register PyObject *retval = NULL;
2289 register PyObject **fastlocals, **freevars;
2290 PyThreadState *tstate = PyThreadState_GET();
2291 PyObject *x, *u;
2292
2293 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002294 PyErr_SetString(PyExc_SystemError,
2295 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002296 return NULL;
2297 }
2298
2299 f = PyFrame_New(tstate, /*back*/
2300 co, /*code*/
2301 globals, locals);
2302 if (f == NULL)
2303 return NULL;
2304
2305 fastlocals = f->f_localsplus;
2306 freevars = f->f_localsplus + f->f_nlocals;
2307
2308 if (co->co_argcount > 0 ||
2309 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2310 int i;
2311 int n = argcount;
2312 PyObject *kwdict = NULL;
2313 if (co->co_flags & CO_VARKEYWORDS) {
2314 kwdict = PyDict_New();
2315 if (kwdict == NULL)
2316 goto fail;
2317 i = co->co_argcount;
2318 if (co->co_flags & CO_VARARGS)
2319 i++;
2320 SETLOCAL(i, kwdict);
2321 }
2322 if (argcount > co->co_argcount) {
2323 if (!(co->co_flags & CO_VARARGS)) {
2324 PyErr_Format(PyExc_TypeError,
2325 "%.200s() takes %s %d "
2326 "%sargument%s (%d given)",
2327 PyString_AsString(co->co_name),
2328 defcount ? "at most" : "exactly",
2329 co->co_argcount,
2330 kwcount ? "non-keyword " : "",
2331 co->co_argcount == 1 ? "" : "s",
2332 argcount);
2333 goto fail;
2334 }
2335 n = co->co_argcount;
2336 }
2337 for (i = 0; i < n; i++) {
2338 x = args[i];
2339 Py_INCREF(x);
2340 SETLOCAL(i, x);
2341 }
2342 if (co->co_flags & CO_VARARGS) {
2343 u = PyTuple_New(argcount - n);
2344 if (u == NULL)
2345 goto fail;
2346 SETLOCAL(co->co_argcount, u);
2347 for (i = n; i < argcount; i++) {
2348 x = args[i];
2349 Py_INCREF(x);
2350 PyTuple_SET_ITEM(u, i-n, x);
2351 }
2352 }
2353 for (i = 0; i < kwcount; i++) {
2354 PyObject *keyword = kws[2*i];
2355 PyObject *value = kws[2*i + 1];
2356 int j;
2357 if (keyword == NULL || !PyString_Check(keyword)) {
2358 PyErr_Format(PyExc_TypeError,
2359 "%.200s() keywords must be strings",
2360 PyString_AsString(co->co_name));
2361 goto fail;
2362 }
2363 /* XXX slow -- speed up using dictionary? */
2364 for (j = 0; j < co->co_argcount; j++) {
2365 PyObject *nm = PyTuple_GET_ITEM(
2366 co->co_varnames, j);
2367 int cmp = PyObject_RichCompareBool(
2368 keyword, nm, Py_EQ);
2369 if (cmp > 0)
2370 break;
2371 else if (cmp < 0)
2372 goto fail;
2373 }
2374 /* Check errors from Compare */
2375 if (PyErr_Occurred())
2376 goto fail;
2377 if (j >= co->co_argcount) {
2378 if (kwdict == NULL) {
2379 PyErr_Format(PyExc_TypeError,
2380 "%.200s() got an unexpected "
2381 "keyword argument '%.400s'",
2382 PyString_AsString(co->co_name),
2383 PyString_AsString(keyword));
2384 goto fail;
2385 }
2386 PyDict_SetItem(kwdict, keyword, value);
2387 }
2388 else {
2389 if (GETLOCAL(j) != NULL) {
2390 PyErr_Format(PyExc_TypeError,
2391 "%.200s() got multiple "
2392 "values for keyword "
2393 "argument '%.400s'",
2394 PyString_AsString(co->co_name),
2395 PyString_AsString(keyword));
2396 goto fail;
2397 }
2398 Py_INCREF(value);
2399 SETLOCAL(j, value);
2400 }
2401 }
2402 if (argcount < co->co_argcount) {
2403 int m = co->co_argcount - defcount;
2404 for (i = argcount; i < m; i++) {
2405 if (GETLOCAL(i) == NULL) {
2406 PyErr_Format(PyExc_TypeError,
2407 "%.200s() takes %s %d "
2408 "%sargument%s (%d given)",
2409 PyString_AsString(co->co_name),
2410 ((co->co_flags & CO_VARARGS) ||
2411 defcount) ? "at least"
2412 : "exactly",
2413 m, kwcount ? "non-keyword " : "",
2414 m == 1 ? "" : "s", i);
2415 goto fail;
2416 }
2417 }
2418 if (n > m)
2419 i = n - m;
2420 else
2421 i = 0;
2422 for (; i < defcount; i++) {
2423 if (GETLOCAL(m+i) == NULL) {
2424 PyObject *def = defs[i];
2425 Py_INCREF(def);
2426 SETLOCAL(m+i, def);
2427 }
2428 }
2429 }
2430 }
2431 else {
2432 if (argcount > 0 || kwcount > 0) {
2433 PyErr_Format(PyExc_TypeError,
2434 "%.200s() takes no arguments (%d given)",
2435 PyString_AsString(co->co_name),
2436 argcount + kwcount);
2437 goto fail;
2438 }
2439 }
2440 /* Allocate and initialize storage for cell vars, and copy free
2441 vars into frame. This isn't too efficient right now. */
2442 if (f->f_ncells) {
2443 int i = 0, j = 0, nargs, found;
2444 char *cellname, *argname;
2445 PyObject *c;
2446
2447 nargs = co->co_argcount;
2448 if (co->co_flags & CO_VARARGS)
2449 nargs++;
2450 if (co->co_flags & CO_VARKEYWORDS)
2451 nargs++;
2452
2453 /* Check for cells that shadow args */
2454 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2455 cellname = PyString_AS_STRING(
2456 PyTuple_GET_ITEM(co->co_cellvars, i));
2457 found = 0;
2458 while (j < nargs) {
2459 argname = PyString_AS_STRING(
2460 PyTuple_GET_ITEM(co->co_varnames, j));
2461 if (strcmp(cellname, argname) == 0) {
2462 c = PyCell_New(GETLOCAL(j));
2463 if (c == NULL)
2464 goto fail;
2465 GETLOCAL(f->f_nlocals + i) = c;
2466 found = 1;
2467 break;
2468 }
2469 j++;
2470 }
2471 if (found == 0) {
2472 c = PyCell_New(NULL);
2473 if (c == NULL)
2474 goto fail;
2475 SETLOCAL(f->f_nlocals + i, c);
2476 }
2477 }
2478 /* Initialize any that are left */
2479 while (i < f->f_ncells) {
2480 c = PyCell_New(NULL);
2481 if (c == NULL)
2482 goto fail;
2483 SETLOCAL(f->f_nlocals + i, c);
2484 i++;
2485 }
2486 }
2487 if (f->f_nfreevars) {
2488 int i;
2489 for (i = 0; i < f->f_nfreevars; ++i) {
2490 PyObject *o = PyTuple_GET_ITEM(closure, i);
2491 Py_INCREF(o);
2492 freevars[f->f_ncells + i] = o;
2493 }
2494 }
2495
Fred Drake9e3ad782001-07-03 23:39:52 +00002496 if (tstate->use_tracing) {
2497 if (tstate->c_tracefunc != NULL) {
2498 /* tstate->c_tracefunc, if defined, is a
2499 function that will be called on *every* entry
2500 to a code block. Its return value, if not
2501 None, is a function that will be called at
2502 the start of each executed line of code.
2503 (Actually, the function must return itself
2504 in order to continue tracing.) The trace
2505 functions are called with three arguments:
2506 a pointer to the current frame, a string
2507 indicating why the function is called, and
2508 an argument which depends on the situation.
2509 The global trace function is also called
2510 whenever an exception is detected. */
2511 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2512 f, PyTrace_CALL, Py_None)) {
2513 /* XXX Need way to compute arguments?? */
2514 /* Trace function raised an error */
2515 goto fail;
2516 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002517 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002518 if (tstate->c_profilefunc != NULL) {
2519 /* Similar for c_profilefunc, except it needn't
2520 return itself and isn't called for "line" events */
2521 if (call_trace(tstate->c_profilefunc,
2522 tstate->c_profileobj,
2523 f, PyTrace_CALL, Py_None)) {
2524 /* XXX Need way to compute arguments?? */
2525 /* Profile function raised an error */
2526 goto fail;
2527 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002528 }
2529 }
2530
2531 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002532 /* Don't need to keep the reference to f_back, it will be set
2533 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002534 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002535 f->f_back = NULL;
2536
2537 /* Create a new generator that owns the ready to run frame
2538 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002539 return gen_new(f);
2540 }
2541
2542 retval = eval_frame(f);
2543
2544 fail: /* Jump here from prelude on failure */
2545
2546 Py_DECREF(f);
2547 return retval;
2548}
2549
2550
Guido van Rossuma027efa1997-05-05 20:56:21 +00002551static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002552set_exc_info(PyThreadState *tstate,
2553 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002554{
2555 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002556 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002557
Guido van Rossuma027efa1997-05-05 20:56:21 +00002558 frame = tstate->frame;
2559 if (frame->f_exc_type == NULL) {
2560 /* This frame didn't catch an exception before */
2561 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562 if (tstate->exc_type == NULL) {
2563 Py_INCREF(Py_None);
2564 tstate->exc_type = Py_None;
2565 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002566 tmp_type = frame->f_exc_type;
2567 tmp_value = frame->f_exc_value;
2568 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002569 Py_XINCREF(tstate->exc_type);
2570 Py_XINCREF(tstate->exc_value);
2571 Py_XINCREF(tstate->exc_traceback);
2572 frame->f_exc_type = tstate->exc_type;
2573 frame->f_exc_value = tstate->exc_value;
2574 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002575 Py_XDECREF(tmp_type);
2576 Py_XDECREF(tmp_value);
2577 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578 }
2579 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002580 tmp_type = tstate->exc_type;
2581 tmp_value = tstate->exc_value;
2582 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002583 Py_XINCREF(type);
2584 Py_XINCREF(value);
2585 Py_XINCREF(tb);
2586 tstate->exc_type = type;
2587 tstate->exc_value = value;
2588 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002589 Py_XDECREF(tmp_type);
2590 Py_XDECREF(tmp_value);
2591 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002592 /* For b/w compatibility */
2593 PySys_SetObject("exc_type", type);
2594 PySys_SetObject("exc_value", value);
2595 PySys_SetObject("exc_traceback", tb);
2596}
2597
2598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002599reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600{
2601 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002602 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002603 frame = tstate->frame;
2604 if (frame->f_exc_type != NULL) {
2605 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002606 tmp_type = tstate->exc_type;
2607 tmp_value = tstate->exc_value;
2608 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002609 Py_XINCREF(frame->f_exc_type);
2610 Py_XINCREF(frame->f_exc_value);
2611 Py_XINCREF(frame->f_exc_traceback);
2612 tstate->exc_type = frame->f_exc_type;
2613 tstate->exc_value = frame->f_exc_value;
2614 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002615 Py_XDECREF(tmp_type);
2616 Py_XDECREF(tmp_value);
2617 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002618 /* For b/w compatibility */
2619 PySys_SetObject("exc_type", frame->f_exc_type);
2620 PySys_SetObject("exc_value", frame->f_exc_value);
2621 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2622 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002623 tmp_type = frame->f_exc_type;
2624 tmp_value = frame->f_exc_value;
2625 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626 frame->f_exc_type = NULL;
2627 frame->f_exc_value = NULL;
2628 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002629 Py_XDECREF(tmp_type);
2630 Py_XDECREF(tmp_value);
2631 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002632}
2633
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002634/* Logic for the raise statement (too complicated for inlining).
2635 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002636static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002637do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002638{
Guido van Rossumd295f121998-04-09 21:39:57 +00002639 if (type == NULL) {
2640 /* Reraise */
2641 PyThreadState *tstate = PyThreadState_Get();
2642 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2643 value = tstate->exc_value;
2644 tb = tstate->exc_traceback;
2645 Py_XINCREF(type);
2646 Py_XINCREF(value);
2647 Py_XINCREF(tb);
2648 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002649
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002650 /* We support the following forms of raise:
2651 raise <class>, <classinstance>
2652 raise <class>, <argument tuple>
2653 raise <class>, None
2654 raise <class>, <argument>
2655 raise <classinstance>, None
2656 raise <string>, <object>
2657 raise <string>, None
2658
2659 An omitted second argument is the same as None.
2660
2661 In addition, raise <tuple>, <anything> is the same as
2662 raising the tuple's first item (and it better have one!);
2663 this rule is applied recursively.
2664
2665 Finally, an optional third argument can be supplied, which
2666 gives the traceback to be substituted (useful when
2667 re-raising an exception after examining it). */
2668
2669 /* First, check the traceback argument, replacing None with
2670 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 if (tb == Py_None) {
2672 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002673 tb = NULL;
2674 }
2675 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002677 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002678 goto raise_error;
2679 }
2680
2681 /* Next, replace a missing value with None */
2682 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 value = Py_None;
2684 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002685 }
2686
2687 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002688 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2689 PyObject *tmp = type;
2690 type = PyTuple_GET_ITEM(type, 0);
2691 Py_INCREF(type);
2692 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 }
2694
Barry Warsaw4249f541997-08-22 21:26:19 +00002695 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002696 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002697
2698 else if (PyClass_Check(type))
2699 PyErr_NormalizeException(&type, &value, &tb);
2700
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002702 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 if (value != Py_None) {
2704 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002705 "instance exception may not have a separate value");
2706 goto raise_error;
2707 }
2708 else {
2709 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002711 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2713 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002714 }
2715 }
2716 else {
2717 /* Not something you can raise. You get an exception
2718 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002719 PyErr_Format(PyExc_TypeError,
2720 "exceptions must be strings, classes, or "
2721 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002722 goto raise_error;
2723 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002725 if (tb == NULL)
2726 return WHY_EXCEPTION;
2727 else
2728 return WHY_RERAISE;
2729 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002730 Py_XDECREF(value);
2731 Py_XDECREF(type);
2732 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 return WHY_EXCEPTION;
2734}
2735
Tim Petersd6d010b2001-06-21 02:49:55 +00002736/* Iterate v argcnt times and store the results on the stack (via decreasing
2737 sp). Return 1 for success, 0 if error. */
2738
Barry Warsawe42b18f1997-08-25 22:13:04 +00002739static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002740unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002741{
Tim Petersd6d010b2001-06-21 02:49:55 +00002742 int i = 0;
2743 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002744 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002745
Tim Petersd6d010b2001-06-21 02:49:55 +00002746 assert(v != NULL);
2747
2748 it = PyObject_GetIter(v);
2749 if (it == NULL)
2750 goto Error;
2751
2752 for (; i < argcnt; i++) {
2753 w = PyIter_Next(it);
2754 if (w == NULL) {
2755 /* Iterator done, via error or exhaustion. */
2756 if (!PyErr_Occurred()) {
2757 PyErr_Format(PyExc_ValueError,
2758 "need more than %d value%s to unpack",
2759 i, i == 1 ? "" : "s");
2760 }
2761 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002762 }
2763 *--sp = w;
2764 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002765
2766 /* We better have exhausted the iterator now. */
2767 w = PyIter_Next(it);
2768 if (w == NULL) {
2769 if (PyErr_Occurred())
2770 goto Error;
2771 Py_DECREF(it);
2772 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002773 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002774 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002775 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002776Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002777 for (; i > 0; i--, sp++)
2778 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002779 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002780 return 0;
2781}
2782
2783
Guido van Rossum96a42c81992-01-12 02:29:51 +00002784#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002785static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002786prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002787{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002788 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 if (PyObject_Print(v, stdout, 0) != 0)
2790 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002791 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002792 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002794#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002796static void
Fred Drake5755ce62001-06-27 19:19:46 +00002797call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002798{
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002800 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002802 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 value = Py_None;
2804 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002805 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002807 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002809 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002810 }
Fred Drake5755ce62001-06-27 19:19:46 +00002811 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002813 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002815 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 Py_XDECREF(type);
2817 Py_XDECREF(value);
2818 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002819 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002820}
2821
2822static int
Fred Drake5755ce62001-06-27 19:19:46 +00002823call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2824 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002825{
Fred Drake5755ce62001-06-27 19:19:46 +00002826 register PyThreadState *tstate = frame->f_tstate;
2827 int result;
2828 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002829 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002830 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002831 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002832 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002833 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2834 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002835 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002836 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002837}
2838
Fred Drake5755ce62001-06-27 19:19:46 +00002839void
2840PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002841{
Fred Drake5755ce62001-06-27 19:19:46 +00002842 PyThreadState *tstate = PyThreadState_Get();
2843 PyObject *temp = tstate->c_profileobj;
2844 Py_XINCREF(arg);
2845 tstate->c_profilefunc = NULL;
2846 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002847 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002848 Py_XDECREF(temp);
2849 tstate->c_profilefunc = func;
2850 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002851 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002852}
2853
2854void
2855PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2856{
2857 PyThreadState *tstate = PyThreadState_Get();
2858 PyObject *temp = tstate->c_traceobj;
2859 Py_XINCREF(arg);
2860 tstate->c_tracefunc = NULL;
2861 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002862 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002863 Py_XDECREF(temp);
2864 tstate->c_tracefunc = func;
2865 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002866 tstate->use_tracing = ((func != NULL)
2867 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002868}
2869
Guido van Rossumb209a111997-04-29 18:18:01 +00002870PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002871PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002872{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002873 PyThreadState *tstate = PyThreadState_Get();
2874 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002875 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002876 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002877 else
2878 return current_frame->f_builtins;
2879}
2880
Guido van Rossumb209a111997-04-29 18:18:01 +00002881PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002882PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002883{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002884 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002885 if (current_frame == NULL)
2886 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002887 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002888 return current_frame->f_locals;
2889}
2890
Guido van Rossumb209a111997-04-29 18:18:01 +00002891PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002892PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002893{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002894 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002895 if (current_frame == NULL)
2896 return NULL;
2897 else
2898 return current_frame->f_globals;
2899}
2900
Guido van Rossumb209a111997-04-29 18:18:01 +00002901PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002902PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002903{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002904 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002905 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002906}
2907
Guido van Rossum6135a871995-01-09 17:53:26 +00002908int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002909PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002910{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002911 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002912 return current_frame == NULL ? 0 : current_frame->f_restricted;
2913}
2914
Guido van Rossumbe270261997-05-22 22:26:18 +00002915int
Tim Peters5ba58662001-07-16 02:29:45 +00002916PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002917{
2918 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002919 int result = 0;
2920
2921 if (current_frame != NULL) {
2922 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002923 const int compilerflags = codeflags & PyCF_MASK;
2924 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002925 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002926 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002927 }
2928 }
2929 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002930}
2931
2932int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002933Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934{
Guido van Rossumb209a111997-04-29 18:18:01 +00002935 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002936 if (f == NULL)
2937 return 0;
2938 if (!PyFile_SoftSpace(f, 0))
2939 return 0;
2940 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941}
2942
Guido van Rossum3f5da241990-12-20 15:06:42 +00002943
Guido van Rossum681d79a1995-07-18 14:51:37 +00002944/* External interface to call any callable object.
2945 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002946
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002947#undef PyEval_CallObject
2948/* for backward compatibility: export this interface */
2949
Guido van Rossumb209a111997-04-29 18:18:01 +00002950PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002951PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002952{
Guido van Rossumb209a111997-04-29 18:18:01 +00002953 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002954}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002955#define PyEval_CallObject(func,arg) \
2956 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002957
Guido van Rossumb209a111997-04-29 18:18:01 +00002958PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002959PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002960{
Jeremy Hylton52820442001-01-03 23:52:36 +00002961 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002962
2963 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002964 arg = PyTuple_New(0);
2965 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002966 PyErr_SetString(PyExc_TypeError,
2967 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968 return NULL;
2969 }
2970 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002971 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002972
Guido van Rossumb209a111997-04-29 18:18:01 +00002973 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002974 PyErr_SetString(PyExc_TypeError,
2975 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002976 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002977 return NULL;
2978 }
2979
Tim Peters6d6c1a32001-08-02 04:15:00 +00002980 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002981 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002982 return result;
2983}
2984
Tim Peters6d6c1a32001-08-02 04:15:00 +00002985char *
2986PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00002987{
2988 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00002989 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00002990 else if (PyFunction_Check(func))
2991 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2992 else if (PyCFunction_Check(func))
2993 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2994 else if (PyClass_Check(func))
2995 return PyString_AsString(((PyClassObject*)func)->cl_name);
2996 else if (PyInstance_Check(func)) {
2997 return PyString_AsString(
2998 ((PyInstanceObject*)func)->in_class->cl_name);
2999 } else {
3000 return func->ob_type->tp_name;
3001 }
3002}
3003
Tim Peters6d6c1a32001-08-02 04:15:00 +00003004char *
3005PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003006{
3007 if (PyMethod_Check(func))
3008 return "()";
3009 else if (PyFunction_Check(func))
3010 return "()";
3011 else if (PyCFunction_Check(func))
3012 return "()";
3013 else if (PyClass_Check(func))
3014 return " constructor";
3015 else if (PyInstance_Check(func)) {
3016 return " instance";
3017 } else {
3018 return " object";
3019 }
3020}
3021
Jeremy Hylton52820442001-01-03 23:52:36 +00003022#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3023
3024/* The two fast_xxx() functions optimize calls for which no argument
3025 tuple is necessary; the objects are passed directly from the stack.
3026 fast_cfunction() is called for METH_OLDARGS functions.
3027 fast_function() is for functions with no special argument handling.
3028*/
3029
3030static PyObject *
3031fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3032{
3033 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3034 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003035 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003036
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003037 switch (flags) {
3038 case METH_OLDARGS:
3039 if (na == 0)
3040 return (*meth)(self, NULL);
3041 else if (na == 1) {
3042 PyObject *arg = EXT_POP(*pp_stack);
3043 PyObject *result = (*meth)(self, arg);
3044 Py_DECREF(arg);
3045 return result;
3046 } else {
3047 PyObject *args = load_args(pp_stack, na);
3048 PyObject *result = (*meth)(self, args);
3049 Py_DECREF(args);
3050 return result;
3051 }
3052 break;
3053 case METH_NOARGS:
3054 if (na == 0)
3055 return (*meth)(self, NULL);
3056 PyErr_Format(PyExc_TypeError,
3057 "%.200s() takes no arguments (%d given)",
3058 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3059 return NULL;
3060 break;
3061 case METH_O:
3062 if (na == 1) {
3063 PyObject *arg = EXT_POP(*pp_stack);
3064 PyObject *result = (*meth)(self, arg);
3065 Py_DECREF(arg);
3066 return result;
3067 }
3068 PyErr_Format(PyExc_TypeError,
3069 "%.200s() takes exactly one argument (%d given)",
3070 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3071 return NULL;
3072 break;
3073 default:
3074 fprintf(stderr, "%.200s() flags = %d\n",
3075 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3076 PyErr_BadInternalCall();
3077 return NULL;
3078 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003079}
3080
3081static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003082fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003083{
3084 PyObject *co = PyFunction_GET_CODE(func);
3085 PyObject *globals = PyFunction_GET_GLOBALS(func);
3086 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003087 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003088 PyObject **d = NULL;
3089 int nd = 0;
3090
3091 if (argdefs != NULL) {
3092 d = &PyTuple_GET_ITEM(argdefs, 0);
3093 nd = ((PyTupleObject *)argdefs)->ob_size;
3094 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003095 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003096 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003097 (*pp_stack)-2*nk, nk, d, nd,
3098 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003099}
3100
3101static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003102update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3103 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003104{
3105 PyObject *kwdict = NULL;
3106 if (orig_kwdict == NULL)
3107 kwdict = PyDict_New();
3108 else {
3109 kwdict = PyDict_Copy(orig_kwdict);
3110 Py_DECREF(orig_kwdict);
3111 }
3112 if (kwdict == NULL)
3113 return NULL;
3114 while (--nk >= 0) {
3115 int err;
3116 PyObject *value = EXT_POP(*pp_stack);
3117 PyObject *key = EXT_POP(*pp_stack);
3118 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003119 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003120 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003121 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003122 PyEval_GetFuncName(func),
3123 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003124 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003125 Py_DECREF(key);
3126 Py_DECREF(value);
3127 Py_DECREF(kwdict);
3128 return NULL;
3129 }
3130 err = PyDict_SetItem(kwdict, key, value);
3131 Py_DECREF(key);
3132 Py_DECREF(value);
3133 if (err) {
3134 Py_DECREF(kwdict);
3135 return NULL;
3136 }
3137 }
3138 return kwdict;
3139}
3140
3141static PyObject *
3142update_star_args(int nstack, int nstar, PyObject *stararg,
3143 PyObject ***pp_stack)
3144{
3145 PyObject *callargs, *w;
3146
3147 callargs = PyTuple_New(nstack + nstar);
3148 if (callargs == NULL) {
3149 return NULL;
3150 }
3151 if (nstar) {
3152 int i;
3153 for (i = 0; i < nstar; i++) {
3154 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3155 Py_INCREF(a);
3156 PyTuple_SET_ITEM(callargs, nstack + i, a);
3157 }
3158 }
3159 while (--nstack >= 0) {
3160 w = EXT_POP(*pp_stack);
3161 PyTuple_SET_ITEM(callargs, nstack, w);
3162 }
3163 return callargs;
3164}
3165
3166static PyObject *
3167load_args(PyObject ***pp_stack, int na)
3168{
3169 PyObject *args = PyTuple_New(na);
3170 PyObject *w;
3171
3172 if (args == NULL)
3173 return NULL;
3174 while (--na >= 0) {
3175 w = EXT_POP(*pp_stack);
3176 PyTuple_SET_ITEM(args, na, w);
3177 }
3178 return args;
3179}
3180
3181static PyObject *
3182do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3183{
3184 PyObject *callargs = NULL;
3185 PyObject *kwdict = NULL;
3186 PyObject *result = NULL;
3187
3188 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003189 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003190 if (kwdict == NULL)
3191 goto call_fail;
3192 }
3193 callargs = load_args(pp_stack, na);
3194 if (callargs == NULL)
3195 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003196 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003197 call_fail:
3198 Py_XDECREF(callargs);
3199 Py_XDECREF(kwdict);
3200 return result;
3201}
3202
3203static PyObject *
3204ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3205{
3206 int nstar = 0;
3207 PyObject *callargs = NULL;
3208 PyObject *stararg = NULL;
3209 PyObject *kwdict = NULL;
3210 PyObject *result = NULL;
3211
3212 if (flags & CALL_FLAG_KW) {
3213 kwdict = EXT_POP(*pp_stack);
3214 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003215 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003216 "%s%s argument after ** "
3217 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003218 PyEval_GetFuncName(func),
3219 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003220 goto ext_call_fail;
3221 }
3222 }
3223 if (flags & CALL_FLAG_VAR) {
3224 stararg = EXT_POP(*pp_stack);
3225 if (!PyTuple_Check(stararg)) {
3226 PyObject *t = NULL;
3227 t = PySequence_Tuple(stararg);
3228 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003229 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3230 PyErr_Format(PyExc_TypeError,
3231 "%s%s argument after * "
3232 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003233 PyEval_GetFuncName(func),
3234 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003235 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003236 goto ext_call_fail;
3237 }
3238 Py_DECREF(stararg);
3239 stararg = t;
3240 }
3241 nstar = PyTuple_GET_SIZE(stararg);
3242 }
3243 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003244 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003245 if (kwdict == NULL)
3246 goto ext_call_fail;
3247 }
3248 callargs = update_star_args(na, nstar, stararg, pp_stack);
3249 if (callargs == NULL)
3250 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003251 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003252 ext_call_fail:
3253 Py_XDECREF(callargs);
3254 Py_XDECREF(kwdict);
3255 Py_XDECREF(stararg);
3256 return result;
3257}
3258
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003259#define SLICE_ERROR_MSG \
3260 "standard sequence type does not support step size other than one"
3261
Guido van Rossumb209a111997-04-29 18:18:01 +00003262static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003263loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264{
Guido van Rossumb209a111997-04-29 18:18:01 +00003265 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003266 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003267 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003268 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 return NULL;
3270 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003271 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003272 v = (*sq->sq_item)(v, i);
3273 if (v)
3274 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003275 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003276 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003277 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278}
3279
Guido van Rossum20c6add2000-05-08 14:06:50 +00003280/* Extract a slice index from a PyInt or PyLong, the index is bound to
3281 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3282 and error. Returns 1 on success.*/
3283
3284int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003285_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286{
3287 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003288 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003289 if (PyInt_Check(v)) {
3290 x = PyInt_AsLong(v);
3291 } else if (PyLong_Check(v)) {
3292 x = PyLong_AsLong(v);
3293 if (x==-1 && PyErr_Occurred()) {
3294 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003295 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003296
Guido van Rossumac7be682001-01-17 15:42:30 +00003297 if (!PyErr_ExceptionMatches(
3298 PyExc_OverflowError)) {
3299 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003300 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003301 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003302 }
3303
Guido van Rossumac7be682001-01-17 15:42:30 +00003304 /* Clear the OverflowError */
3305 PyErr_Clear();
3306
3307 /* It's an overflow error, so we need to
3308 check the sign of the long integer,
3309 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003310 the error. */
3311
3312 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003313 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003314 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003315
3316 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003317 cmp = PyObject_RichCompareBool(v, long_zero,
3318 Py_GT);
3319 Py_DECREF(long_zero);
3320 if (cmp < 0)
3321 return 0;
3322 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003323 x = INT_MAX;
3324 else
3325 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003326 }
3327 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003328 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003329 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003330 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003332 /* Truncate -- very long indices are truncated anyway */
3333 if (x > INT_MAX)
3334 x = INT_MAX;
3335 else if (x < -INT_MAX)
3336 x = 0;
3337 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003339 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340}
3341
Guido van Rossum50d756e2001-08-18 17:43:36 +00003342#undef ISINT
3343#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3344
Guido van Rossumb209a111997-04-29 18:18:01 +00003345static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003346apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003348 PyTypeObject *tp = u->ob_type;
3349 PySequenceMethods *sq = tp->tp_as_sequence;
3350
3351 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3352 int ilow = 0, ihigh = INT_MAX;
3353 if (!_PyEval_SliceIndex(v, &ilow))
3354 return NULL;
3355 if (!_PyEval_SliceIndex(w, &ihigh))
3356 return NULL;
3357 return PySequence_GetSlice(u, ilow, ihigh);
3358 }
3359 else {
3360 PyObject *slice = PySlice_New(v, w, NULL);
3361 if (slice != NULL)
3362 return PyObject_GetItem(u, slice);
3363 else
3364 return NULL;
3365 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003367
3368static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003369assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3370 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003372 PyTypeObject *tp = u->ob_type;
3373 PySequenceMethods *sq = tp->tp_as_sequence;
3374
3375 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3376 int ilow = 0, ihigh = INT_MAX;
3377 if (!_PyEval_SliceIndex(v, &ilow))
3378 return -1;
3379 if (!_PyEval_SliceIndex(w, &ihigh))
3380 return -1;
3381 if (x == NULL)
3382 return PySequence_DelSlice(u, ilow, ihigh);
3383 else
3384 return PySequence_SetSlice(u, ilow, ihigh, x);
3385 }
3386 else {
3387 PyObject *slice = PySlice_New(v, w, NULL);
3388 if (slice != NULL) {
3389 if (x != NULL)
3390 return PyObject_SetItem(u, slice, x);
3391 else
3392 return PyObject_DelItem(u, slice);
3393 }
3394 else
3395 return -1;
3396 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397}
3398
Guido van Rossumb209a111997-04-29 18:18:01 +00003399static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003400cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401{
Guido van Rossumac7be682001-01-17 15:42:30 +00003402 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003404 case IS:
3405 case IS_NOT:
3406 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003407 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003408 res = !res;
3409 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410 case IN:
3411 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003412 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413 if (res < 0)
3414 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003415 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003416 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417 break;
3418 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003419 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420 break;
3421 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003422 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003424 v = res ? Py_True : Py_False;
3425 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426 return v;
3427}
3428
Thomas Wouters52152252000-08-17 22:55:00 +00003429static PyObject *
3430import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003431{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003432 PyObject *x;
3433
3434 x = PyObject_GetAttr(v, name);
3435 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003436 PyErr_Format(PyExc_ImportError,
3437 "cannot import name %.230s",
3438 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003439 }
Thomas Wouters52152252000-08-17 22:55:00 +00003440 return x;
3441}
Guido van Rossumac7be682001-01-17 15:42:30 +00003442
Thomas Wouters52152252000-08-17 22:55:00 +00003443static int
3444import_all_from(PyObject *locals, PyObject *v)
3445{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003446 PyObject *all = PyObject_GetAttrString(v, "__all__");
3447 PyObject *dict, *name, *value;
3448 int skip_leading_underscores = 0;
3449 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003450
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003451 if (all == NULL) {
3452 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3453 return -1; /* Unexpected error */
3454 PyErr_Clear();
3455 dict = PyObject_GetAttrString(v, "__dict__");
3456 if (dict == NULL) {
3457 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3458 return -1;
3459 PyErr_SetString(PyExc_ImportError,
3460 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003461 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003462 }
3463 all = PyMapping_Keys(dict);
3464 Py_DECREF(dict);
3465 if (all == NULL)
3466 return -1;
3467 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003468 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003469
3470 for (pos = 0, err = 0; ; pos++) {
3471 name = PySequence_GetItem(all, pos);
3472 if (name == NULL) {
3473 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3474 err = -1;
3475 else
3476 PyErr_Clear();
3477 break;
3478 }
3479 if (skip_leading_underscores &&
3480 PyString_Check(name) &&
3481 PyString_AS_STRING(name)[0] == '_')
3482 {
3483 Py_DECREF(name);
3484 continue;
3485 }
3486 value = PyObject_GetAttr(v, name);
3487 if (value == NULL)
3488 err = -1;
3489 else
3490 err = PyDict_SetItem(locals, name, value);
3491 Py_DECREF(name);
3492 Py_XDECREF(value);
3493 if (err != 0)
3494 break;
3495 }
3496 Py_DECREF(all);
3497 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003498}
3499
Guido van Rossumb209a111997-04-29 18:18:01 +00003500static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003501build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003502{
Tim Peters6d6c1a32001-08-02 04:15:00 +00003503 PyObject *metaclass = NULL;
3504
3505 if (PyDict_Check(methods))
3506 metaclass = PyDict_GetItemString(methods, "__metaclass__");
3507
3508 if (metaclass == NULL) {
3509 if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0)
3510 metaclass = (PyObject *)
3511 PyTuple_GET_ITEM(bases, 0)->ob_type;
3512 else {
3513 PyObject *g = PyEval_GetGlobals();
3514 if (g != NULL && PyDict_Check(g))
3515 metaclass = PyDict_GetItemString(
3516 g, "__metaclass__");
3517 if (metaclass == NULL)
3518 metaclass = (PyObject *) &PyClass_Type;
Guido van Rossum25831651993-05-19 14:50:45 +00003519 }
3520 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003521 return PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
Guido van Rossum25831651993-05-19 14:50:45 +00003522}
3523
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003524static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003525exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3526 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003527{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003528 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003529 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003530 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003531
Guido van Rossumb209a111997-04-29 18:18:01 +00003532 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3533 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003534 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003535 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003536 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003537 locals = PyTuple_GetItem(prog, 2);
3538 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003539 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003540 if (globals == Py_None) {
3541 globals = PyEval_GetGlobals();
3542 if (locals == Py_None) {
3543 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544 plain = 1;
3545 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003546 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003547 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003548 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003549 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003550 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003551 !PyCode_Check(prog) &&
3552 !PyFile_Check(prog)) {
3553 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003554 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003555 return -1;
3556 }
Fred Drake661ea262000-10-24 19:57:45 +00003557 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003558 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003559 "exec: arg 2 must be a dictionary or None");
3560 return -1;
3561 }
3562 if (!PyDict_Check(locals)) {
3563 PyErr_SetString(PyExc_TypeError,
3564 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003565 return -1;
3566 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003567 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003568 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003569 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003570 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003571 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003572 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003573 FILE *fp = PyFile_AsFile(prog);
3574 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003575 PyCompilerFlags cf;
3576 cf.cf_flags = 0;
3577 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003578 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3579 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003580 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003581 v = PyRun_File(fp, name, Py_file_input, globals,
3582 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003583 }
3584 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003585 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003586 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003587 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003588 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003589 cf.cf_flags = 0;
3590 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003591 v = PyRun_StringFlags(str, Py_file_input, globals,
3592 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003593 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003594 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003595 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003596 if (plain)
3597 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003598 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003599 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003600 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003601 return 0;
3602}
Guido van Rossum24c13741995-02-14 09:42:43 +00003603
Guido van Rossumac7be682001-01-17 15:42:30 +00003604static void
Paul Prescode68140d2000-08-30 20:25:01 +00003605format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3606{
3607 char *obj_str;
3608
3609 if (!obj)
3610 return;
3611
3612 obj_str = PyString_AsString(obj);
3613 if (!obj_str)
3614 return;
3615
3616 PyErr_Format(exc, format_str, obj_str);
3617}
Guido van Rossum950361c1997-01-24 13:49:28 +00003618
3619#ifdef DYNAMIC_EXECUTION_PROFILE
3620
3621PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003622getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003623{
3624 int i;
3625 PyObject *l = PyList_New(256);
3626 if (l == NULL) return NULL;
3627 for (i = 0; i < 256; i++) {
3628 PyObject *x = PyInt_FromLong(a[i]);
3629 if (x == NULL) {
3630 Py_DECREF(l);
3631 return NULL;
3632 }
3633 PyList_SetItem(l, i, x);
3634 }
3635 for (i = 0; i < 256; i++)
3636 a[i] = 0;
3637 return l;
3638}
3639
3640PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003641_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003642{
3643#ifndef DXPAIRS
3644 return getarray(dxp);
3645#else
3646 int i;
3647 PyObject *l = PyList_New(257);
3648 if (l == NULL) return NULL;
3649 for (i = 0; i < 257; i++) {
3650 PyObject *x = getarray(dxpairs[i]);
3651 if (x == NULL) {
3652 Py_DECREF(l);
3653 return NULL;
3654 }
3655 PyList_SetItem(l, i, x);
3656 }
3657 return l;
3658#endif
3659}
3660
3661#endif