blob: 0cd1c3623c4e50de8ee3d4549f309694d24e1c2a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static PyObject *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
Jeremy Hylton938ace62002-07-17 16:30:39 +000087static PyTypeObject gentype;
Tim Peters5ca576e2001-06-18 22:08:13 +000088
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{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000102 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000103 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 Schemenauer08de92a2002-03-18 20:45:09 +0000109 _PyObject_GC_TRACK(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 Schemenauer08de92a2002-03-18 20:45:09 +0000122 _PyObject_GC_UNTRACK(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000123 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000124 PyObject_GC_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 *
Tim Peters5ca576e2001-06-18 22:08:13 +0000169gen_getiter(PyObject *gen)
170{
171 Py_INCREF(gen);
172 return gen;
173}
174
Guido van Rossum6f799372001-09-20 20:46:19 +0000175static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000176 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
177 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
178 {NULL} /* Sentinel */
179};
Tim Peters5ca576e2001-06-18 22:08:13 +0000180
181statichere PyTypeObject gentype = {
182 PyObject_HEAD_INIT(&PyType_Type)
183 0, /* ob_size */
184 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000185 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000186 0, /* tp_itemsize */
187 /* methods */
188 (destructor)gen_dealloc, /* tp_dealloc */
189 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000190 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000191 0, /* tp_setattr */
192 0, /* tp_compare */
193 0, /* tp_repr */
194 0, /* tp_as_number */
195 0, /* tp_as_sequence */
196 0, /* tp_as_mapping */
197 0, /* tp_hash */
198 0, /* tp_call */
199 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000200 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000201 0, /* tp_setattro */
202 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000203 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000204 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000205 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000206 0, /* tp_clear */
207 0, /* tp_richcompare */
208 0, /* tp_weaklistoffset */
209 (getiterfunc)gen_getiter, /* tp_iter */
210 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Petersa64295b2002-07-17 00:15:22 +0000211 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 gen_memberlist, /* tp_members */
213 0, /* tp_getset */
214 0, /* tp_base */
215 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000216};
217
218
Guido van Rossume59214e1994-08-30 08:01:59 +0000219#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000220
Guido van Rossum2571cc81999-04-07 16:07:23 +0000221#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000222#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000223#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000224#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000225
Guido van Rossuma027efa1997-05-05 20:56:21 +0000226extern int _PyThread_Started; /* Flag for Py_Exit */
227
Guido van Rossum65d5b571998-12-21 19:32:43 +0000228static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000229static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000230
231void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000232PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000233{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000234 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000235 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000236 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000237 interpreter_lock = PyThread_allocate_lock();
238 PyThread_acquire_lock(interpreter_lock, 1);
239 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000240}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000241
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000242void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000243PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000245 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000246}
247
248void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000249PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000250{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000251 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000252}
253
254void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000255PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000256{
257 if (tstate == NULL)
258 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000259 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000260 if (PyThreadState_Swap(tstate) != NULL)
261 Py_FatalError(
262 "PyEval_AcquireThread: non-NULL old thread state");
263}
264
265void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000266PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000267{
268 if (tstate == NULL)
269 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
270 if (PyThreadState_Swap(NULL) != tstate)
271 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000272 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000273}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000274
275/* This function is called from PyOS_AfterFork to ensure that newly
276 created child processes don't hold locks referring to threads which
277 are not running in the child process. (This could also be done using
278 pthread_atfork mechanism, at least for the pthreads implementation.) */
279
280void
281PyEval_ReInitThreads(void)
282{
283 if (!interpreter_lock)
284 return;
285 /*XXX Can't use PyThread_free_lock here because it does too
286 much error-checking. Doing this cleanly would require
287 adding a new function to each thread_*.h. Instead, just
288 create a new lock and waste a little bit of memory */
289 interpreter_lock = PyThread_allocate_lock();
290 PyThread_acquire_lock(interpreter_lock, 1);
291 main_thread = PyThread_get_thread_ident();
292}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000293#endif
294
Guido van Rossumff4949e1992-08-05 19:58:53 +0000295/* Functions save_thread and restore_thread are always defined so
296 dynamically loaded modules needn't be compiled separately for use
297 with and without threads: */
298
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000299PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000300PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000301{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000302 PyThreadState *tstate = PyThreadState_Swap(NULL);
303 if (tstate == NULL)
304 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000305#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000306 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000307 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000308#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000309 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310}
311
312void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000313PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000315 if (tstate == NULL)
316 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000317#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000318 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000319 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000320 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000321 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322 }
323#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000325}
326
327
Guido van Rossuma9672091994-09-14 13:31:22 +0000328/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
329 signal handlers or Mac I/O completion routines) can schedule calls
330 to a function to be called synchronously.
331 The synchronous function is called with one void* argument.
332 It should return 0 for success or -1 for failure -- failure should
333 be accompanied by an exception.
334
335 If registry succeeds, the registry function returns 0; if it fails
336 (e.g. due to too many pending calls) it returns -1 (without setting
337 an exception condition).
338
339 Note that because registry may occur from within signal handlers,
340 or other asynchronous events, calling malloc() is unsafe!
341
342#ifdef WITH_THREAD
343 Any thread can schedule pending calls, but only the main thread
344 will execute them.
345#endif
346
347 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
348 There are two possible race conditions:
349 (1) nested asynchronous registry calls;
350 (2) registry calls made while pending calls are being processed.
351 While (1) is very unlikely, (2) is a real possibility.
352 The current code is safe against (2), but not against (1).
353 The safety against (2) is derived from the fact that only one
354 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000355
Guido van Rossuma027efa1997-05-05 20:56:21 +0000356 XXX Darn! With the advent of thread state, we should have an array
357 of pending calls per thread in the thread state! Later...
358*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000359
Guido van Rossuma9672091994-09-14 13:31:22 +0000360#define NPENDINGCALLS 32
361static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000362 int (*func)(void *);
363 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000364} pendingcalls[NPENDINGCALLS];
365static volatile int pendingfirst = 0;
366static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000367static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000368
369int
Thomas Wouters334fb892000-07-25 12:56:38 +0000370Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000371{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000372 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373 int i, j;
374 /* XXX Begin critical section */
375 /* XXX If you want this to be safe against nested
376 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000377 if (busy)
378 return -1;
379 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000380 i = pendinglast;
381 j = (i + 1) % NPENDINGCALLS;
382 if (j == pendingfirst)
383 return -1; /* Queue full */
384 pendingcalls[i].func = func;
385 pendingcalls[i].arg = arg;
386 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000387 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000388 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389 /* XXX End critical section */
390 return 0;
391}
392
Guido van Rossum180d7b41994-09-29 09:45:57 +0000393int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000394Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000395{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000396 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000397#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000398 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000399 return 0;
400#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000401 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000402 return 0;
403 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000404 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000405 for (;;) {
406 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000407 int (*func)(void *);
408 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000409 i = pendingfirst;
410 if (i == pendinglast)
411 break; /* Queue empty */
412 func = pendingcalls[i].func;
413 arg = pendingcalls[i].arg;
414 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415 if (func(arg) < 0) {
416 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000417 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000418 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000419 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000421 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000422 return 0;
423}
424
425
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000426/* The interpreter's recursion limit */
427
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000428static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000429
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000430int
431Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000432{
433 return recursion_limit;
434}
435
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000436void
437Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000438{
439 recursion_limit = new_limit;
440}
441
Guido van Rossum374a9221991-04-04 10:40:29 +0000442/* Status code for main loop (reason for stack unwind) */
443
444enum why_code {
445 WHY_NOT, /* No error */
446 WHY_EXCEPTION, /* Exception occurred */
447 WHY_RERAISE, /* Exception re-raised by 'finally' */
448 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000449 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000450 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000451 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000452};
453
Tim Petersdbd9ba62000-07-09 03:09:57 +0000454static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000455static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000456
Guido van Rossum374a9221991-04-04 10:40:29 +0000457
Guido van Rossumb209a111997-04-29 18:18:01 +0000458PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000459PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000461 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000463 (PyObject **)NULL, 0,
464 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000465 (PyObject **)NULL, 0,
466 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467}
468
469
470/* Interpreter main loop */
471
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000473eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000474{
Guido van Rossum950361c1997-01-24 13:49:28 +0000475#ifdef DXPAIRS
476 int lastopcode = 0;
477#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000478 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000479 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000480 register int opcode=0; /* Current opcode */
481 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000482 register enum why_code why; /* Reason for block stack unwind */
483 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 register PyObject *x; /* Result object -- NULL if error */
485 register PyObject *v; /* Temporary objects popped off stack */
486 register PyObject *w;
487 register PyObject *u;
488 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000489 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000490 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000491 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000492 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000493 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000494 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000495#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000496 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000497#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000498#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000500 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000501#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000502
Neal Norwitza81d2202002-07-14 00:27:26 +0000503/* Tuple access macros */
504
505#ifndef Py_DEBUG
506#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
507#else
508#define GETITEM(v, i) PyTuple_GetItem((v), (i))
509#endif
510
Guido van Rossum374a9221991-04-04 10:40:29 +0000511/* Code access macros */
512
Neal Norwitza81d2202002-07-14 00:27:26 +0000513#define GETCONST(i) (GETITEM(co->co_consts, (i)))
514#define GETNAMEV(i) (GETITEM(co->co_names, (i)))
Guido van Rossumd076c731998-10-07 19:42:25 +0000515#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000516#define NEXTOP() (*next_instr++)
517#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000518#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#define JUMPBY(x) (next_instr += (x))
520
521/* Stack manipulation macros */
522
523#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
524#define EMPTY() (STACK_LEVEL() == 0)
525#define TOP() (stack_pointer[-1])
526#define BASIC_PUSH(v) (*stack_pointer++ = (v))
527#define BASIC_POP() (*--stack_pointer)
528
Guido van Rossum96a42c81992-01-12 02:29:51 +0000529#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000530#define PUSH(v) { (void)(BASIC_PUSH(v), \
531 lltrace && prtrace(TOP(), "push")); \
532 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000533#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#else
535#define PUSH(v) BASIC_PUSH(v)
536#define POP() BASIC_POP()
537#endif
538
Guido van Rossum681d79a1995-07-18 14:51:37 +0000539/* Local variable macros */
540
541#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000542
543/* The SETLOCAL() macro must not DECREF the local variable in-place and
544 then store the new value; it must copy the old value to a temporary
545 value, then store the new value, and then DECREF the temporary value.
546 This is because it is possible that during the DECREF the frame is
547 accessed by other code (e.g. a __del__ method or gc.collect()) and the
548 variable would be pointing to already-freed memory. */
549#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
550 GETLOCAL(i) = value; \
551 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000552
Guido van Rossuma027efa1997-05-05 20:56:21 +0000553/* Start of code */
554
Tim Peters5ca576e2001-06-18 22:08:13 +0000555 if (f == NULL)
556 return NULL;
557
Guido van Rossum8861b741996-07-30 16:49:37 +0000558#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000559 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000560 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000561 return NULL;
562 }
563#endif
564
Tim Peters5ca576e2001-06-18 22:08:13 +0000565 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000566 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 --tstate->recursion_depth;
568 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000569 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000570 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000571 return NULL;
572 }
573
Tim Peters5ca576e2001-06-18 22:08:13 +0000574 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000575 co = f->f_code;
576 fastlocals = f->f_localsplus;
577 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000578 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000579 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000580 stack_pointer = f->f_stacktop;
581 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000582 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000583
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000584 if (tstate->use_tracing) {
585 if (tstate->c_tracefunc != NULL) {
586 /* tstate->c_tracefunc, if defined, is a
587 function that will be called on *every* entry
588 to a code block. Its return value, if not
589 None, is a function that will be called at
590 the start of each executed line of code.
591 (Actually, the function must return itself
592 in order to continue tracing.) The trace
593 functions are called with three arguments:
594 a pointer to the current frame, a string
595 indicating why the function is called, and
596 an argument which depends on the situation.
597 The global trace function is also called
598 whenever an exception is detected. */
599 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
600 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000601 /* Trace function raised an error */
602 return NULL;
603 }
604 }
605 if (tstate->c_profilefunc != NULL) {
606 /* Similar for c_profilefunc, except it needn't
607 return itself and isn't called for "line" events */
608 if (call_trace(tstate->c_profilefunc,
609 tstate->c_profileobj,
610 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000611 /* Profile function raised an error */
612 return NULL;
613 }
614 }
615 }
616
Tim Peters5ca576e2001-06-18 22:08:13 +0000617#ifdef LLTRACE
618 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
619#endif
620#if defined(Py_DEBUG) || defined(LLTRACE)
621 filename = PyString_AsString(co->co_filename);
622#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000623
Guido van Rossum374a9221991-04-04 10:40:29 +0000624 why = WHY_NOT;
625 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000626 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000627 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000628
Guido van Rossum374a9221991-04-04 10:40:29 +0000629 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000630 assert(stack_pointer >= f->f_valuestack); /* else underflow */
631 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000632 /* Do periodic things. Doing this every time through
633 the loop would add too much overhead, so we do it
634 only every Nth instruction. We also do it if
635 ``things_to_do'' is set, i.e. when an asynchronous
636 event needs attention (e.g. a signal handler or
637 async I/O handler); see Py_AddPendingCall() and
638 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000639
Guido van Rossuma027efa1997-05-05 20:56:21 +0000640 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000641 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000642 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000643 if (Py_MakePendingCalls() < 0) {
644 why = WHY_EXCEPTION;
645 goto on_error;
646 }
647 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000648#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000649 /* If we have true signals, the signal handler
650 will call Py_AddPendingCall() so we don't
651 have to call sigcheck(). On the Mac and
652 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000653 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000654 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000655 goto on_error;
656 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000657#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000658
Guido van Rossume59214e1994-08-30 08:01:59 +0000659#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660 if (interpreter_lock) {
661 /* Give another thread a chance */
662
Guido van Rossum25ce5661997-08-02 03:10:38 +0000663 if (PyThreadState_Swap(NULL) != tstate)
664 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000665 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666
667 /* Other threads may run now */
668
Guido van Rossum65d5b571998-12-21 19:32:43 +0000669 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000670 if (PyThreadState_Swap(tstate) != NULL)
671 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672 }
673#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000674 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675
Neil Schemenauer63543862002-02-17 19:10:14 +0000676 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000678
Guido van Rossum408027e1996-12-30 16:17:54 +0000679#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000680 f->f_lasti = INSTR_OFFSET();
681#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 opcode = NEXTOP();
684 if (HAS_ARG(opcode))
685 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000686 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000687#ifdef DYNAMIC_EXECUTION_PROFILE
688#ifdef DXPAIRS
689 dxpairs[lastopcode][opcode]++;
690 lastopcode = opcode;
691#endif
692 dxp[opcode]++;
693#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000694
Guido van Rossum96a42c81992-01-12 02:29:51 +0000695#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000696 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000697
Guido van Rossum96a42c81992-01-12 02:29:51 +0000698 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 if (HAS_ARG(opcode)) {
700 printf("%d: %d, %d\n",
701 (int) (INSTR_OFFSET() - 3),
702 opcode, oparg);
703 }
704 else {
705 printf("%d: %d\n",
706 (int) (INSTR_OFFSET() - 1), opcode);
707 }
708 }
709#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000711
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000713
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 /* BEWARE!
715 It is essential that any operation that fails sets either
716 x to NULL, err to nonzero, or why to anything but WHY_NOT,
717 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000720
Neil Schemenauer63543862002-02-17 19:10:14 +0000721 case SET_LINENO:
722#ifdef LLTRACE
723 if (lltrace)
724 printf("--- %s:%d \n", filename, oparg);
725#endif
726 f->f_lineno = oparg;
727 if (tstate->c_tracefunc == NULL || tstate->tracing)
728 goto fast_next_opcode;
729 /* Trace each line of code reached */
730 f->f_lasti = INSTR_OFFSET();
731 /* Inline call_trace() for performance: */
732 tstate->tracing++;
733 tstate->use_tracing = 0;
734 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
735 PyTrace_LINE, Py_None);
736 tstate->use_tracing = (tstate->c_tracefunc
737 || tstate->c_profilefunc);
738 tstate->tracing--;
739 break;
740
741 case LOAD_FAST:
742 x = GETLOCAL(oparg);
743 if (x != NULL) {
744 Py_INCREF(x);
745 PUSH(x);
746 goto fast_next_opcode;
747 }
748 format_exc_check_arg(PyExc_UnboundLocalError,
749 UNBOUNDLOCAL_ERROR_MSG,
750 PyTuple_GetItem(co->co_varnames, oparg));
751 break;
752
753 case LOAD_CONST:
754 x = GETCONST(oparg);
755 Py_INCREF(x);
756 PUSH(x);
757 goto fast_next_opcode;
758
759 case STORE_FAST:
760 v = POP();
761 SETLOCAL(oparg, v);
762 goto fast_next_opcode;
763
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 case POP_TOP:
765 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000766 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000767 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000768
Guido van Rossum374a9221991-04-04 10:40:29 +0000769 case ROT_TWO:
770 v = POP();
771 w = POP();
772 PUSH(v);
773 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000774 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000775
Guido van Rossum374a9221991-04-04 10:40:29 +0000776 case ROT_THREE:
777 v = POP();
778 w = POP();
779 x = POP();
780 PUSH(v);
781 PUSH(x);
782 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000783 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000784
Thomas Wouters434d0822000-08-24 20:11:32 +0000785 case ROT_FOUR:
786 u = POP();
787 v = POP();
788 w = POP();
789 x = POP();
790 PUSH(u);
791 PUSH(x);
792 PUSH(w);
793 PUSH(v);
794 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000795
Guido van Rossum374a9221991-04-04 10:40:29 +0000796 case DUP_TOP:
797 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000798 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000799 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000800 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000801
Thomas Wouters434d0822000-08-24 20:11:32 +0000802 case DUP_TOPX:
803 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000804 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000805 x = TOP();
806 Py_INCREF(x);
807 PUSH(x);
808 continue;
809 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000810 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000811 Py_INCREF(x);
812 w = TOP();
813 Py_INCREF(w);
814 PUSH(x);
815 PUSH(w);
816 PUSH(x);
817 continue;
818 case 3:
819 x = POP();
820 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000821 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000822 Py_INCREF(w);
823 v = TOP();
824 Py_INCREF(v);
825 PUSH(w);
826 PUSH(x);
827 PUSH(v);
828 PUSH(w);
829 PUSH(x);
830 continue;
831 case 4:
832 x = POP();
833 Py_INCREF(x);
834 w = POP();
835 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000836 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000837 Py_INCREF(v);
838 u = TOP();
839 Py_INCREF(u);
840 PUSH(v);
841 PUSH(w);
842 PUSH(x);
843 PUSH(u);
844 PUSH(v);
845 PUSH(w);
846 PUSH(x);
847 continue;
848 case 5:
849 x = POP();
850 Py_INCREF(x);
851 w = POP();
852 Py_INCREF(w);
853 v = POP();
854 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000855 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000856 Py_INCREF(u);
857 t = TOP();
858 Py_INCREF(t);
859 PUSH(u);
860 PUSH(v);
861 PUSH(w);
862 PUSH(x);
863 PUSH(t);
864 PUSH(u);
865 PUSH(v);
866 PUSH(w);
867 PUSH(x);
868 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000869 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000870 Py_FatalError("invalid argument to DUP_TOPX"
871 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000872 }
Tim Peters35ba6892000-10-11 07:04:49 +0000873 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000874
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 case UNARY_POSITIVE:
876 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000877 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000882
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 case UNARY_NEGATIVE:
884 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000885 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000886 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000888 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000890
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 case UNARY_NOT:
892 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000893 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000894 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000895 if (err == 0) {
896 Py_INCREF(Py_True);
897 PUSH(Py_True);
898 continue;
899 }
900 else if (err > 0) {
901 Py_INCREF(Py_False);
902 PUSH(Py_False);
903 err = 0;
904 continue;
905 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000907
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 case UNARY_CONVERT:
909 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000910 x = PyObject_Repr(v);
911 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000913 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000915
Guido van Rossum7928cd71991-10-24 14:59:31 +0000916 case UNARY_INVERT:
917 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000918 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000919 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000920 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000921 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000922 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000923
Guido van Rossum50564e81996-01-12 01:13:16 +0000924 case BINARY_POWER:
925 w = POP();
926 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000927 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 Py_DECREF(v);
929 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000930 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000931 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000932 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000933
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 case BINARY_MULTIPLY:
935 w = POP();
936 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000937 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000938 Py_DECREF(v);
939 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000941 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000943
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000945 if (!_Py_QnewFlag) {
946 w = POP();
947 v = POP();
948 x = PyNumber_Divide(v, w);
949 Py_DECREF(v);
950 Py_DECREF(w);
951 PUSH(x);
952 if (x != NULL) continue;
953 break;
954 }
955 /* -Qnew is in effect: fall through to
956 BINARY_TRUE_DIVIDE */
957 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 w = POP();
959 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000960 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000961 Py_DECREF(v);
962 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000964 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000966
Guido van Rossum4668b002001-08-08 05:00:18 +0000967 case BINARY_FLOOR_DIVIDE:
968 w = POP();
969 v = POP();
970 x = PyNumber_FloorDivide(v, w);
971 Py_DECREF(v);
972 Py_DECREF(w);
973 PUSH(x);
974 if (x != NULL) continue;
975 break;
976
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 case BINARY_MODULO:
978 w = POP();
979 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000980 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000981 Py_DECREF(v);
982 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000984 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000986
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 case BINARY_ADD:
988 w = POP();
989 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000990 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000991 /* INLINE: int + int */
992 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000993 a = PyInt_AS_LONG(v);
994 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000995 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000996 if ((i^a) < 0 && (i^b) < 0)
997 goto slow_add;
998 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000999 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001000 else {
1001 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001002 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001003 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_DECREF(v);
1005 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001007 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001009
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 case BINARY_SUBTRACT:
1011 w = POP();
1012 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001013 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001014 /* INLINE: int - int */
1015 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001016 a = PyInt_AS_LONG(v);
1017 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001018 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001019 if ((i^a) < 0 && (i^~b) < 0)
1020 goto slow_sub;
1021 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001022 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001023 else {
1024 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001025 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001026 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001027 Py_DECREF(v);
1028 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001030 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001032
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 case BINARY_SUBSCR:
1034 w = POP();
1035 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001036 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001037 /* INLINE: list[int] */
1038 long i = PyInt_AsLong(w);
1039 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001040 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001041 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001042 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001043 PyErr_SetString(PyExc_IndexError,
1044 "list index out of range");
1045 x = NULL;
1046 }
1047 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001048 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001049 Py_INCREF(x);
1050 }
1051 }
1052 else
1053 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001054 Py_DECREF(v);
1055 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001057 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001058 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001059
Guido van Rossum7928cd71991-10-24 14:59:31 +00001060 case BINARY_LSHIFT:
1061 w = POP();
1062 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001063 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001064 Py_DECREF(v);
1065 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001066 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001067 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001068 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001069
Guido van Rossum7928cd71991-10-24 14:59:31 +00001070 case BINARY_RSHIFT:
1071 w = POP();
1072 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001073 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001074 Py_DECREF(v);
1075 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001076 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001077 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001078 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001079
Guido van Rossum7928cd71991-10-24 14:59:31 +00001080 case BINARY_AND:
1081 w = POP();
1082 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001083 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001084 Py_DECREF(v);
1085 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001086 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001087 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001088 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001089
Guido van Rossum7928cd71991-10-24 14:59:31 +00001090 case BINARY_XOR:
1091 w = POP();
1092 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001093 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001094 Py_DECREF(v);
1095 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001096 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001097 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001098 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001099
Guido van Rossum7928cd71991-10-24 14:59:31 +00001100 case BINARY_OR:
1101 w = POP();
1102 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001103 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001104 Py_DECREF(v);
1105 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001106 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001107 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001108 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001109
1110 case INPLACE_POWER:
1111 w = POP();
1112 v = POP();
1113 x = PyNumber_InPlacePower(v, w, Py_None);
1114 Py_DECREF(v);
1115 Py_DECREF(w);
1116 PUSH(x);
1117 if (x != NULL) continue;
1118 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001119
Thomas Wouters434d0822000-08-24 20:11:32 +00001120 case INPLACE_MULTIPLY:
1121 w = POP();
1122 v = POP();
1123 x = PyNumber_InPlaceMultiply(v, w);
1124 Py_DECREF(v);
1125 Py_DECREF(w);
1126 PUSH(x);
1127 if (x != NULL) continue;
1128 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001129
Thomas Wouters434d0822000-08-24 20:11:32 +00001130 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001131 if (!_Py_QnewFlag) {
1132 w = POP();
1133 v = POP();
1134 x = PyNumber_InPlaceDivide(v, w);
1135 Py_DECREF(v);
1136 Py_DECREF(w);
1137 PUSH(x);
1138 if (x != NULL) continue;
1139 break;
1140 }
1141 /* -Qnew is in effect: fall through to
1142 INPLACE_TRUE_DIVIDE */
1143 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001144 w = POP();
1145 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001146 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001147 Py_DECREF(v);
1148 Py_DECREF(w);
1149 PUSH(x);
1150 if (x != NULL) continue;
1151 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001152
Guido van Rossum4668b002001-08-08 05:00:18 +00001153 case INPLACE_FLOOR_DIVIDE:
1154 w = POP();
1155 v = POP();
1156 x = PyNumber_InPlaceFloorDivide(v, w);
1157 Py_DECREF(v);
1158 Py_DECREF(w);
1159 PUSH(x);
1160 if (x != NULL) continue;
1161 break;
1162
Thomas Wouters434d0822000-08-24 20:11:32 +00001163 case INPLACE_MODULO:
1164 w = POP();
1165 v = POP();
1166 x = PyNumber_InPlaceRemainder(v, w);
1167 Py_DECREF(v);
1168 Py_DECREF(w);
1169 PUSH(x);
1170 if (x != NULL) continue;
1171 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001172
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 case INPLACE_ADD:
1174 w = POP();
1175 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001176 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001177 /* INLINE: int + int */
1178 register long a, b, i;
1179 a = PyInt_AS_LONG(v);
1180 b = PyInt_AS_LONG(w);
1181 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001182 if ((i^a) < 0 && (i^b) < 0)
1183 goto slow_iadd;
1184 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001185 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001186 else {
1187 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001188 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001189 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001190 Py_DECREF(v);
1191 Py_DECREF(w);
1192 PUSH(x);
1193 if (x != NULL) continue;
1194 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001195
Thomas Wouters434d0822000-08-24 20:11:32 +00001196 case INPLACE_SUBTRACT:
1197 w = POP();
1198 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001199 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001200 /* INLINE: int - int */
1201 register long a, b, i;
1202 a = PyInt_AS_LONG(v);
1203 b = PyInt_AS_LONG(w);
1204 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001205 if ((i^a) < 0 && (i^~b) < 0)
1206 goto slow_isub;
1207 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001208 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001209 else {
1210 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001211 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001212 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001213 Py_DECREF(v);
1214 Py_DECREF(w);
1215 PUSH(x);
1216 if (x != NULL) continue;
1217 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001218
Thomas Wouters434d0822000-08-24 20:11:32 +00001219 case INPLACE_LSHIFT:
1220 w = POP();
1221 v = POP();
1222 x = PyNumber_InPlaceLshift(v, w);
1223 Py_DECREF(v);
1224 Py_DECREF(w);
1225 PUSH(x);
1226 if (x != NULL) continue;
1227 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001228
Thomas Wouters434d0822000-08-24 20:11:32 +00001229 case INPLACE_RSHIFT:
1230 w = POP();
1231 v = POP();
1232 x = PyNumber_InPlaceRshift(v, w);
1233 Py_DECREF(v);
1234 Py_DECREF(w);
1235 PUSH(x);
1236 if (x != NULL) continue;
1237 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001238
Thomas Wouters434d0822000-08-24 20:11:32 +00001239 case INPLACE_AND:
1240 w = POP();
1241 v = POP();
1242 x = PyNumber_InPlaceAnd(v, w);
1243 Py_DECREF(v);
1244 Py_DECREF(w);
1245 PUSH(x);
1246 if (x != NULL) continue;
1247 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001248
Thomas Wouters434d0822000-08-24 20:11:32 +00001249 case INPLACE_XOR:
1250 w = POP();
1251 v = POP();
1252 x = PyNumber_InPlaceXor(v, w);
1253 Py_DECREF(v);
1254 Py_DECREF(w);
1255 PUSH(x);
1256 if (x != NULL) continue;
1257 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001258
Thomas Wouters434d0822000-08-24 20:11:32 +00001259 case INPLACE_OR:
1260 w = POP();
1261 v = POP();
1262 x = PyNumber_InPlaceOr(v, w);
1263 Py_DECREF(v);
1264 Py_DECREF(w);
1265 PUSH(x);
1266 if (x != NULL) continue;
1267 break;
1268
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 case SLICE+0:
1270 case SLICE+1:
1271 case SLICE+2:
1272 case SLICE+3:
1273 if ((opcode-SLICE) & 2)
1274 w = POP();
1275 else
1276 w = NULL;
1277 if ((opcode-SLICE) & 1)
1278 v = POP();
1279 else
1280 v = NULL;
1281 u = POP();
1282 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001283 Py_DECREF(u);
1284 Py_XDECREF(v);
1285 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001287 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001289
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 case STORE_SLICE+0:
1291 case STORE_SLICE+1:
1292 case STORE_SLICE+2:
1293 case STORE_SLICE+3:
1294 if ((opcode-STORE_SLICE) & 2)
1295 w = POP();
1296 else
1297 w = NULL;
1298 if ((opcode-STORE_SLICE) & 1)
1299 v = POP();
1300 else
1301 v = NULL;
1302 u = POP();
1303 t = POP();
1304 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 Py_DECREF(t);
1306 Py_DECREF(u);
1307 Py_XDECREF(v);
1308 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001309 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001311
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 case DELETE_SLICE+0:
1313 case DELETE_SLICE+1:
1314 case DELETE_SLICE+2:
1315 case DELETE_SLICE+3:
1316 if ((opcode-DELETE_SLICE) & 2)
1317 w = POP();
1318 else
1319 w = NULL;
1320 if ((opcode-DELETE_SLICE) & 1)
1321 v = POP();
1322 else
1323 v = NULL;
1324 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001325 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001327 Py_DECREF(u);
1328 Py_XDECREF(v);
1329 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001330 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001332
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 case STORE_SUBSCR:
1334 w = POP();
1335 v = POP();
1336 u = POP();
1337 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001338 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001339 Py_DECREF(u);
1340 Py_DECREF(v);
1341 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001342 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001344
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 case DELETE_SUBSCR:
1346 w = POP();
1347 v = POP();
1348 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001349 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 Py_DECREF(v);
1351 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001352 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001354
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 case PRINT_EXPR:
1356 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001357 w = PySys_GetObject("displayhook");
1358 if (w == NULL) {
1359 PyErr_SetString(PyExc_RuntimeError,
1360 "lost sys.displayhook");
1361 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001362 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001363 }
1364 if (err == 0) {
1365 x = Py_BuildValue("(O)", v);
1366 if (x == NULL)
1367 err = -1;
1368 }
1369 if (err == 0) {
1370 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001371 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001372 if (w == NULL)
1373 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001375 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001376 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001378
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001379 case PRINT_ITEM_TO:
1380 w = stream = POP();
1381 /* fall through to PRINT_ITEM */
1382
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 case PRINT_ITEM:
1384 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001385 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001386 w = PySys_GetObject("stdout");
1387 if (w == NULL) {
1388 PyErr_SetString(PyExc_RuntimeError,
1389 "lost sys.stdout");
1390 err = -1;
1391 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001392 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001393 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001394 err = PyFile_WriteString(" ", w);
1395 if (err == 0)
1396 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001397 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001398 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001399 if (PyString_Check(v)) {
1400 char *s = PyString_AS_STRING(v);
1401 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001402 if (len == 0 ||
1403 !isspace(Py_CHARMASK(s[len-1])) ||
1404 s[len-1] == ' ')
1405 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001406 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001407#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001408 else if (PyUnicode_Check(v)) {
1409 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1410 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001411 if (len == 0 ||
1412 !Py_UNICODE_ISSPACE(s[len-1]) ||
1413 s[len-1] == ' ')
1414 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001415 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001416#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001417 else
1418 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001419 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001421 Py_XDECREF(stream);
1422 stream = NULL;
1423 if (err == 0)
1424 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001425 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001426
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001427 case PRINT_NEWLINE_TO:
1428 w = stream = POP();
1429 /* fall through to PRINT_NEWLINE */
1430
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001432 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001433 w = PySys_GetObject("stdout");
1434 if (w == NULL)
1435 PyErr_SetString(PyExc_RuntimeError,
1436 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001437 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001438 if (w != NULL) {
1439 err = PyFile_WriteString("\n", w);
1440 if (err == 0)
1441 PyFile_SoftSpace(w, 0);
1442 }
1443 Py_XDECREF(stream);
1444 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001446
Thomas Wouters434d0822000-08-24 20:11:32 +00001447
1448#ifdef CASE_TOO_BIG
1449 default: switch (opcode) {
1450#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 case BREAK_LOOP:
1452 why = WHY_BREAK;
1453 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001454
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001455 case CONTINUE_LOOP:
1456 retval = PyInt_FromLong(oparg);
1457 why = WHY_CONTINUE;
1458 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001459
Guido van Rossumf10570b1995-07-07 22:53:21 +00001460 case RAISE_VARARGS:
1461 u = v = w = NULL;
1462 switch (oparg) {
1463 case 3:
1464 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001465 /* Fallthrough */
1466 case 2:
1467 v = POP(); /* value */
1468 /* Fallthrough */
1469 case 1:
1470 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001471 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001472 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001473 break;
1474 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001475 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001476 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001477 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001478 break;
1479 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001481
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001483 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001484 PyErr_SetString(PyExc_SystemError,
1485 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001486 break;
1487 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001489 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001491
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 case RETURN_VALUE:
1493 retval = POP();
1494 why = WHY_RETURN;
1495 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001496
Tim Peters5ca576e2001-06-18 22:08:13 +00001497 case YIELD_VALUE:
1498 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001499 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001500 f->f_lasti = INSTR_OFFSET();
1501 why = WHY_YIELD;
1502 break;
1503
1504
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001505 case EXEC_STMT:
1506 w = POP();
1507 v = POP();
1508 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001509 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 Py_DECREF(u);
1511 Py_DECREF(v);
1512 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001513 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001514
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 case POP_BLOCK:
1516 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001517 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 while (STACK_LEVEL() > b->b_level) {
1519 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 }
1522 }
1523 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001524
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 case END_FINALLY:
1526 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 if (PyInt_Check(v)) {
1528 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001529 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001530 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001531 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 retval = POP();
1533 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001536 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001539 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 else if (v != Py_None) {
1542 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 "'finally' pops bad exception");
1544 why = WHY_EXCEPTION;
1545 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001548
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001550 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001552 w = POP();
1553 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 Py_DECREF(u);
1556 Py_DECREF(v);
1557 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001559
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 case STORE_NAME:
1561 w = GETNAMEV(oparg);
1562 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001563 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001564 PyErr_Format(PyExc_SystemError,
1565 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001566 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 break;
1568 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 err = PyDict_SetItem(x, w, v);
1570 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001572
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001574 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001575 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001576 PyErr_Format(PyExc_SystemError,
1577 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001578 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001579 break;
1580 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001582 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001583 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001585
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001586 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001588 if (PyTuple_Check(v)) {
1589 if (PyTuple_Size(v) != oparg) {
1590 PyErr_SetString(PyExc_ValueError,
1591 "unpack tuple of wrong size");
1592 why = WHY_EXCEPTION;
1593 }
1594 else {
1595 for (; --oparg >= 0; ) {
1596 w = PyTuple_GET_ITEM(v, oparg);
1597 Py_INCREF(w);
1598 PUSH(w);
1599 }
1600 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001602 else if (PyList_Check(v)) {
1603 if (PyList_Size(v) != oparg) {
1604 PyErr_SetString(PyExc_ValueError,
1605 "unpack list of wrong size");
1606 why = WHY_EXCEPTION;
1607 }
1608 else {
1609 for (; --oparg >= 0; ) {
1610 w = PyList_GET_ITEM(v, oparg);
1611 Py_INCREF(w);
1612 PUSH(w);
1613 }
1614 }
1615 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001616 else if (unpack_iterable(v, oparg,
1617 stack_pointer + oparg))
1618 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001619 else {
1620 if (PyErr_ExceptionMatches(PyExc_TypeError))
1621 PyErr_SetString(PyExc_TypeError,
1622 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001623 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001624 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001625 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001626 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001627
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001629 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 v = POP();
1631 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001632 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1633 Py_DECREF(v);
1634 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001636
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001638 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001640 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1641 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001644
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001645 case STORE_GLOBAL:
1646 w = GETNAMEV(oparg);
1647 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001648 err = PyDict_SetItem(f->f_globals, w, v);
1649 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001650 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001651
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001652 case DELETE_GLOBAL:
1653 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001655 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001656 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001657 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001658
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001660 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001662 PyErr_Format(PyExc_SystemError,
1663 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001664 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001665 break;
1666 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001671 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001673 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001674 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001675 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 break;
1677 }
1678 }
1679 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 PUSH(x);
1682 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001683
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001685 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001686 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001690 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001691 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001692 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 break;
1694 }
1695 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 PUSH(x);
1698 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001699
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001700 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001701 x = GETLOCAL(oparg);
1702 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001703 format_exc_check_arg(
1704 PyExc_UnboundLocalError,
1705 UNBOUNDLOCAL_ERROR_MSG,
1706 PyTuple_GetItem(co->co_varnames, oparg)
1707 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001708 break;
1709 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001710 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001711 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001712
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001713 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001714 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001715 Py_INCREF(x);
1716 PUSH(x);
1717 break;
1718
1719 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001720 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001721 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001722 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001723 err = -1;
1724 /* Don't stomp existing exception */
1725 if (PyErr_Occurred())
1726 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001727 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001728 v = PyTuple_GetItem(co->co_cellvars,
1729 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001730 format_exc_check_arg(
1731 PyExc_UnboundLocalError,
1732 UNBOUNDLOCAL_ERROR_MSG,
1733 v);
1734 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001735 v = PyTuple_GetItem(
1736 co->co_freevars,
1737 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001738 format_exc_check_arg(
1739 PyExc_NameError,
1740 UNBOUNDFREE_ERROR_MSG,
1741 v);
1742 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001743 break;
1744 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001745 PUSH(w);
1746 break;
1747
1748 case STORE_DEREF:
1749 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001750 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001751 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001752 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001753 continue;
1754
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 if (x != NULL) {
1758 for (; --oparg >= 0;) {
1759 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 }
1762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001763 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 }
1765 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001766
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001768 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 if (x != NULL) {
1770 for (; --oparg >= 0;) {
1771 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001772 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 }
1774 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001775 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 }
1777 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001778
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001780 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001782 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001784
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001786 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001788 x = PyObject_GetAttr(v, w);
1789 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001791 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001793
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 case COMPARE_OP:
1795 w = POP();
1796 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001797 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001798 /* INLINE: cmp(int, int) */
1799 register long a, b;
1800 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001801 a = PyInt_AS_LONG(v);
1802 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001803 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001804 case PyCmp_LT: res = a < b; break;
1805 case PyCmp_LE: res = a <= b; break;
1806 case PyCmp_EQ: res = a == b; break;
1807 case PyCmp_NE: res = a != b; break;
1808 case PyCmp_GT: res = a > b; break;
1809 case PyCmp_GE: res = a >= b; break;
1810 case PyCmp_IS: res = v == w; break;
1811 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001812 default: goto slow_compare;
1813 }
1814 x = res ? Py_True : Py_False;
1815 Py_INCREF(x);
1816 }
1817 else {
1818 slow_compare:
1819 x = cmp_outcome(oparg, v, w);
1820 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 Py_DECREF(v);
1822 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001823 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001824 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001826
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001828 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001829 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001830 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001831 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001832 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001833 break;
1834 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001835 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001837 w,
1838 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001839 f->f_locals == NULL ?
1840 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001841 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001842 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001843 if (w == NULL) {
1844 x = NULL;
1845 break;
1846 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 x = PyEval_CallObject(x, w);
1848 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001850 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001852
Thomas Wouters52152252000-08-17 22:55:00 +00001853 case IMPORT_STAR:
1854 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001856 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001857 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001858 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001859 break;
1860 }
Thomas Wouters52152252000-08-17 22:55:00 +00001861 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001862 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001863 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001864 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001866
Thomas Wouters52152252000-08-17 22:55:00 +00001867 case IMPORT_FROM:
1868 w = GETNAMEV(oparg);
1869 v = TOP();
1870 x = import_from(v, w);
1871 PUSH(x);
1872 if (x != NULL) continue;
1873 break;
1874
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 case JUMP_FORWARD:
1876 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001877 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001878
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001880 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001881 if (err > 0)
1882 err = 0;
1883 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001885 else
1886 break;
1887 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001888
Guido van Rossum374a9221991-04-04 10:40:29 +00001889 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001890 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001891 if (err > 0) {
1892 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001893 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001894 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001895 else if (err == 0)
1896 ;
1897 else
1898 break;
1899 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001900
Guido van Rossum374a9221991-04-04 10:40:29 +00001901 case JUMP_ABSOLUTE:
1902 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001903 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001904
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001905 case GET_ITER:
1906 /* before: [obj]; after [getiter(obj)] */
1907 v = POP();
1908 x = PyObject_GetIter(v);
1909 Py_DECREF(v);
1910 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001911 PUSH(x);
1912 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001913 }
1914 break;
1915
1916 case FOR_ITER:
1917 /* before: [iter]; after: [iter, iter()] *or* [] */
1918 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001919 x = PyIter_Next(v);
1920 if (x != NULL) {
1921 PUSH(x);
1922 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001923 }
Tim Petersf4848da2001-05-05 00:14:56 +00001924 if (!PyErr_Occurred()) {
1925 /* iterator ended normally */
1926 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001927 Py_DECREF(v);
1928 JUMPBY(oparg);
1929 continue;
1930 }
1931 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001932
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 case SETUP_LOOP:
1934 case SETUP_EXCEPT:
1935 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001936 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001937 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001938 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001939
Guido van Rossumf10570b1995-07-07 22:53:21 +00001940 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001941 {
1942 int na = oparg & 0xff;
1943 int nk = (oparg>>8) & 0xff;
1944 int n = na + 2 * nk;
1945 PyObject **pfunc = stack_pointer - n - 1;
1946 PyObject *func = *pfunc;
1947 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1948
1949 /* Always dispatch PyCFunction first, because
1950 these are presumed to be the most frequent
1951 callable object.
1952 */
1953 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001954 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001955 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001956 x = do_call(func, &stack_pointer,
1957 na, nk);
1958 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001959 PyObject *callargs;
1960 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001961 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001962 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001963 } else
1964 x = fast_cfunction(func,
1965 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001966 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001967 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001968 && PyMethod_GET_SELF(func) != NULL) {
1969 /* optimize access to bound methods */
1970 PyObject *self = PyMethod_GET_SELF(func);
1971 Py_INCREF(self);
1972 func = PyMethod_GET_FUNCTION(func);
1973 Py_INCREF(func);
1974 Py_DECREF(*pfunc);
1975 *pfunc = self;
1976 na++;
1977 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001978 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 Py_INCREF(func);
1980 if (PyFunction_Check(func)) {
1981 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001982 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001983 } else {
1984 x = do_call(func, &stack_pointer,
1985 na, nk);
1986 }
1987 Py_DECREF(func);
1988 }
1989
1990 while (stack_pointer > pfunc) {
1991 w = POP();
1992 Py_DECREF(w);
1993 }
1994 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001995 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 continue;
1997 break;
1998 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001999
Jeremy Hylton76901512000-03-28 23:49:17 +00002000 case CALL_FUNCTION_VAR:
2001 case CALL_FUNCTION_KW:
2002 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002003 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002004 int na = oparg & 0xff;
2005 int nk = (oparg>>8) & 0xff;
2006 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002007 int n = na + 2 * nk;
2008 PyObject **pfunc, *func;
2009 if (flags & CALL_FLAG_VAR)
2010 n++;
2011 if (flags & CALL_FLAG_KW)
2012 n++;
2013 pfunc = stack_pointer - n - 1;
2014 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002015 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002016
Guido van Rossumac7be682001-01-17 15:42:30 +00002017 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002018 && PyMethod_GET_SELF(func) != NULL) {
2019 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002020 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002021 func = PyMethod_GET_FUNCTION(func);
2022 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002023 Py_DECREF(*pfunc);
2024 *pfunc = self;
2025 na++;
2026 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002027 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002028 Py_INCREF(func);
2029 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002030 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002031
Jeremy Hylton76901512000-03-28 23:49:17 +00002032 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002033 w = POP();
2034 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002035 }
2036 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002037 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002038 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002039 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002040 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002041
Guido van Rossum681d79a1995-07-18 14:51:37 +00002042 case MAKE_FUNCTION:
2043 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 x = PyFunction_New(v, f->f_globals);
2045 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002046 /* XXX Maybe this should be a separate opcode? */
2047 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002048 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002049 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002051 x = NULL;
2052 break;
2053 }
2054 while (--oparg >= 0) {
2055 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002057 }
2058 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 }
2061 PUSH(x);
2062 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002063
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002064 case MAKE_CLOSURE:
2065 {
2066 int nfree;
2067 v = POP(); /* code object */
2068 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002069 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002070 Py_DECREF(v);
2071 /* XXX Maybe this should be a separate opcode? */
2072 if (x != NULL && nfree > 0) {
2073 v = PyTuple_New(nfree);
2074 if (v == NULL) {
2075 Py_DECREF(x);
2076 x = NULL;
2077 break;
2078 }
2079 while (--nfree >= 0) {
2080 w = POP();
2081 PyTuple_SET_ITEM(v, nfree, w);
2082 }
2083 err = PyFunction_SetClosure(x, v);
2084 Py_DECREF(v);
2085 }
2086 if (x != NULL && oparg > 0) {
2087 v = PyTuple_New(oparg);
2088 if (v == NULL) {
2089 Py_DECREF(x);
2090 x = NULL;
2091 break;
2092 }
2093 while (--oparg >= 0) {
2094 w = POP();
2095 PyTuple_SET_ITEM(v, oparg, w);
2096 }
2097 err = PyFunction_SetDefaults(x, v);
2098 Py_DECREF(v);
2099 }
2100 PUSH(x);
2101 break;
2102 }
2103
Guido van Rossum8861b741996-07-30 16:49:37 +00002104 case BUILD_SLICE:
2105 if (oparg == 3)
2106 w = POP();
2107 else
2108 w = NULL;
2109 v = POP();
2110 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002111 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002112 Py_DECREF(u);
2113 Py_DECREF(v);
2114 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002115 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002116 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002117 break;
2118
Fred Drakeef8ace32000-08-24 00:32:09 +00002119 case EXTENDED_ARG:
2120 opcode = NEXTOP();
2121 oparg = oparg<<16 | NEXTARG();
2122 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002123
Guido van Rossum374a9221991-04-04 10:40:29 +00002124 default:
2125 fprintf(stderr,
2126 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002127 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 why = WHY_EXCEPTION;
2130 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002131
2132#ifdef CASE_TOO_BIG
2133 }
2134#endif
2135
Guido van Rossum374a9221991-04-04 10:40:29 +00002136 } /* switch */
2137
2138 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002139
Guido van Rossum374a9221991-04-04 10:40:29 +00002140 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002141
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002143 if (err == 0 && x != NULL) {
2144#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002145 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002147 fprintf(stderr,
2148 "XXX undetected error\n");
2149 else
2150#endif
2151 continue; /* Normal, fast path */
2152 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 err = 0;
2156 }
2157
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002159
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002162 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002163 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 why = WHY_EXCEPTION;
2165 }
2166 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002167#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002169 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002171 fprintf(stderr,
2172 "XXX undetected error (why=%d)\n",
2173 why);
2174 why = WHY_EXCEPTION;
2175 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002176 }
2177#endif
2178
2179 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002180
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002182 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002184 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002186
Fred Drake8f51f542001-10-04 14:48:42 +00002187 if (tstate->c_tracefunc != NULL)
2188 call_exc_trace(tstate->c_tracefunc,
2189 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002190 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002191
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002193
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 if (why == WHY_RERAISE)
2195 why = WHY_EXCEPTION;
2196
2197 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002198
Tim Peters5ca576e2001-06-18 22:08:13 +00002199 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002201
2202 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2203 /* For a continue inside a try block,
2204 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002205 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2206 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002207 why = WHY_NOT;
2208 JUMPTO(PyInt_AS_LONG(retval));
2209 Py_DECREF(retval);
2210 break;
2211 }
2212
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 while (STACK_LEVEL() > b->b_level) {
2214 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 }
2217 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2218 why = WHY_NOT;
2219 JUMPTO(b->b_handler);
2220 break;
2221 }
2222 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002223 (b->b_type == SETUP_EXCEPT &&
2224 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 PyObject *exc, *val, *tb;
2227 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 val = Py_None;
2230 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002231 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 /* Make the raw exception data
2233 available to the handler,
2234 so a program can emulate the
2235 Python main loop. Don't do
2236 this for 'finally'. */
2237 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002238 PyErr_NormalizeException(
2239 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002240 set_exc_info(tstate,
2241 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002242 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002243 if (tb == NULL) {
2244 Py_INCREF(Py_None);
2245 PUSH(Py_None);
2246 } else
2247 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 PUSH(val);
2249 PUSH(exc);
2250 }
2251 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002252 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002253 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002254 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002255 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 PUSH(v);
2257 }
2258 why = WHY_NOT;
2259 JUMPTO(b->b_handler);
2260 break;
2261 }
2262 } /* unwind stack */
2263
2264 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002265
Guido van Rossum374a9221991-04-04 10:40:29 +00002266 if (why != WHY_NOT)
2267 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002268
Guido van Rossum374a9221991-04-04 10:40:29 +00002269 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002270
Guido van Rossum35974fb2001-12-06 21:28:18 +00002271 if (why != WHY_YIELD) {
2272 /* Pop remaining stack entries -- but when yielding */
2273 while (!EMPTY()) {
2274 v = POP();
2275 Py_XDECREF(v);
2276 }
2277 }
2278
Tim Peters5ca576e2001-06-18 22:08:13 +00002279 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002280 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002281
Fred Drake9e3ad782001-07-03 23:39:52 +00002282 if (tstate->use_tracing) {
2283 if (tstate->c_tracefunc
2284 && (why == WHY_RETURN || why == WHY_YIELD)) {
2285 if (call_trace(tstate->c_tracefunc,
2286 tstate->c_traceobj, f,
2287 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002288 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002289 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002290 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002291 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002292 }
Fred Drake8f51f542001-10-04 14:48:42 +00002293 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002294 if (why == WHY_EXCEPTION)
2295 call_trace_protected(tstate->c_profilefunc,
2296 tstate->c_profileobj, f,
2297 PyTrace_RETURN);
2298 else if (call_trace(tstate->c_profilefunc,
2299 tstate->c_profileobj, f,
2300 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002301 Py_XDECREF(retval);
2302 retval = NULL;
2303 why = WHY_EXCEPTION;
2304 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002305 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002306 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002307
Guido van Rossuma027efa1997-05-05 20:56:21 +00002308 reset_exc_info(tstate);
2309
Tim Peters5ca576e2001-06-18 22:08:13 +00002310 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002311 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002312 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002313
Guido van Rossum96a42c81992-01-12 02:29:51 +00002314 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002315}
2316
Tim Peters6d6c1a32001-08-02 04:15:00 +00002317PyObject *
2318PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002319 PyObject **args, int argcount, PyObject **kws, int kwcount,
2320 PyObject **defs, int defcount, PyObject *closure)
2321{
2322 register PyFrameObject *f;
2323 register PyObject *retval = NULL;
2324 register PyObject **fastlocals, **freevars;
2325 PyThreadState *tstate = PyThreadState_GET();
2326 PyObject *x, *u;
2327
2328 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002329 PyErr_SetString(PyExc_SystemError,
2330 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002331 return NULL;
2332 }
2333
2334 f = PyFrame_New(tstate, /*back*/
2335 co, /*code*/
2336 globals, locals);
2337 if (f == NULL)
2338 return NULL;
2339
2340 fastlocals = f->f_localsplus;
2341 freevars = f->f_localsplus + f->f_nlocals;
2342
2343 if (co->co_argcount > 0 ||
2344 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2345 int i;
2346 int n = argcount;
2347 PyObject *kwdict = NULL;
2348 if (co->co_flags & CO_VARKEYWORDS) {
2349 kwdict = PyDict_New();
2350 if (kwdict == NULL)
2351 goto fail;
2352 i = co->co_argcount;
2353 if (co->co_flags & CO_VARARGS)
2354 i++;
2355 SETLOCAL(i, kwdict);
2356 }
2357 if (argcount > co->co_argcount) {
2358 if (!(co->co_flags & CO_VARARGS)) {
2359 PyErr_Format(PyExc_TypeError,
2360 "%.200s() takes %s %d "
2361 "%sargument%s (%d given)",
2362 PyString_AsString(co->co_name),
2363 defcount ? "at most" : "exactly",
2364 co->co_argcount,
2365 kwcount ? "non-keyword " : "",
2366 co->co_argcount == 1 ? "" : "s",
2367 argcount);
2368 goto fail;
2369 }
2370 n = co->co_argcount;
2371 }
2372 for (i = 0; i < n; i++) {
2373 x = args[i];
2374 Py_INCREF(x);
2375 SETLOCAL(i, x);
2376 }
2377 if (co->co_flags & CO_VARARGS) {
2378 u = PyTuple_New(argcount - n);
2379 if (u == NULL)
2380 goto fail;
2381 SETLOCAL(co->co_argcount, u);
2382 for (i = n; i < argcount; i++) {
2383 x = args[i];
2384 Py_INCREF(x);
2385 PyTuple_SET_ITEM(u, i-n, x);
2386 }
2387 }
2388 for (i = 0; i < kwcount; i++) {
2389 PyObject *keyword = kws[2*i];
2390 PyObject *value = kws[2*i + 1];
2391 int j;
2392 if (keyword == NULL || !PyString_Check(keyword)) {
2393 PyErr_Format(PyExc_TypeError,
2394 "%.200s() keywords must be strings",
2395 PyString_AsString(co->co_name));
2396 goto fail;
2397 }
2398 /* XXX slow -- speed up using dictionary? */
2399 for (j = 0; j < co->co_argcount; j++) {
2400 PyObject *nm = PyTuple_GET_ITEM(
2401 co->co_varnames, j);
2402 int cmp = PyObject_RichCompareBool(
2403 keyword, nm, Py_EQ);
2404 if (cmp > 0)
2405 break;
2406 else if (cmp < 0)
2407 goto fail;
2408 }
2409 /* Check errors from Compare */
2410 if (PyErr_Occurred())
2411 goto fail;
2412 if (j >= co->co_argcount) {
2413 if (kwdict == NULL) {
2414 PyErr_Format(PyExc_TypeError,
2415 "%.200s() got an unexpected "
2416 "keyword argument '%.400s'",
2417 PyString_AsString(co->co_name),
2418 PyString_AsString(keyword));
2419 goto fail;
2420 }
2421 PyDict_SetItem(kwdict, keyword, value);
2422 }
2423 else {
2424 if (GETLOCAL(j) != NULL) {
2425 PyErr_Format(PyExc_TypeError,
2426 "%.200s() got multiple "
2427 "values for keyword "
2428 "argument '%.400s'",
2429 PyString_AsString(co->co_name),
2430 PyString_AsString(keyword));
2431 goto fail;
2432 }
2433 Py_INCREF(value);
2434 SETLOCAL(j, value);
2435 }
2436 }
2437 if (argcount < co->co_argcount) {
2438 int m = co->co_argcount - defcount;
2439 for (i = argcount; i < m; i++) {
2440 if (GETLOCAL(i) == NULL) {
2441 PyErr_Format(PyExc_TypeError,
2442 "%.200s() takes %s %d "
2443 "%sargument%s (%d given)",
2444 PyString_AsString(co->co_name),
2445 ((co->co_flags & CO_VARARGS) ||
2446 defcount) ? "at least"
2447 : "exactly",
2448 m, kwcount ? "non-keyword " : "",
2449 m == 1 ? "" : "s", i);
2450 goto fail;
2451 }
2452 }
2453 if (n > m)
2454 i = n - m;
2455 else
2456 i = 0;
2457 for (; i < defcount; i++) {
2458 if (GETLOCAL(m+i) == NULL) {
2459 PyObject *def = defs[i];
2460 Py_INCREF(def);
2461 SETLOCAL(m+i, def);
2462 }
2463 }
2464 }
2465 }
2466 else {
2467 if (argcount > 0 || kwcount > 0) {
2468 PyErr_Format(PyExc_TypeError,
2469 "%.200s() takes no arguments (%d given)",
2470 PyString_AsString(co->co_name),
2471 argcount + kwcount);
2472 goto fail;
2473 }
2474 }
2475 /* Allocate and initialize storage for cell vars, and copy free
2476 vars into frame. This isn't too efficient right now. */
2477 if (f->f_ncells) {
2478 int i = 0, j = 0, nargs, found;
2479 char *cellname, *argname;
2480 PyObject *c;
2481
2482 nargs = co->co_argcount;
2483 if (co->co_flags & CO_VARARGS)
2484 nargs++;
2485 if (co->co_flags & CO_VARKEYWORDS)
2486 nargs++;
2487
2488 /* Check for cells that shadow args */
2489 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2490 cellname = PyString_AS_STRING(
2491 PyTuple_GET_ITEM(co->co_cellvars, i));
2492 found = 0;
2493 while (j < nargs) {
2494 argname = PyString_AS_STRING(
2495 PyTuple_GET_ITEM(co->co_varnames, j));
2496 if (strcmp(cellname, argname) == 0) {
2497 c = PyCell_New(GETLOCAL(j));
2498 if (c == NULL)
2499 goto fail;
2500 GETLOCAL(f->f_nlocals + i) = c;
2501 found = 1;
2502 break;
2503 }
2504 j++;
2505 }
2506 if (found == 0) {
2507 c = PyCell_New(NULL);
2508 if (c == NULL)
2509 goto fail;
2510 SETLOCAL(f->f_nlocals + i, c);
2511 }
2512 }
2513 /* Initialize any that are left */
2514 while (i < f->f_ncells) {
2515 c = PyCell_New(NULL);
2516 if (c == NULL)
2517 goto fail;
2518 SETLOCAL(f->f_nlocals + i, c);
2519 i++;
2520 }
2521 }
2522 if (f->f_nfreevars) {
2523 int i;
2524 for (i = 0; i < f->f_nfreevars; ++i) {
2525 PyObject *o = PyTuple_GET_ITEM(closure, i);
2526 Py_INCREF(o);
2527 freevars[f->f_ncells + i] = o;
2528 }
2529 }
2530
Tim Peters5ca576e2001-06-18 22:08:13 +00002531 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
Tim Petersb13680b2001-11-27 23:29:29 +00002546 /* decref'ing the frame can cause __del__ methods to get invoked,
2547 which can call back into Python. While we're done with the
2548 current Python frame (f), the associated C stack is still in use,
2549 so recursion_depth must be boosted for the duration.
2550 */
2551 assert(tstate != NULL);
2552 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002553 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002554 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002555 return retval;
2556}
2557
2558
Guido van Rossuma027efa1997-05-05 20:56:21 +00002559static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002560set_exc_info(PyThreadState *tstate,
2561 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562{
2563 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002564 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002565
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 frame = tstate->frame;
2567 if (frame->f_exc_type == NULL) {
2568 /* This frame didn't catch an exception before */
2569 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 if (tstate->exc_type == NULL) {
2571 Py_INCREF(Py_None);
2572 tstate->exc_type = Py_None;
2573 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002574 tmp_type = frame->f_exc_type;
2575 tmp_value = frame->f_exc_value;
2576 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 Py_XINCREF(tstate->exc_type);
2578 Py_XINCREF(tstate->exc_value);
2579 Py_XINCREF(tstate->exc_traceback);
2580 frame->f_exc_type = tstate->exc_type;
2581 frame->f_exc_value = tstate->exc_value;
2582 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002583 Py_XDECREF(tmp_type);
2584 Py_XDECREF(tmp_value);
2585 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 }
2587 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002588 tmp_type = tstate->exc_type;
2589 tmp_value = tstate->exc_value;
2590 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 Py_XINCREF(type);
2592 Py_XINCREF(value);
2593 Py_XINCREF(tb);
2594 tstate->exc_type = type;
2595 tstate->exc_value = value;
2596 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002597 Py_XDECREF(tmp_type);
2598 Py_XDECREF(tmp_value);
2599 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600 /* For b/w compatibility */
2601 PySys_SetObject("exc_type", type);
2602 PySys_SetObject("exc_value", value);
2603 PySys_SetObject("exc_traceback", tb);
2604}
2605
2606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002608{
2609 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002610 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 frame = tstate->frame;
2612 if (frame->f_exc_type != NULL) {
2613 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002614 tmp_type = tstate->exc_type;
2615 tmp_value = tstate->exc_value;
2616 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 Py_XINCREF(frame->f_exc_type);
2618 Py_XINCREF(frame->f_exc_value);
2619 Py_XINCREF(frame->f_exc_traceback);
2620 tstate->exc_type = frame->f_exc_type;
2621 tstate->exc_value = frame->f_exc_value;
2622 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002623 Py_XDECREF(tmp_type);
2624 Py_XDECREF(tmp_value);
2625 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626 /* For b/w compatibility */
2627 PySys_SetObject("exc_type", frame->f_exc_type);
2628 PySys_SetObject("exc_value", frame->f_exc_value);
2629 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2630 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 tmp_type = frame->f_exc_type;
2632 tmp_value = frame->f_exc_value;
2633 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 frame->f_exc_type = NULL;
2635 frame->f_exc_value = NULL;
2636 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002637 Py_XDECREF(tmp_type);
2638 Py_XDECREF(tmp_value);
2639 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640}
2641
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002642/* Logic for the raise statement (too complicated for inlining).
2643 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002644static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002645do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002646{
Guido van Rossumd295f121998-04-09 21:39:57 +00002647 if (type == NULL) {
2648 /* Reraise */
2649 PyThreadState *tstate = PyThreadState_Get();
2650 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2651 value = tstate->exc_value;
2652 tb = tstate->exc_traceback;
2653 Py_XINCREF(type);
2654 Py_XINCREF(value);
2655 Py_XINCREF(tb);
2656 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002657
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002658 /* We support the following forms of raise:
2659 raise <class>, <classinstance>
2660 raise <class>, <argument tuple>
2661 raise <class>, None
2662 raise <class>, <argument>
2663 raise <classinstance>, None
2664 raise <string>, <object>
2665 raise <string>, None
2666
2667 An omitted second argument is the same as None.
2668
2669 In addition, raise <tuple>, <anything> is the same as
2670 raising the tuple's first item (and it better have one!);
2671 this rule is applied recursively.
2672
2673 Finally, an optional third argument can be supplied, which
2674 gives the traceback to be substituted (useful when
2675 re-raising an exception after examining it). */
2676
2677 /* First, check the traceback argument, replacing None with
2678 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 if (tb == Py_None) {
2680 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681 tb = NULL;
2682 }
2683 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002685 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 goto raise_error;
2687 }
2688
2689 /* Next, replace a missing value with None */
2690 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 value = Py_None;
2692 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 }
2694
2695 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2697 PyObject *tmp = type;
2698 type = PyTuple_GET_ITEM(type, 0);
2699 Py_INCREF(type);
2700 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002701 }
2702
Tim Petersafb2c802002-04-18 18:06:20 +00002703 if (PyString_CheckExact(type))
2704 /* Raising builtin string is deprecated but still allowed --
2705 * do nothing. Raising an instance of a new-style str
2706 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002707 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002708
2709 else if (PyClass_Check(type))
2710 PyErr_NormalizeException(&type, &value, &tb);
2711
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002714 if (value != Py_None) {
2715 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002716 "instance exception may not have a separate value");
2717 goto raise_error;
2718 }
2719 else {
2720 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002721 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002722 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2724 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002725 }
2726 }
2727 else {
2728 /* Not something you can raise. You get an exception
2729 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002730 PyErr_Format(PyExc_TypeError,
2731 "exceptions must be strings, classes, or "
2732 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 goto raise_error;
2734 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 if (tb == NULL)
2737 return WHY_EXCEPTION;
2738 else
2739 return WHY_RERAISE;
2740 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 Py_XDECREF(value);
2742 Py_XDECREF(type);
2743 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002744 return WHY_EXCEPTION;
2745}
2746
Tim Petersd6d010b2001-06-21 02:49:55 +00002747/* Iterate v argcnt times and store the results on the stack (via decreasing
2748 sp). Return 1 for success, 0 if error. */
2749
Barry Warsawe42b18f1997-08-25 22:13:04 +00002750static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002751unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002752{
Tim Petersd6d010b2001-06-21 02:49:55 +00002753 int i = 0;
2754 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002755 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002756
Tim Petersd6d010b2001-06-21 02:49:55 +00002757 assert(v != NULL);
2758
2759 it = PyObject_GetIter(v);
2760 if (it == NULL)
2761 goto Error;
2762
2763 for (; i < argcnt; i++) {
2764 w = PyIter_Next(it);
2765 if (w == NULL) {
2766 /* Iterator done, via error or exhaustion. */
2767 if (!PyErr_Occurred()) {
2768 PyErr_Format(PyExc_ValueError,
2769 "need more than %d value%s to unpack",
2770 i, i == 1 ? "" : "s");
2771 }
2772 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002773 }
2774 *--sp = w;
2775 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002776
2777 /* We better have exhausted the iterator now. */
2778 w = PyIter_Next(it);
2779 if (w == NULL) {
2780 if (PyErr_Occurred())
2781 goto Error;
2782 Py_DECREF(it);
2783 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002784 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002785 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002786 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002787 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002788Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002789 for (; i > 0; i--, sp++)
2790 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002791 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002792 return 0;
2793}
2794
2795
Guido van Rossum96a42c81992-01-12 02:29:51 +00002796#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002797static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002798prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002800 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 if (PyObject_Print(v, stdout, 0) != 0)
2802 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002803 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002804 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002806#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808static void
Fred Drake5755ce62001-06-27 19:19:46 +00002809call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002810{
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002812 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002813 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002814 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 value = Py_None;
2816 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002817 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002819 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822 }
Fred Drake5755ce62001-06-27 19:19:46 +00002823 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002825 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002826 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 Py_XDECREF(type);
2829 Py_XDECREF(value);
2830 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002831 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002832}
2833
Fred Drake4ec5d562001-10-04 19:26:43 +00002834static void
2835call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2836 int what)
2837{
2838 PyObject *type, *value, *traceback;
2839 int err;
2840 PyErr_Fetch(&type, &value, &traceback);
2841 err = call_trace(func, obj, frame, what, NULL);
2842 if (err == 0)
2843 PyErr_Restore(type, value, traceback);
2844 else {
2845 Py_XDECREF(type);
2846 Py_XDECREF(value);
2847 Py_XDECREF(traceback);
2848 }
2849}
2850
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002851static int
Fred Drake5755ce62001-06-27 19:19:46 +00002852call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2853 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002854{
Fred Drake5755ce62001-06-27 19:19:46 +00002855 register PyThreadState *tstate = frame->f_tstate;
2856 int result;
2857 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002858 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002859 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002860 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002861 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002862 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2863 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002864 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002865 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002866}
2867
Fred Drake5755ce62001-06-27 19:19:46 +00002868void
2869PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002870{
Fred Drake5755ce62001-06-27 19:19:46 +00002871 PyThreadState *tstate = PyThreadState_Get();
2872 PyObject *temp = tstate->c_profileobj;
2873 Py_XINCREF(arg);
2874 tstate->c_profilefunc = NULL;
2875 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002876 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002877 Py_XDECREF(temp);
2878 tstate->c_profilefunc = func;
2879 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002880 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002881}
2882
2883void
2884PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2885{
2886 PyThreadState *tstate = PyThreadState_Get();
2887 PyObject *temp = tstate->c_traceobj;
2888 Py_XINCREF(arg);
2889 tstate->c_tracefunc = NULL;
2890 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002891 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002892 Py_XDECREF(temp);
2893 tstate->c_tracefunc = func;
2894 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002895 tstate->use_tracing = ((func != NULL)
2896 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002897}
2898
Guido van Rossumb209a111997-04-29 18:18:01 +00002899PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002900PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002901{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002902 PyThreadState *tstate = PyThreadState_Get();
2903 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002904 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002905 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002906 else
2907 return current_frame->f_builtins;
2908}
2909
Guido van Rossumb209a111997-04-29 18:18:01 +00002910PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002912{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002913 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002914 if (current_frame == NULL)
2915 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002916 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002917 return current_frame->f_locals;
2918}
2919
Guido van Rossumb209a111997-04-29 18:18:01 +00002920PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002921PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002922{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002923 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002924 if (current_frame == NULL)
2925 return NULL;
2926 else
2927 return current_frame->f_globals;
2928}
2929
Guido van Rossumb209a111997-04-29 18:18:01 +00002930PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002931PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002932{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002933 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002934 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002935}
2936
Guido van Rossum6135a871995-01-09 17:53:26 +00002937int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002938PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002939{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002940 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002941 return current_frame == NULL ? 0 : current_frame->f_restricted;
2942}
2943
Guido van Rossumbe270261997-05-22 22:26:18 +00002944int
Tim Peters5ba58662001-07-16 02:29:45 +00002945PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002946{
2947 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002948 int result = 0;
2949
2950 if (current_frame != NULL) {
2951 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002952 const int compilerflags = codeflags & PyCF_MASK;
2953 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002954 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002955 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002956 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002957#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002958 if (codeflags & CO_GENERATOR_ALLOWED) {
2959 result = 1;
2960 cf->cf_flags |= CO_GENERATOR_ALLOWED;
2961 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002962#endif
Tim Peters5ba58662001-07-16 02:29:45 +00002963 }
2964 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002965}
2966
2967int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002968Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969{
Guido van Rossumb209a111997-04-29 18:18:01 +00002970 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002971 if (f == NULL)
2972 return 0;
2973 if (!PyFile_SoftSpace(f, 0))
2974 return 0;
2975 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976}
2977
Guido van Rossum3f5da241990-12-20 15:06:42 +00002978
Guido van Rossum681d79a1995-07-18 14:51:37 +00002979/* External interface to call any callable object.
2980 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002981
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002982#undef PyEval_CallObject
2983/* for backward compatibility: export this interface */
2984
Guido van Rossumb209a111997-04-29 18:18:01 +00002985PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002986PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002987{
Guido van Rossumb209a111997-04-29 18:18:01 +00002988 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002989}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002990#define PyEval_CallObject(func,arg) \
2991 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002992
Guido van Rossumb209a111997-04-29 18:18:01 +00002993PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002994PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002995{
Jeremy Hylton52820442001-01-03 23:52:36 +00002996 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002997
2998 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002999 arg = PyTuple_New(0);
3000 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003001 PyErr_SetString(PyExc_TypeError,
3002 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003 return NULL;
3004 }
3005 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003006 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003007
Guido van Rossumb209a111997-04-29 18:18:01 +00003008 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003009 PyErr_SetString(PyExc_TypeError,
3010 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003011 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003012 return NULL;
3013 }
3014
Tim Peters6d6c1a32001-08-02 04:15:00 +00003015 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003016 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003017 return result;
3018}
3019
Tim Peters6d6c1a32001-08-02 04:15:00 +00003020char *
3021PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003022{
3023 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003024 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003025 else if (PyFunction_Check(func))
3026 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3027 else if (PyCFunction_Check(func))
3028 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3029 else if (PyClass_Check(func))
3030 return PyString_AsString(((PyClassObject*)func)->cl_name);
3031 else if (PyInstance_Check(func)) {
3032 return PyString_AsString(
3033 ((PyInstanceObject*)func)->in_class->cl_name);
3034 } else {
3035 return func->ob_type->tp_name;
3036 }
3037}
3038
Tim Peters6d6c1a32001-08-02 04:15:00 +00003039char *
3040PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003041{
3042 if (PyMethod_Check(func))
3043 return "()";
3044 else if (PyFunction_Check(func))
3045 return "()";
3046 else if (PyCFunction_Check(func))
3047 return "()";
3048 else if (PyClass_Check(func))
3049 return " constructor";
3050 else if (PyInstance_Check(func)) {
3051 return " instance";
3052 } else {
3053 return " object";
3054 }
3055}
3056
Jeremy Hylton52820442001-01-03 23:52:36 +00003057#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3058
3059/* The two fast_xxx() functions optimize calls for which no argument
3060 tuple is necessary; the objects are passed directly from the stack.
3061 fast_cfunction() is called for METH_OLDARGS functions.
3062 fast_function() is for functions with no special argument handling.
3063*/
3064
3065static PyObject *
3066fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3067{
3068 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3069 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003070 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003071
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003072 switch (flags) {
3073 case METH_OLDARGS:
3074 if (na == 0)
3075 return (*meth)(self, NULL);
3076 else if (na == 1) {
3077 PyObject *arg = EXT_POP(*pp_stack);
3078 PyObject *result = (*meth)(self, arg);
3079 Py_DECREF(arg);
3080 return result;
3081 } else {
3082 PyObject *args = load_args(pp_stack, na);
3083 PyObject *result = (*meth)(self, args);
3084 Py_DECREF(args);
3085 return result;
3086 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003087 case METH_NOARGS:
3088 if (na == 0)
3089 return (*meth)(self, NULL);
3090 PyErr_Format(PyExc_TypeError,
3091 "%.200s() takes no arguments (%d given)",
3092 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3093 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003094 case METH_O:
3095 if (na == 1) {
3096 PyObject *arg = EXT_POP(*pp_stack);
3097 PyObject *result = (*meth)(self, arg);
3098 Py_DECREF(arg);
3099 return result;
3100 }
3101 PyErr_Format(PyExc_TypeError,
3102 "%.200s() takes exactly one argument (%d given)",
3103 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3104 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003105 default:
3106 fprintf(stderr, "%.200s() flags = %d\n",
3107 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3108 PyErr_BadInternalCall();
3109 return NULL;
3110 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003111}
3112
3113static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003114fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003115{
3116 PyObject *co = PyFunction_GET_CODE(func);
3117 PyObject *globals = PyFunction_GET_GLOBALS(func);
3118 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003119 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003120 PyObject **d = NULL;
3121 int nd = 0;
3122
3123 if (argdefs != NULL) {
3124 d = &PyTuple_GET_ITEM(argdefs, 0);
3125 nd = ((PyTupleObject *)argdefs)->ob_size;
3126 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003127 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003128 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003129 (*pp_stack)-2*nk, nk, d, nd,
3130 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003131}
3132
3133static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003134update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3135 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003136{
3137 PyObject *kwdict = NULL;
3138 if (orig_kwdict == NULL)
3139 kwdict = PyDict_New();
3140 else {
3141 kwdict = PyDict_Copy(orig_kwdict);
3142 Py_DECREF(orig_kwdict);
3143 }
3144 if (kwdict == NULL)
3145 return NULL;
3146 while (--nk >= 0) {
3147 int err;
3148 PyObject *value = EXT_POP(*pp_stack);
3149 PyObject *key = EXT_POP(*pp_stack);
3150 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003151 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003152 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003153 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003154 PyEval_GetFuncName(func),
3155 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003156 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003157 Py_DECREF(key);
3158 Py_DECREF(value);
3159 Py_DECREF(kwdict);
3160 return NULL;
3161 }
3162 err = PyDict_SetItem(kwdict, key, value);
3163 Py_DECREF(key);
3164 Py_DECREF(value);
3165 if (err) {
3166 Py_DECREF(kwdict);
3167 return NULL;
3168 }
3169 }
3170 return kwdict;
3171}
3172
3173static PyObject *
3174update_star_args(int nstack, int nstar, PyObject *stararg,
3175 PyObject ***pp_stack)
3176{
3177 PyObject *callargs, *w;
3178
3179 callargs = PyTuple_New(nstack + nstar);
3180 if (callargs == NULL) {
3181 return NULL;
3182 }
3183 if (nstar) {
3184 int i;
3185 for (i = 0; i < nstar; i++) {
3186 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3187 Py_INCREF(a);
3188 PyTuple_SET_ITEM(callargs, nstack + i, a);
3189 }
3190 }
3191 while (--nstack >= 0) {
3192 w = EXT_POP(*pp_stack);
3193 PyTuple_SET_ITEM(callargs, nstack, w);
3194 }
3195 return callargs;
3196}
3197
3198static PyObject *
3199load_args(PyObject ***pp_stack, int na)
3200{
3201 PyObject *args = PyTuple_New(na);
3202 PyObject *w;
3203
3204 if (args == NULL)
3205 return NULL;
3206 while (--na >= 0) {
3207 w = EXT_POP(*pp_stack);
3208 PyTuple_SET_ITEM(args, na, w);
3209 }
3210 return args;
3211}
3212
3213static PyObject *
3214do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3215{
3216 PyObject *callargs = NULL;
3217 PyObject *kwdict = NULL;
3218 PyObject *result = NULL;
3219
3220 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003221 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003222 if (kwdict == NULL)
3223 goto call_fail;
3224 }
3225 callargs = load_args(pp_stack, na);
3226 if (callargs == NULL)
3227 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003228 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003229 call_fail:
3230 Py_XDECREF(callargs);
3231 Py_XDECREF(kwdict);
3232 return result;
3233}
3234
3235static PyObject *
3236ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3237{
3238 int nstar = 0;
3239 PyObject *callargs = NULL;
3240 PyObject *stararg = NULL;
3241 PyObject *kwdict = NULL;
3242 PyObject *result = NULL;
3243
3244 if (flags & CALL_FLAG_KW) {
3245 kwdict = EXT_POP(*pp_stack);
3246 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003247 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003248 "%s%s argument after ** "
3249 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003250 PyEval_GetFuncName(func),
3251 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003252 goto ext_call_fail;
3253 }
3254 }
3255 if (flags & CALL_FLAG_VAR) {
3256 stararg = EXT_POP(*pp_stack);
3257 if (!PyTuple_Check(stararg)) {
3258 PyObject *t = NULL;
3259 t = PySequence_Tuple(stararg);
3260 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003261 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3262 PyErr_Format(PyExc_TypeError,
3263 "%s%s argument after * "
3264 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003265 PyEval_GetFuncName(func),
3266 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003267 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003268 goto ext_call_fail;
3269 }
3270 Py_DECREF(stararg);
3271 stararg = t;
3272 }
3273 nstar = PyTuple_GET_SIZE(stararg);
3274 }
3275 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003276 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003277 if (kwdict == NULL)
3278 goto ext_call_fail;
3279 }
3280 callargs = update_star_args(na, nstar, stararg, pp_stack);
3281 if (callargs == NULL)
3282 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003283 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003284 ext_call_fail:
3285 Py_XDECREF(callargs);
3286 Py_XDECREF(kwdict);
3287 Py_XDECREF(stararg);
3288 return result;
3289}
3290
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003291#define SLICE_ERROR_MSG \
3292 "standard sequence type does not support step size other than one"
3293
Tim Peterscb479e72001-12-16 19:11:44 +00003294/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3295 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3296 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3297*/
Tim Petersb5196382001-12-16 19:44:20 +00003298/* Note: If v is NULL, return success without storing into *pi. This
3299 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3300 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003301*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003302int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003303_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304{
Tim Petersb5196382001-12-16 19:44:20 +00003305 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003306 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003307 if (PyInt_Check(v)) {
3308 x = PyInt_AsLong(v);
3309 } else if (PyLong_Check(v)) {
3310 x = PyLong_AsLong(v);
3311 if (x==-1 && PyErr_Occurred()) {
3312 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003313 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003314
Guido van Rossumac7be682001-01-17 15:42:30 +00003315 if (!PyErr_ExceptionMatches(
3316 PyExc_OverflowError)) {
3317 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003318 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003319 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003320 }
3321
Guido van Rossumac7be682001-01-17 15:42:30 +00003322 /* Clear the OverflowError */
3323 PyErr_Clear();
3324
3325 /* It's an overflow error, so we need to
3326 check the sign of the long integer,
3327 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003328 the error. */
3329
3330 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003331 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003332 if (long_zero == NULL)
3333 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003334
3335 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003336 cmp = PyObject_RichCompareBool(v, long_zero,
3337 Py_GT);
3338 Py_DECREF(long_zero);
3339 if (cmp < 0)
3340 return 0;
3341 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003342 x = INT_MAX;
3343 else
3344 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003345 }
3346 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003347 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003348 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003349 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003351 /* Truncate -- very long indices are truncated anyway */
3352 if (x > INT_MAX)
3353 x = INT_MAX;
3354 else if (x < -INT_MAX)
3355 x = 0;
3356 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003357 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003358 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359}
3360
Guido van Rossum50d756e2001-08-18 17:43:36 +00003361#undef ISINT
3362#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3363
Guido van Rossumb209a111997-04-29 18:18:01 +00003364static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003365apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003367 PyTypeObject *tp = u->ob_type;
3368 PySequenceMethods *sq = tp->tp_as_sequence;
3369
3370 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3371 int ilow = 0, ihigh = INT_MAX;
3372 if (!_PyEval_SliceIndex(v, &ilow))
3373 return NULL;
3374 if (!_PyEval_SliceIndex(w, &ihigh))
3375 return NULL;
3376 return PySequence_GetSlice(u, ilow, ihigh);
3377 }
3378 else {
3379 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003380 if (slice != NULL) {
3381 PyObject *res = PyObject_GetItem(u, slice);
3382 Py_DECREF(slice);
3383 return res;
3384 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003385 else
3386 return NULL;
3387 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003389
3390static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003391assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3392 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003394 PyTypeObject *tp = u->ob_type;
3395 PySequenceMethods *sq = tp->tp_as_sequence;
3396
3397 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3398 int ilow = 0, ihigh = INT_MAX;
3399 if (!_PyEval_SliceIndex(v, &ilow))
3400 return -1;
3401 if (!_PyEval_SliceIndex(w, &ihigh))
3402 return -1;
3403 if (x == NULL)
3404 return PySequence_DelSlice(u, ilow, ihigh);
3405 else
3406 return PySequence_SetSlice(u, ilow, ihigh, x);
3407 }
3408 else {
3409 PyObject *slice = PySlice_New(v, w, NULL);
3410 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003411 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003412 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003413 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003414 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003415 res = PyObject_DelItem(u, slice);
3416 Py_DECREF(slice);
3417 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003418 }
3419 else
3420 return -1;
3421 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422}
3423
Guido van Rossumb209a111997-04-29 18:18:01 +00003424static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003425cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426{
Guido van Rossumac7be682001-01-17 15:42:30 +00003427 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003429 case PyCmp_IS:
3430 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003431 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003432 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003433 res = !res;
3434 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003435 case PyCmp_IN:
3436 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003437 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003438 if (res < 0)
3439 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003440 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003441 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003443 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003444 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445 break;
3446 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003447 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003449 v = res ? Py_True : Py_False;
3450 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 return v;
3452}
3453
Thomas Wouters52152252000-08-17 22:55:00 +00003454static PyObject *
3455import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003456{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003457 PyObject *x;
3458
3459 x = PyObject_GetAttr(v, name);
3460 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003461 PyErr_Format(PyExc_ImportError,
3462 "cannot import name %.230s",
3463 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003464 }
Thomas Wouters52152252000-08-17 22:55:00 +00003465 return x;
3466}
Guido van Rossumac7be682001-01-17 15:42:30 +00003467
Thomas Wouters52152252000-08-17 22:55:00 +00003468static int
3469import_all_from(PyObject *locals, PyObject *v)
3470{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003471 PyObject *all = PyObject_GetAttrString(v, "__all__");
3472 PyObject *dict, *name, *value;
3473 int skip_leading_underscores = 0;
3474 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003475
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003476 if (all == NULL) {
3477 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3478 return -1; /* Unexpected error */
3479 PyErr_Clear();
3480 dict = PyObject_GetAttrString(v, "__dict__");
3481 if (dict == NULL) {
3482 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3483 return -1;
3484 PyErr_SetString(PyExc_ImportError,
3485 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003486 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003487 }
3488 all = PyMapping_Keys(dict);
3489 Py_DECREF(dict);
3490 if (all == NULL)
3491 return -1;
3492 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003493 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003494
3495 for (pos = 0, err = 0; ; pos++) {
3496 name = PySequence_GetItem(all, pos);
3497 if (name == NULL) {
3498 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3499 err = -1;
3500 else
3501 PyErr_Clear();
3502 break;
3503 }
3504 if (skip_leading_underscores &&
3505 PyString_Check(name) &&
3506 PyString_AS_STRING(name)[0] == '_')
3507 {
3508 Py_DECREF(name);
3509 continue;
3510 }
3511 value = PyObject_GetAttr(v, name);
3512 if (value == NULL)
3513 err = -1;
3514 else
3515 err = PyDict_SetItem(locals, name, value);
3516 Py_DECREF(name);
3517 Py_XDECREF(value);
3518 if (err != 0)
3519 break;
3520 }
3521 Py_DECREF(all);
3522 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003523}
3524
Guido van Rossumb209a111997-04-29 18:18:01 +00003525static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003526build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003527{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003528 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003529
3530 if (PyDict_Check(methods))
3531 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003532 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003533 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003534 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3535 base = PyTuple_GET_ITEM(bases, 0);
3536 metaclass = PyObject_GetAttrString(base, "__class__");
3537 if (metaclass == NULL) {
3538 PyErr_Clear();
3539 metaclass = (PyObject *)base->ob_type;
3540 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003541 }
3542 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003543 else {
3544 PyObject *g = PyEval_GetGlobals();
3545 if (g != NULL && PyDict_Check(g))
3546 metaclass = PyDict_GetItemString(g, "__metaclass__");
3547 if (metaclass == NULL)
3548 metaclass = (PyObject *) &PyClass_Type;
3549 Py_INCREF(metaclass);
3550 }
3551 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3552 Py_DECREF(metaclass);
3553 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003554}
3555
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003556static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003557exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3558 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003559{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003560 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003561 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003562 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003563
Guido van Rossumb209a111997-04-29 18:18:01 +00003564 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3565 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003566 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003567 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003568 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003569 locals = PyTuple_GetItem(prog, 2);
3570 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003571 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003572 if (globals == Py_None) {
3573 globals = PyEval_GetGlobals();
3574 if (locals == Py_None) {
3575 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003576 plain = 1;
3577 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003578 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003579 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003580 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003581 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003582 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003583 !PyCode_Check(prog) &&
3584 !PyFile_Check(prog)) {
3585 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003586 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003587 return -1;
3588 }
Fred Drake661ea262000-10-24 19:57:45 +00003589 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003590 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003591 "exec: arg 2 must be a dictionary or None");
3592 return -1;
3593 }
3594 if (!PyDict_Check(locals)) {
3595 PyErr_SetString(PyExc_TypeError,
3596 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003597 return -1;
3598 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003599 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003600 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003601 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003602 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3603 PyErr_SetString(PyExc_TypeError,
3604 "code object passed to exec may not contain free variables");
3605 return -1;
3606 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003607 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003608 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003609 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003610 FILE *fp = PyFile_AsFile(prog);
3611 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003612 PyCompilerFlags cf;
3613 cf.cf_flags = 0;
3614 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003615 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3616 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003617 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003618 v = PyRun_File(fp, name, Py_file_input, globals,
3619 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003620 }
3621 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003622 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003623 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003624 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003625 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003626 cf.cf_flags = 0;
3627 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003628 v = PyRun_StringFlags(str, Py_file_input, globals,
3629 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003630 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003631 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003632 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003633 if (plain)
3634 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003635 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003636 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003637 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003638 return 0;
3639}
Guido van Rossum24c13741995-02-14 09:42:43 +00003640
Guido van Rossumac7be682001-01-17 15:42:30 +00003641static void
Paul Prescode68140d2000-08-30 20:25:01 +00003642format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3643{
3644 char *obj_str;
3645
3646 if (!obj)
3647 return;
3648
3649 obj_str = PyString_AsString(obj);
3650 if (!obj_str)
3651 return;
3652
3653 PyErr_Format(exc, format_str, obj_str);
3654}
Guido van Rossum950361c1997-01-24 13:49:28 +00003655
3656#ifdef DYNAMIC_EXECUTION_PROFILE
3657
Skip Montanarof118cb12001-10-15 20:51:38 +00003658static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003659getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003660{
3661 int i;
3662 PyObject *l = PyList_New(256);
3663 if (l == NULL) return NULL;
3664 for (i = 0; i < 256; i++) {
3665 PyObject *x = PyInt_FromLong(a[i]);
3666 if (x == NULL) {
3667 Py_DECREF(l);
3668 return NULL;
3669 }
3670 PyList_SetItem(l, i, x);
3671 }
3672 for (i = 0; i < 256; i++)
3673 a[i] = 0;
3674 return l;
3675}
3676
3677PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003678_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003679{
3680#ifndef DXPAIRS
3681 return getarray(dxp);
3682#else
3683 int i;
3684 PyObject *l = PyList_New(257);
3685 if (l == NULL) return NULL;
3686 for (i = 0; i < 257; i++) {
3687 PyObject *x = getarray(dxpairs[i]);
3688 if (x == NULL) {
3689 Py_DECREF(l);
3690 return NULL;
3691 }
3692 PyList_SetItem(l, i, x);
3693 }
3694 return l;
3695#endif
3696}
3697
3698#endif