blob: e174d095e40010a1875b7135a4d339e620250d19 [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
Tim Peters0c322792002-07-17 16:49:03 +0000181static PyTypeObject gentype = {
Tim Peters5ca576e2001-06-18 22:08:13 +0000182 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;
Guido van Rossum04e70322002-07-17 16:57:13 +0000382 if (j == pendingfirst) {
383 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000384 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000385 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000386 pendingcalls[i].func = func;
387 pendingcalls[i].arg = arg;
388 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000390 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000391 /* XXX End critical section */
392 return 0;
393}
394
Guido van Rossum180d7b41994-09-29 09:45:57 +0000395int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000396Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000397{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000398 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000399#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000400 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000401 return 0;
402#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000403 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000404 return 0;
405 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000406 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000407 for (;;) {
408 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000409 int (*func)(void *);
410 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 i = pendingfirst;
412 if (i == pendinglast)
413 break; /* Queue empty */
414 func = pendingcalls[i].func;
415 arg = pendingcalls[i].arg;
416 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417 if (func(arg) < 0) {
418 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000419 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000421 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000422 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000423 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000424 return 0;
425}
426
427
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000428/* The interpreter's recursion limit */
429
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000430static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000431
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000432int
433Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000434{
435 return recursion_limit;
436}
437
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000438void
439Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000440{
441 recursion_limit = new_limit;
442}
443
Guido van Rossum374a9221991-04-04 10:40:29 +0000444/* Status code for main loop (reason for stack unwind) */
445
446enum why_code {
447 WHY_NOT, /* No error */
448 WHY_EXCEPTION, /* Exception occurred */
449 WHY_RERAISE, /* Exception re-raised by 'finally' */
450 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000451 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000452 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000453 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000454};
455
Tim Petersdbd9ba62000-07-09 03:09:57 +0000456static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000457static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000458
Guido van Rossum374a9221991-04-04 10:40:29 +0000459
Guido van Rossumb209a111997-04-29 18:18:01 +0000460PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000461PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 (PyObject **)NULL, 0,
466 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000467 (PyObject **)NULL, 0,
468 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469}
470
471
472/* Interpreter main loop */
473
Tim Peters6d6c1a32001-08-02 04:15:00 +0000474static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000475eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000476{
Guido van Rossum950361c1997-01-24 13:49:28 +0000477#ifdef DXPAIRS
478 int lastopcode = 0;
479#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000480 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000481 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000482 register int opcode=0; /* Current opcode */
483 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000484 register enum why_code why; /* Reason for block stack unwind */
485 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000486 register PyObject *x; /* Result object -- NULL if error */
487 register PyObject *v; /* Temporary objects popped off stack */
488 register PyObject *w;
489 register PyObject *u;
490 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000491 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000492 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000493 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000494 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000495 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000496 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000497 PyObject *names;
498 PyObject *consts;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000499#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000500 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000501#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000502#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000504 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000505#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000506
Neal Norwitza81d2202002-07-14 00:27:26 +0000507/* Tuple access macros */
508
509#ifndef Py_DEBUG
510#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
511#else
512#define GETITEM(v, i) PyTuple_GetItem((v), (i))
513#endif
514
Guido van Rossum374a9221991-04-04 10:40:29 +0000515/* Code access macros */
516
Skip Montanaro04d80f82002-08-04 21:03:35 +0000517#define GETNAMEV(i) (GETITEM(names, (i)))
Guido van Rossumd076c731998-10-07 19:42:25 +0000518#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#define NEXTOP() (*next_instr++)
520#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000521#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000522#define JUMPBY(x) (next_instr += (x))
523
524/* Stack manipulation macros */
525
526#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
527#define EMPTY() (STACK_LEVEL() == 0)
528#define TOP() (stack_pointer[-1])
529#define BASIC_PUSH(v) (*stack_pointer++ = (v))
530#define BASIC_POP() (*--stack_pointer)
531
Guido van Rossum96a42c81992-01-12 02:29:51 +0000532#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000533#define PUSH(v) { (void)(BASIC_PUSH(v), \
534 lltrace && prtrace(TOP(), "push")); \
535 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000536#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000537#else
538#define PUSH(v) BASIC_PUSH(v)
539#define POP() BASIC_POP()
540#endif
541
Guido van Rossum681d79a1995-07-18 14:51:37 +0000542/* Local variable macros */
543
544#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000545
546/* The SETLOCAL() macro must not DECREF the local variable in-place and
547 then store the new value; it must copy the old value to a temporary
548 value, then store the new value, and then DECREF the temporary value.
549 This is because it is possible that during the DECREF the frame is
550 accessed by other code (e.g. a __del__ method or gc.collect()) and the
551 variable would be pointing to already-freed memory. */
552#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
553 GETLOCAL(i) = value; \
554 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000555
Guido van Rossuma027efa1997-05-05 20:56:21 +0000556/* Start of code */
557
Tim Peters5ca576e2001-06-18 22:08:13 +0000558 if (f == NULL)
559 return NULL;
560
Guido van Rossum8861b741996-07-30 16:49:37 +0000561#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000562 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000563 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000564 return NULL;
565 }
566#endif
567
Tim Peters5ca576e2001-06-18 22:08:13 +0000568 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000569 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000570 --tstate->recursion_depth;
571 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000572 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000574 return NULL;
575 }
576
Tim Peters5ca576e2001-06-18 22:08:13 +0000577 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000578 co = f->f_code;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000579 names = co->co_names;
580 consts = co->co_consts;
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 fastlocals = f->f_localsplus;
582 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000583 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000584 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000585 stack_pointer = f->f_stacktop;
586 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000587 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000588
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000589 if (tstate->use_tracing) {
590 if (tstate->c_tracefunc != NULL) {
591 /* tstate->c_tracefunc, if defined, is a
592 function that will be called on *every* entry
593 to a code block. Its return value, if not
594 None, is a function that will be called at
595 the start of each executed line of code.
596 (Actually, the function must return itself
597 in order to continue tracing.) The trace
598 functions are called with three arguments:
599 a pointer to the current frame, a string
600 indicating why the function is called, and
601 an argument which depends on the situation.
602 The global trace function is also called
603 whenever an exception is detected. */
604 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
605 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000606 /* Trace function raised an error */
607 return NULL;
608 }
609 }
610 if (tstate->c_profilefunc != NULL) {
611 /* Similar for c_profilefunc, except it needn't
612 return itself and isn't called for "line" events */
613 if (call_trace(tstate->c_profilefunc,
614 tstate->c_profileobj,
615 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000616 /* Profile function raised an error */
617 return NULL;
618 }
619 }
620 }
621
Tim Peters5ca576e2001-06-18 22:08:13 +0000622#ifdef LLTRACE
623 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
624#endif
625#if defined(Py_DEBUG) || defined(LLTRACE)
626 filename = PyString_AsString(co->co_filename);
627#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000628
Guido van Rossum374a9221991-04-04 10:40:29 +0000629 why = WHY_NOT;
630 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000631 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000632 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000635 assert(stack_pointer >= f->f_valuestack); /* else underflow */
636 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000637 /* Do periodic things. Doing this every time through
638 the loop would add too much overhead, so we do it
639 only every Nth instruction. We also do it if
640 ``things_to_do'' is set, i.e. when an asynchronous
641 event needs attention (e.g. a signal handler or
642 async I/O handler); see Py_AddPendingCall() and
643 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000644
Guido van Rossuma027efa1997-05-05 20:56:21 +0000645 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000646 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000648 if (Py_MakePendingCalls() < 0) {
649 why = WHY_EXCEPTION;
650 goto on_error;
651 }
652 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000653#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000654 /* If we have true signals, the signal handler
655 will call Py_AddPendingCall() so we don't
656 have to call sigcheck(). On the Mac and
657 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000658 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 goto on_error;
661 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000662#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663
Guido van Rossume59214e1994-08-30 08:01:59 +0000664#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665 if (interpreter_lock) {
666 /* Give another thread a chance */
667
Guido van Rossum25ce5661997-08-02 03:10:38 +0000668 if (PyThreadState_Swap(NULL) != tstate)
669 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000670 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671
672 /* Other threads may run now */
673
Guido van Rossum65d5b571998-12-21 19:32:43 +0000674 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000675 if (PyThreadState_Swap(tstate) != NULL)
676 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 }
678#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680
Neil Schemenauer63543862002-02-17 19:10:14 +0000681 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000683
Guido van Rossum408027e1996-12-30 16:17:54 +0000684#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000685 f->f_lasti = INSTR_OFFSET();
686#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000687
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 opcode = NEXTOP();
689 if (HAS_ARG(opcode))
690 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000691 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000692#ifdef DYNAMIC_EXECUTION_PROFILE
693#ifdef DXPAIRS
694 dxpairs[lastopcode][opcode]++;
695 lastopcode = opcode;
696#endif
697 dxp[opcode]++;
698#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000699
Guido van Rossum96a42c81992-01-12 02:29:51 +0000700#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000702
Guido van Rossum96a42c81992-01-12 02:29:51 +0000703 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 if (HAS_ARG(opcode)) {
705 printf("%d: %d, %d\n",
706 (int) (INSTR_OFFSET() - 3),
707 opcode, oparg);
708 }
709 else {
710 printf("%d: %d\n",
711 (int) (INSTR_OFFSET() - 1), opcode);
712 }
713 }
714#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000716
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 /* BEWARE!
720 It is essential that any operation that fails sets either
721 x to NULL, err to nonzero, or why to anything but WHY_NOT,
722 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000723
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000725
Neil Schemenauer63543862002-02-17 19:10:14 +0000726 case SET_LINENO:
727#ifdef LLTRACE
728 if (lltrace)
729 printf("--- %s:%d \n", filename, oparg);
730#endif
731 f->f_lineno = oparg;
732 if (tstate->c_tracefunc == NULL || tstate->tracing)
733 goto fast_next_opcode;
734 /* Trace each line of code reached */
735 f->f_lasti = INSTR_OFFSET();
736 /* Inline call_trace() for performance: */
737 tstate->tracing++;
738 tstate->use_tracing = 0;
739 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
740 PyTrace_LINE, Py_None);
741 tstate->use_tracing = (tstate->c_tracefunc
742 || tstate->c_profilefunc);
743 tstate->tracing--;
744 break;
745
746 case LOAD_FAST:
747 x = GETLOCAL(oparg);
748 if (x != NULL) {
749 Py_INCREF(x);
750 PUSH(x);
751 goto fast_next_opcode;
752 }
753 format_exc_check_arg(PyExc_UnboundLocalError,
754 UNBOUNDLOCAL_ERROR_MSG,
755 PyTuple_GetItem(co->co_varnames, oparg));
756 break;
757
758 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000759 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000760 Py_INCREF(x);
761 PUSH(x);
762 goto fast_next_opcode;
763
764 case STORE_FAST:
765 v = POP();
766 SETLOCAL(oparg, v);
767 goto fast_next_opcode;
768
Guido van Rossum374a9221991-04-04 10:40:29 +0000769 case POP_TOP:
770 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000771 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000772 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000773
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 case ROT_TWO:
775 v = POP();
776 w = POP();
777 PUSH(v);
778 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000779 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000780
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 case ROT_THREE:
782 v = POP();
783 w = POP();
784 x = POP();
785 PUSH(v);
786 PUSH(x);
787 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000789
Thomas Wouters434d0822000-08-24 20:11:32 +0000790 case ROT_FOUR:
791 u = POP();
792 v = POP();
793 w = POP();
794 x = POP();
795 PUSH(u);
796 PUSH(x);
797 PUSH(w);
798 PUSH(v);
799 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000800
Guido van Rossum374a9221991-04-04 10:40:29 +0000801 case DUP_TOP:
802 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000803 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000804 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000805 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000806
Thomas Wouters434d0822000-08-24 20:11:32 +0000807 case DUP_TOPX:
808 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000809 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000810 x = TOP();
811 Py_INCREF(x);
812 PUSH(x);
813 continue;
814 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000815 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000816 Py_INCREF(x);
817 w = TOP();
818 Py_INCREF(w);
819 PUSH(x);
820 PUSH(w);
821 PUSH(x);
822 continue;
823 case 3:
824 x = POP();
825 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000826 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000827 Py_INCREF(w);
828 v = TOP();
829 Py_INCREF(v);
830 PUSH(w);
831 PUSH(x);
832 PUSH(v);
833 PUSH(w);
834 PUSH(x);
835 continue;
836 case 4:
837 x = POP();
838 Py_INCREF(x);
839 w = POP();
840 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000841 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000842 Py_INCREF(v);
843 u = TOP();
844 Py_INCREF(u);
845 PUSH(v);
846 PUSH(w);
847 PUSH(x);
848 PUSH(u);
849 PUSH(v);
850 PUSH(w);
851 PUSH(x);
852 continue;
853 case 5:
854 x = POP();
855 Py_INCREF(x);
856 w = POP();
857 Py_INCREF(w);
858 v = POP();
859 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000860 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000861 Py_INCREF(u);
862 t = TOP();
863 Py_INCREF(t);
864 PUSH(u);
865 PUSH(v);
866 PUSH(w);
867 PUSH(x);
868 PUSH(t);
869 PUSH(u);
870 PUSH(v);
871 PUSH(w);
872 PUSH(x);
873 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000874 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000875 Py_FatalError("invalid argument to DUP_TOPX"
876 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000877 }
Tim Peters35ba6892000-10-11 07:04:49 +0000878 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000879
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 case UNARY_POSITIVE:
881 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000882 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000883 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000885 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000887
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 case UNARY_NEGATIVE:
889 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000890 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000893 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000895
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 case UNARY_NOT:
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 if (err == 0) {
901 Py_INCREF(Py_True);
902 PUSH(Py_True);
903 continue;
904 }
905 else if (err > 0) {
906 Py_INCREF(Py_False);
907 PUSH(Py_False);
908 err = 0;
909 continue;
910 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 case UNARY_CONVERT:
914 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000915 x = PyObject_Repr(v);
916 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000918 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000920
Guido van Rossum7928cd71991-10-24 14:59:31 +0000921 case UNARY_INVERT:
922 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000923 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000925 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000926 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000927 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000928
Guido van Rossum50564e81996-01-12 01:13:16 +0000929 case BINARY_POWER:
930 w = POP();
931 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000932 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000933 Py_DECREF(v);
934 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000935 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000936 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000937 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000938
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 case BINARY_MULTIPLY:
940 w = POP();
941 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000942 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000943 Py_DECREF(v);
944 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000946 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000948
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000950 if (!_Py_QnewFlag) {
951 w = POP();
952 v = POP();
953 x = PyNumber_Divide(v, w);
954 Py_DECREF(v);
955 Py_DECREF(w);
956 PUSH(x);
957 if (x != NULL) continue;
958 break;
959 }
960 /* -Qnew is in effect: fall through to
961 BINARY_TRUE_DIVIDE */
962 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 w = POP();
964 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000965 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000966 Py_DECREF(v);
967 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000969 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000971
Guido van Rossum4668b002001-08-08 05:00:18 +0000972 case BINARY_FLOOR_DIVIDE:
973 w = POP();
974 v = POP();
975 x = PyNumber_FloorDivide(v, w);
976 Py_DECREF(v);
977 Py_DECREF(w);
978 PUSH(x);
979 if (x != NULL) continue;
980 break;
981
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 case BINARY_MODULO:
983 w = POP();
984 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000985 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 Py_DECREF(v);
987 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000989 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000991
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 case BINARY_ADD:
993 w = POP();
994 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000995 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000996 /* INLINE: int + int */
997 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000998 a = PyInt_AS_LONG(v);
999 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001000 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001001 if ((i^a) < 0 && (i^b) < 0)
1002 goto slow_add;
1003 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001004 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001005 else {
1006 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001007 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001008 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001009 Py_DECREF(v);
1010 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001011 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001012 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001014
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 case BINARY_SUBTRACT:
1016 w = POP();
1017 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001018 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001019 /* INLINE: int - int */
1020 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001021 a = PyInt_AS_LONG(v);
1022 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001023 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001024 if ((i^a) < 0 && (i^~b) < 0)
1025 goto slow_sub;
1026 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001027 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001028 else {
1029 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001030 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001031 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 Py_DECREF(v);
1033 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001035 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001037
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 case BINARY_SUBSCR:
1039 w = POP();
1040 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001041 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001042 /* INLINE: list[int] */
1043 long i = PyInt_AsLong(w);
1044 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001045 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001046 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001047 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001048 PyErr_SetString(PyExc_IndexError,
1049 "list index out of range");
1050 x = NULL;
1051 }
1052 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001053 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001054 Py_INCREF(x);
1055 }
1056 }
1057 else
1058 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001059 Py_DECREF(v);
1060 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001062 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Guido van Rossum7928cd71991-10-24 14:59:31 +00001065 case BINARY_LSHIFT:
1066 w = POP();
1067 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001068 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001069 Py_DECREF(v);
1070 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001071 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001072 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001073 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001074
Guido van Rossum7928cd71991-10-24 14:59:31 +00001075 case BINARY_RSHIFT:
1076 w = POP();
1077 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001078 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001079 Py_DECREF(v);
1080 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001081 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001082 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001083 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001084
Guido van Rossum7928cd71991-10-24 14:59:31 +00001085 case BINARY_AND:
1086 w = POP();
1087 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001088 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001089 Py_DECREF(v);
1090 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001091 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001092 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001093 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001094
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 case BINARY_XOR:
1096 w = POP();
1097 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001098 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001099 Py_DECREF(v);
1100 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001101 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001102 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001103 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001104
Guido van Rossum7928cd71991-10-24 14:59:31 +00001105 case BINARY_OR:
1106 w = POP();
1107 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001108 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001109 Py_DECREF(v);
1110 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001111 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001112 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001113 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001114
1115 case INPLACE_POWER:
1116 w = POP();
1117 v = POP();
1118 x = PyNumber_InPlacePower(v, w, Py_None);
1119 Py_DECREF(v);
1120 Py_DECREF(w);
1121 PUSH(x);
1122 if (x != NULL) continue;
1123 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001124
Thomas Wouters434d0822000-08-24 20:11:32 +00001125 case INPLACE_MULTIPLY:
1126 w = POP();
1127 v = POP();
1128 x = PyNumber_InPlaceMultiply(v, w);
1129 Py_DECREF(v);
1130 Py_DECREF(w);
1131 PUSH(x);
1132 if (x != NULL) continue;
1133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001136 if (!_Py_QnewFlag) {
1137 w = POP();
1138 v = POP();
1139 x = PyNumber_InPlaceDivide(v, w);
1140 Py_DECREF(v);
1141 Py_DECREF(w);
1142 PUSH(x);
1143 if (x != NULL) continue;
1144 break;
1145 }
1146 /* -Qnew is in effect: fall through to
1147 INPLACE_TRUE_DIVIDE */
1148 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001149 w = POP();
1150 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001151 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001152 Py_DECREF(v);
1153 Py_DECREF(w);
1154 PUSH(x);
1155 if (x != NULL) continue;
1156 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001157
Guido van Rossum4668b002001-08-08 05:00:18 +00001158 case INPLACE_FLOOR_DIVIDE:
1159 w = POP();
1160 v = POP();
1161 x = PyNumber_InPlaceFloorDivide(v, w);
1162 Py_DECREF(v);
1163 Py_DECREF(w);
1164 PUSH(x);
1165 if (x != NULL) continue;
1166 break;
1167
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 case INPLACE_MODULO:
1169 w = POP();
1170 v = POP();
1171 x = PyNumber_InPlaceRemainder(v, w);
1172 Py_DECREF(v);
1173 Py_DECREF(w);
1174 PUSH(x);
1175 if (x != NULL) continue;
1176 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001177
Thomas Wouters434d0822000-08-24 20:11:32 +00001178 case INPLACE_ADD:
1179 w = POP();
1180 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001181 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001182 /* INLINE: int + int */
1183 register long a, b, i;
1184 a = PyInt_AS_LONG(v);
1185 b = PyInt_AS_LONG(w);
1186 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001187 if ((i^a) < 0 && (i^b) < 0)
1188 goto slow_iadd;
1189 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001190 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001191 else {
1192 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001193 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001194 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001195 Py_DECREF(v);
1196 Py_DECREF(w);
1197 PUSH(x);
1198 if (x != NULL) continue;
1199 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001200
Thomas Wouters434d0822000-08-24 20:11:32 +00001201 case INPLACE_SUBTRACT:
1202 w = POP();
1203 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001204 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001205 /* INLINE: int - int */
1206 register long a, b, i;
1207 a = PyInt_AS_LONG(v);
1208 b = PyInt_AS_LONG(w);
1209 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001210 if ((i^a) < 0 && (i^~b) < 0)
1211 goto slow_isub;
1212 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001213 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001214 else {
1215 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001216 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001217 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001218 Py_DECREF(v);
1219 Py_DECREF(w);
1220 PUSH(x);
1221 if (x != NULL) continue;
1222 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001223
Thomas Wouters434d0822000-08-24 20:11:32 +00001224 case INPLACE_LSHIFT:
1225 w = POP();
1226 v = POP();
1227 x = PyNumber_InPlaceLshift(v, w);
1228 Py_DECREF(v);
1229 Py_DECREF(w);
1230 PUSH(x);
1231 if (x != NULL) continue;
1232 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001233
Thomas Wouters434d0822000-08-24 20:11:32 +00001234 case INPLACE_RSHIFT:
1235 w = POP();
1236 v = POP();
1237 x = PyNumber_InPlaceRshift(v, w);
1238 Py_DECREF(v);
1239 Py_DECREF(w);
1240 PUSH(x);
1241 if (x != NULL) continue;
1242 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001243
Thomas Wouters434d0822000-08-24 20:11:32 +00001244 case INPLACE_AND:
1245 w = POP();
1246 v = POP();
1247 x = PyNumber_InPlaceAnd(v, w);
1248 Py_DECREF(v);
1249 Py_DECREF(w);
1250 PUSH(x);
1251 if (x != NULL) continue;
1252 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001253
Thomas Wouters434d0822000-08-24 20:11:32 +00001254 case INPLACE_XOR:
1255 w = POP();
1256 v = POP();
1257 x = PyNumber_InPlaceXor(v, w);
1258 Py_DECREF(v);
1259 Py_DECREF(w);
1260 PUSH(x);
1261 if (x != NULL) continue;
1262 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001263
Thomas Wouters434d0822000-08-24 20:11:32 +00001264 case INPLACE_OR:
1265 w = POP();
1266 v = POP();
1267 x = PyNumber_InPlaceOr(v, w);
1268 Py_DECREF(v);
1269 Py_DECREF(w);
1270 PUSH(x);
1271 if (x != NULL) continue;
1272 break;
1273
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 case SLICE+0:
1275 case SLICE+1:
1276 case SLICE+2:
1277 case SLICE+3:
1278 if ((opcode-SLICE) & 2)
1279 w = POP();
1280 else
1281 w = NULL;
1282 if ((opcode-SLICE) & 1)
1283 v = POP();
1284 else
1285 v = NULL;
1286 u = POP();
1287 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 Py_DECREF(u);
1289 Py_XDECREF(v);
1290 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001292 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001294
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 case STORE_SLICE+0:
1296 case STORE_SLICE+1:
1297 case STORE_SLICE+2:
1298 case STORE_SLICE+3:
1299 if ((opcode-STORE_SLICE) & 2)
1300 w = POP();
1301 else
1302 w = NULL;
1303 if ((opcode-STORE_SLICE) & 1)
1304 v = POP();
1305 else
1306 v = NULL;
1307 u = POP();
1308 t = POP();
1309 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 Py_DECREF(t);
1311 Py_DECREF(u);
1312 Py_XDECREF(v);
1313 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001314 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001316
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 case DELETE_SLICE+0:
1318 case DELETE_SLICE+1:
1319 case DELETE_SLICE+2:
1320 case DELETE_SLICE+3:
1321 if ((opcode-DELETE_SLICE) & 2)
1322 w = POP();
1323 else
1324 w = NULL;
1325 if ((opcode-DELETE_SLICE) & 1)
1326 v = POP();
1327 else
1328 v = NULL;
1329 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001330 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 Py_DECREF(u);
1333 Py_XDECREF(v);
1334 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001335 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001337
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 case STORE_SUBSCR:
1339 w = POP();
1340 v = POP();
1341 u = POP();
1342 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001343 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001344 Py_DECREF(u);
1345 Py_DECREF(v);
1346 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001347 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001349
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 case DELETE_SUBSCR:
1351 w = POP();
1352 v = POP();
1353 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001354 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001355 Py_DECREF(v);
1356 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001357 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001359
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 case PRINT_EXPR:
1361 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001362 w = PySys_GetObject("displayhook");
1363 if (w == NULL) {
1364 PyErr_SetString(PyExc_RuntimeError,
1365 "lost sys.displayhook");
1366 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001367 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001368 }
1369 if (err == 0) {
1370 x = Py_BuildValue("(O)", v);
1371 if (x == NULL)
1372 err = -1;
1373 }
1374 if (err == 0) {
1375 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001376 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001377 if (w == NULL)
1378 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001380 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001381 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001383
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001384 case PRINT_ITEM_TO:
1385 w = stream = POP();
1386 /* fall through to PRINT_ITEM */
1387
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 case PRINT_ITEM:
1389 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001390 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001391 w = PySys_GetObject("stdout");
1392 if (w == NULL) {
1393 PyErr_SetString(PyExc_RuntimeError,
1394 "lost sys.stdout");
1395 err = -1;
1396 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001397 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001398 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001399 err = PyFile_WriteString(" ", w);
1400 if (err == 0)
1401 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001402 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001403 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001404 if (PyString_Check(v)) {
1405 char *s = PyString_AS_STRING(v);
1406 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001407 if (len == 0 ||
1408 !isspace(Py_CHARMASK(s[len-1])) ||
1409 s[len-1] == ' ')
1410 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001411 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001412#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001413 else if (PyUnicode_Check(v)) {
1414 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1415 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001416 if (len == 0 ||
1417 !Py_UNICODE_ISSPACE(s[len-1]) ||
1418 s[len-1] == ' ')
1419 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001420 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001421#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001422 else
1423 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001425 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001426 Py_XDECREF(stream);
1427 stream = NULL;
1428 if (err == 0)
1429 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001431
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001432 case PRINT_NEWLINE_TO:
1433 w = stream = POP();
1434 /* fall through to PRINT_NEWLINE */
1435
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001437 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001438 w = PySys_GetObject("stdout");
1439 if (w == NULL)
1440 PyErr_SetString(PyExc_RuntimeError,
1441 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001442 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001443 if (w != NULL) {
1444 err = PyFile_WriteString("\n", w);
1445 if (err == 0)
1446 PyFile_SoftSpace(w, 0);
1447 }
1448 Py_XDECREF(stream);
1449 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001451
Thomas Wouters434d0822000-08-24 20:11:32 +00001452
1453#ifdef CASE_TOO_BIG
1454 default: switch (opcode) {
1455#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 case BREAK_LOOP:
1457 why = WHY_BREAK;
1458 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001459
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001460 case CONTINUE_LOOP:
1461 retval = PyInt_FromLong(oparg);
1462 why = WHY_CONTINUE;
1463 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001464
Guido van Rossumf10570b1995-07-07 22:53:21 +00001465 case RAISE_VARARGS:
1466 u = v = w = NULL;
1467 switch (oparg) {
1468 case 3:
1469 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001470 /* Fallthrough */
1471 case 2:
1472 v = POP(); /* value */
1473 /* Fallthrough */
1474 case 1:
1475 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001476 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001477 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001478 break;
1479 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001481 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001482 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001483 break;
1484 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001486
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001488 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001489 PyErr_SetString(PyExc_SystemError,
1490 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001491 break;
1492 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001494 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001496
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 case RETURN_VALUE:
1498 retval = POP();
1499 why = WHY_RETURN;
1500 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001501
Tim Peters5ca576e2001-06-18 22:08:13 +00001502 case YIELD_VALUE:
1503 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001504 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001505 f->f_lasti = INSTR_OFFSET();
1506 why = WHY_YIELD;
1507 break;
1508
1509
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001510 case EXEC_STMT:
1511 w = POP();
1512 v = POP();
1513 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001514 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 Py_DECREF(u);
1516 Py_DECREF(v);
1517 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001518 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001519
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 case POP_BLOCK:
1521 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 while (STACK_LEVEL() > b->b_level) {
1524 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 }
1527 }
1528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 case END_FINALLY:
1531 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 if (PyInt_Check(v)) {
1533 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001534 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001535 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001536 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 retval = POP();
1538 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001544 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 else if (v != Py_None) {
1547 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 "'finally' pops bad exception");
1549 why = WHY_EXCEPTION;
1550 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001553
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001555 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001557 w = POP();
1558 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 Py_DECREF(u);
1561 Py_DECREF(v);
1562 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001564
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 case STORE_NAME:
1566 w = GETNAMEV(oparg);
1567 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001569 PyErr_Format(PyExc_SystemError,
1570 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001571 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 break;
1573 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 err = PyDict_SetItem(x, w, v);
1575 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001577
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001579 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001580 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001581 PyErr_Format(PyExc_SystemError,
1582 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001583 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 break;
1585 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001587 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001588 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001590
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001591 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001593 if (PyTuple_Check(v)) {
1594 if (PyTuple_Size(v) != oparg) {
1595 PyErr_SetString(PyExc_ValueError,
1596 "unpack tuple of wrong size");
1597 why = WHY_EXCEPTION;
1598 }
1599 else {
1600 for (; --oparg >= 0; ) {
1601 w = PyTuple_GET_ITEM(v, oparg);
1602 Py_INCREF(w);
1603 PUSH(w);
1604 }
1605 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001606 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001607 else if (PyList_Check(v)) {
1608 if (PyList_Size(v) != oparg) {
1609 PyErr_SetString(PyExc_ValueError,
1610 "unpack list of wrong size");
1611 why = WHY_EXCEPTION;
1612 }
1613 else {
1614 for (; --oparg >= 0; ) {
1615 w = PyList_GET_ITEM(v, oparg);
1616 Py_INCREF(w);
1617 PUSH(w);
1618 }
1619 }
1620 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001621 else if (unpack_iterable(v, oparg,
1622 stack_pointer + oparg))
1623 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001624 else {
1625 if (PyErr_ExceptionMatches(PyExc_TypeError))
1626 PyErr_SetString(PyExc_TypeError,
1627 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001628 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001629 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001630 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001631 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001632
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001634 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 v = POP();
1636 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1638 Py_DECREF(v);
1639 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001641
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001643 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001645 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1646 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001649
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001650 case STORE_GLOBAL:
1651 w = GETNAMEV(oparg);
1652 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 err = PyDict_SetItem(f->f_globals, w, v);
1654 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001655 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001656
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001657 case DELETE_GLOBAL:
1658 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001659 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001660 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001661 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001662 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001663
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001665 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001667 PyErr_Format(PyExc_SystemError,
1668 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001669 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001670 break;
1671 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001678 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001679 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001680 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 break;
1682 }
1683 }
1684 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 PUSH(x);
1687 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001688
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001690 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001695 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001696 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001697 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 break;
1699 }
1700 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001701 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 PUSH(x);
1703 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001704
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001705 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001706 x = GETLOCAL(oparg);
1707 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001708 format_exc_check_arg(
1709 PyExc_UnboundLocalError,
1710 UNBOUNDLOCAL_ERROR_MSG,
1711 PyTuple_GetItem(co->co_varnames, oparg)
1712 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001713 break;
1714 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001715 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001716 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001717
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001718 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001719 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001720 Py_INCREF(x);
1721 PUSH(x);
1722 break;
1723
1724 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001725 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001726 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001727 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001728 err = -1;
1729 /* Don't stomp existing exception */
1730 if (PyErr_Occurred())
1731 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001732 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001733 v = PyTuple_GetItem(co->co_cellvars,
1734 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001735 format_exc_check_arg(
1736 PyExc_UnboundLocalError,
1737 UNBOUNDLOCAL_ERROR_MSG,
1738 v);
1739 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001740 v = PyTuple_GetItem(
1741 co->co_freevars,
1742 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001743 format_exc_check_arg(
1744 PyExc_NameError,
1745 UNBOUNDFREE_ERROR_MSG,
1746 v);
1747 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001748 break;
1749 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001750 PUSH(w);
1751 break;
1752
1753 case STORE_DEREF:
1754 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001755 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001756 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001757 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001758 continue;
1759
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001761 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 if (x != NULL) {
1763 for (; --oparg >= 0;) {
1764 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 }
1767 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001768 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 }
1770 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001771
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001773 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 if (x != NULL) {
1775 for (; --oparg >= 0;) {
1776 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001777 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 }
1779 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001780 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 }
1782 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001783
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001785 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001787 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001789
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001791 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001793 x = PyObject_GetAttr(v, w);
1794 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001796 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001798
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 case COMPARE_OP:
1800 w = POP();
1801 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001802 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001803 /* INLINE: cmp(int, int) */
1804 register long a, b;
1805 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001806 a = PyInt_AS_LONG(v);
1807 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001808 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001809 case PyCmp_LT: res = a < b; break;
1810 case PyCmp_LE: res = a <= b; break;
1811 case PyCmp_EQ: res = a == b; break;
1812 case PyCmp_NE: res = a != b; break;
1813 case PyCmp_GT: res = a > b; break;
1814 case PyCmp_GE: res = a >= b; break;
1815 case PyCmp_IS: res = v == w; break;
1816 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001817 default: goto slow_compare;
1818 }
1819 x = res ? Py_True : Py_False;
1820 Py_INCREF(x);
1821 }
1822 else {
1823 slow_compare:
1824 x = cmp_outcome(oparg, v, w);
1825 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 Py_DECREF(v);
1827 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001828 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001829 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001830 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001831
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001833 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001835 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001837 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001838 break;
1839 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001840 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001842 w,
1843 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001844 f->f_locals == NULL ?
1845 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001846 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001848 if (w == NULL) {
1849 x = NULL;
1850 break;
1851 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 x = PyEval_CallObject(x, w);
1853 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001854 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001855 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001857
Thomas Wouters52152252000-08-17 22:55:00 +00001858 case IMPORT_STAR:
1859 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001860 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001861 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001862 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001863 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001864 break;
1865 }
Thomas Wouters52152252000-08-17 22:55:00 +00001866 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001867 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001868 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001870 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001871
Thomas Wouters52152252000-08-17 22:55:00 +00001872 case IMPORT_FROM:
1873 w = GETNAMEV(oparg);
1874 v = TOP();
1875 x = import_from(v, w);
1876 PUSH(x);
1877 if (x != NULL) continue;
1878 break;
1879
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 case JUMP_FORWARD:
1881 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001882 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001883
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001885 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001886 if (err > 0)
1887 err = 0;
1888 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001889 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001890 else
1891 break;
1892 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001893
Guido van Rossum374a9221991-04-04 10:40:29 +00001894 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001895 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001896 if (err > 0) {
1897 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001898 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001899 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001900 else if (err == 0)
1901 ;
1902 else
1903 break;
1904 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001905
Guido van Rossum374a9221991-04-04 10:40:29 +00001906 case JUMP_ABSOLUTE:
1907 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001908 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001909
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001910 case GET_ITER:
1911 /* before: [obj]; after [getiter(obj)] */
1912 v = POP();
1913 x = PyObject_GetIter(v);
1914 Py_DECREF(v);
1915 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001916 PUSH(x);
1917 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001918 }
1919 break;
1920
1921 case FOR_ITER:
1922 /* before: [iter]; after: [iter, iter()] *or* [] */
1923 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001924 x = PyIter_Next(v);
1925 if (x != NULL) {
1926 PUSH(x);
1927 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001928 }
Tim Petersf4848da2001-05-05 00:14:56 +00001929 if (!PyErr_Occurred()) {
1930 /* iterator ended normally */
1931 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001932 Py_DECREF(v);
1933 JUMPBY(oparg);
1934 continue;
1935 }
1936 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001937
Guido van Rossum374a9221991-04-04 10:40:29 +00001938 case SETUP_LOOP:
1939 case SETUP_EXCEPT:
1940 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001941 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001942 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001943 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001944
Guido van Rossumf10570b1995-07-07 22:53:21 +00001945 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001946 {
1947 int na = oparg & 0xff;
1948 int nk = (oparg>>8) & 0xff;
1949 int n = na + 2 * nk;
1950 PyObject **pfunc = stack_pointer - n - 1;
1951 PyObject *func = *pfunc;
1952 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1953
1954 /* Always dispatch PyCFunction first, because
1955 these are presumed to be the most frequent
1956 callable object.
1957 */
1958 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001959 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001960 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001961 x = do_call(func, &stack_pointer,
1962 na, nk);
1963 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001964 PyObject *callargs;
1965 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001966 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001967 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001968 } else
1969 x = fast_cfunction(func,
1970 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001971 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001972 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001973 && PyMethod_GET_SELF(func) != NULL) {
1974 /* optimize access to bound methods */
1975 PyObject *self = PyMethod_GET_SELF(func);
1976 Py_INCREF(self);
1977 func = PyMethod_GET_FUNCTION(func);
1978 Py_INCREF(func);
1979 Py_DECREF(*pfunc);
1980 *pfunc = self;
1981 na++;
1982 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001983 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001984 Py_INCREF(func);
1985 if (PyFunction_Check(func)) {
1986 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001987 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001988 } else {
1989 x = do_call(func, &stack_pointer,
1990 na, nk);
1991 }
1992 Py_DECREF(func);
1993 }
1994
1995 while (stack_pointer > pfunc) {
1996 w = POP();
1997 Py_DECREF(w);
1998 }
1999 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002000 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002001 continue;
2002 break;
2003 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002004
Jeremy Hylton76901512000-03-28 23:49:17 +00002005 case CALL_FUNCTION_VAR:
2006 case CALL_FUNCTION_KW:
2007 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002008 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002009 int na = oparg & 0xff;
2010 int nk = (oparg>>8) & 0xff;
2011 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002012 int n = na + 2 * nk;
2013 PyObject **pfunc, *func;
2014 if (flags & CALL_FLAG_VAR)
2015 n++;
2016 if (flags & CALL_FLAG_KW)
2017 n++;
2018 pfunc = stack_pointer - n - 1;
2019 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002020 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002021
Guido van Rossumac7be682001-01-17 15:42:30 +00002022 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002023 && PyMethod_GET_SELF(func) != NULL) {
2024 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002025 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002026 func = PyMethod_GET_FUNCTION(func);
2027 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002028 Py_DECREF(*pfunc);
2029 *pfunc = self;
2030 na++;
2031 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002032 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002033 Py_INCREF(func);
2034 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002035 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002036
Jeremy Hylton76901512000-03-28 23:49:17 +00002037 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002038 w = POP();
2039 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002040 }
2041 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002042 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002043 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002044 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002045 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002046
Guido van Rossum681d79a1995-07-18 14:51:37 +00002047 case MAKE_FUNCTION:
2048 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002049 x = PyFunction_New(v, f->f_globals);
2050 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002051 /* XXX Maybe this should be a separate opcode? */
2052 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002053 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002054 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002055 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002056 x = NULL;
2057 break;
2058 }
2059 while (--oparg >= 0) {
2060 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002062 }
2063 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002065 }
2066 PUSH(x);
2067 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002068
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002069 case MAKE_CLOSURE:
2070 {
2071 int nfree;
2072 v = POP(); /* code object */
2073 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002074 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002075 Py_DECREF(v);
2076 /* XXX Maybe this should be a separate opcode? */
2077 if (x != NULL && nfree > 0) {
2078 v = PyTuple_New(nfree);
2079 if (v == NULL) {
2080 Py_DECREF(x);
2081 x = NULL;
2082 break;
2083 }
2084 while (--nfree >= 0) {
2085 w = POP();
2086 PyTuple_SET_ITEM(v, nfree, w);
2087 }
2088 err = PyFunction_SetClosure(x, v);
2089 Py_DECREF(v);
2090 }
2091 if (x != NULL && oparg > 0) {
2092 v = PyTuple_New(oparg);
2093 if (v == NULL) {
2094 Py_DECREF(x);
2095 x = NULL;
2096 break;
2097 }
2098 while (--oparg >= 0) {
2099 w = POP();
2100 PyTuple_SET_ITEM(v, oparg, w);
2101 }
2102 err = PyFunction_SetDefaults(x, v);
2103 Py_DECREF(v);
2104 }
2105 PUSH(x);
2106 break;
2107 }
2108
Guido van Rossum8861b741996-07-30 16:49:37 +00002109 case BUILD_SLICE:
2110 if (oparg == 3)
2111 w = POP();
2112 else
2113 w = NULL;
2114 v = POP();
2115 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002116 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002117 Py_DECREF(u);
2118 Py_DECREF(v);
2119 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002120 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002121 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002122 break;
2123
Fred Drakeef8ace32000-08-24 00:32:09 +00002124 case EXTENDED_ARG:
2125 opcode = NEXTOP();
2126 oparg = oparg<<16 | NEXTARG();
2127 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002128
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 default:
2130 fprintf(stderr,
2131 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002132 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 why = WHY_EXCEPTION;
2135 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002136
2137#ifdef CASE_TOO_BIG
2138 }
2139#endif
2140
Guido van Rossum374a9221991-04-04 10:40:29 +00002141 } /* switch */
2142
2143 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002144
Guido van Rossum374a9221991-04-04 10:40:29 +00002145 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002146
Guido van Rossum374a9221991-04-04 10:40:29 +00002147 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002148 if (err == 0 && x != NULL) {
2149#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002150 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002152 fprintf(stderr,
2153 "XXX undetected error\n");
2154 else
2155#endif
2156 continue; /* Normal, fast path */
2157 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 err = 0;
2161 }
2162
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002164
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002167 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002168 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 why = WHY_EXCEPTION;
2170 }
2171 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002172#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002174 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002175 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002176 fprintf(stderr,
2177 "XXX undetected error (why=%d)\n",
2178 why);
2179 why = WHY_EXCEPTION;
2180 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 }
2182#endif
2183
2184 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002185
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002187 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002189 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002191
Fred Drake8f51f542001-10-04 14:48:42 +00002192 if (tstate->c_tracefunc != NULL)
2193 call_exc_trace(tstate->c_tracefunc,
2194 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002195 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002196
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002198
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 if (why == WHY_RERAISE)
2200 why = WHY_EXCEPTION;
2201
2202 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002203
Tim Peters5ca576e2001-06-18 22:08:13 +00002204 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002205 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002206
2207 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2208 /* For a continue inside a try block,
2209 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002210 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2211 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002212 why = WHY_NOT;
2213 JUMPTO(PyInt_AS_LONG(retval));
2214 Py_DECREF(retval);
2215 break;
2216 }
2217
Guido van Rossum374a9221991-04-04 10:40:29 +00002218 while (STACK_LEVEL() > b->b_level) {
2219 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002220 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002221 }
2222 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2223 why = WHY_NOT;
2224 JUMPTO(b->b_handler);
2225 break;
2226 }
2227 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002228 (b->b_type == SETUP_EXCEPT &&
2229 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002230 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002231 PyObject *exc, *val, *tb;
2232 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002233 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002234 val = Py_None;
2235 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002236 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002237 /* Make the raw exception data
2238 available to the handler,
2239 so a program can emulate the
2240 Python main loop. Don't do
2241 this for 'finally'. */
2242 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002243 PyErr_NormalizeException(
2244 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002245 set_exc_info(tstate,
2246 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002247 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002248 if (tb == NULL) {
2249 Py_INCREF(Py_None);
2250 PUSH(Py_None);
2251 } else
2252 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 PUSH(val);
2254 PUSH(exc);
2255 }
2256 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002257 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002258 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002259 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002260 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002261 PUSH(v);
2262 }
2263 why = WHY_NOT;
2264 JUMPTO(b->b_handler);
2265 break;
2266 }
2267 } /* unwind stack */
2268
2269 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002270
Guido van Rossum374a9221991-04-04 10:40:29 +00002271 if (why != WHY_NOT)
2272 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002273
Guido van Rossum374a9221991-04-04 10:40:29 +00002274 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002275
Guido van Rossum35974fb2001-12-06 21:28:18 +00002276 if (why != WHY_YIELD) {
2277 /* Pop remaining stack entries -- but when yielding */
2278 while (!EMPTY()) {
2279 v = POP();
2280 Py_XDECREF(v);
2281 }
2282 }
2283
Tim Peters5ca576e2001-06-18 22:08:13 +00002284 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002285 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002286
Fred Drake9e3ad782001-07-03 23:39:52 +00002287 if (tstate->use_tracing) {
2288 if (tstate->c_tracefunc
2289 && (why == WHY_RETURN || why == WHY_YIELD)) {
2290 if (call_trace(tstate->c_tracefunc,
2291 tstate->c_traceobj, f,
2292 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002293 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002294 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002295 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002296 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002297 }
Fred Drake8f51f542001-10-04 14:48:42 +00002298 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002299 if (why == WHY_EXCEPTION)
2300 call_trace_protected(tstate->c_profilefunc,
2301 tstate->c_profileobj, f,
2302 PyTrace_RETURN);
2303 else if (call_trace(tstate->c_profilefunc,
2304 tstate->c_profileobj, f,
2305 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002306 Py_XDECREF(retval);
2307 retval = NULL;
2308 why = WHY_EXCEPTION;
2309 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002310 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002311 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002312
Guido van Rossuma027efa1997-05-05 20:56:21 +00002313 reset_exc_info(tstate);
2314
Tim Peters5ca576e2001-06-18 22:08:13 +00002315 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002316 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002317 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002318
Guido van Rossum96a42c81992-01-12 02:29:51 +00002319 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002320}
2321
Tim Peters6d6c1a32001-08-02 04:15:00 +00002322PyObject *
2323PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002324 PyObject **args, int argcount, PyObject **kws, int kwcount,
2325 PyObject **defs, int defcount, PyObject *closure)
2326{
2327 register PyFrameObject *f;
2328 register PyObject *retval = NULL;
2329 register PyObject **fastlocals, **freevars;
2330 PyThreadState *tstate = PyThreadState_GET();
2331 PyObject *x, *u;
2332
2333 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002334 PyErr_SetString(PyExc_SystemError,
2335 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002336 return NULL;
2337 }
2338
2339 f = PyFrame_New(tstate, /*back*/
2340 co, /*code*/
2341 globals, locals);
2342 if (f == NULL)
2343 return NULL;
2344
2345 fastlocals = f->f_localsplus;
2346 freevars = f->f_localsplus + f->f_nlocals;
2347
2348 if (co->co_argcount > 0 ||
2349 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2350 int i;
2351 int n = argcount;
2352 PyObject *kwdict = NULL;
2353 if (co->co_flags & CO_VARKEYWORDS) {
2354 kwdict = PyDict_New();
2355 if (kwdict == NULL)
2356 goto fail;
2357 i = co->co_argcount;
2358 if (co->co_flags & CO_VARARGS)
2359 i++;
2360 SETLOCAL(i, kwdict);
2361 }
2362 if (argcount > co->co_argcount) {
2363 if (!(co->co_flags & CO_VARARGS)) {
2364 PyErr_Format(PyExc_TypeError,
2365 "%.200s() takes %s %d "
2366 "%sargument%s (%d given)",
2367 PyString_AsString(co->co_name),
2368 defcount ? "at most" : "exactly",
2369 co->co_argcount,
2370 kwcount ? "non-keyword " : "",
2371 co->co_argcount == 1 ? "" : "s",
2372 argcount);
2373 goto fail;
2374 }
2375 n = co->co_argcount;
2376 }
2377 for (i = 0; i < n; i++) {
2378 x = args[i];
2379 Py_INCREF(x);
2380 SETLOCAL(i, x);
2381 }
2382 if (co->co_flags & CO_VARARGS) {
2383 u = PyTuple_New(argcount - n);
2384 if (u == NULL)
2385 goto fail;
2386 SETLOCAL(co->co_argcount, u);
2387 for (i = n; i < argcount; i++) {
2388 x = args[i];
2389 Py_INCREF(x);
2390 PyTuple_SET_ITEM(u, i-n, x);
2391 }
2392 }
2393 for (i = 0; i < kwcount; i++) {
2394 PyObject *keyword = kws[2*i];
2395 PyObject *value = kws[2*i + 1];
2396 int j;
2397 if (keyword == NULL || !PyString_Check(keyword)) {
2398 PyErr_Format(PyExc_TypeError,
2399 "%.200s() keywords must be strings",
2400 PyString_AsString(co->co_name));
2401 goto fail;
2402 }
2403 /* XXX slow -- speed up using dictionary? */
2404 for (j = 0; j < co->co_argcount; j++) {
2405 PyObject *nm = PyTuple_GET_ITEM(
2406 co->co_varnames, j);
2407 int cmp = PyObject_RichCompareBool(
2408 keyword, nm, Py_EQ);
2409 if (cmp > 0)
2410 break;
2411 else if (cmp < 0)
2412 goto fail;
2413 }
2414 /* Check errors from Compare */
2415 if (PyErr_Occurred())
2416 goto fail;
2417 if (j >= co->co_argcount) {
2418 if (kwdict == NULL) {
2419 PyErr_Format(PyExc_TypeError,
2420 "%.200s() got an unexpected "
2421 "keyword argument '%.400s'",
2422 PyString_AsString(co->co_name),
2423 PyString_AsString(keyword));
2424 goto fail;
2425 }
2426 PyDict_SetItem(kwdict, keyword, value);
2427 }
2428 else {
2429 if (GETLOCAL(j) != NULL) {
2430 PyErr_Format(PyExc_TypeError,
2431 "%.200s() got multiple "
2432 "values for keyword "
2433 "argument '%.400s'",
2434 PyString_AsString(co->co_name),
2435 PyString_AsString(keyword));
2436 goto fail;
2437 }
2438 Py_INCREF(value);
2439 SETLOCAL(j, value);
2440 }
2441 }
2442 if (argcount < co->co_argcount) {
2443 int m = co->co_argcount - defcount;
2444 for (i = argcount; i < m; i++) {
2445 if (GETLOCAL(i) == NULL) {
2446 PyErr_Format(PyExc_TypeError,
2447 "%.200s() takes %s %d "
2448 "%sargument%s (%d given)",
2449 PyString_AsString(co->co_name),
2450 ((co->co_flags & CO_VARARGS) ||
2451 defcount) ? "at least"
2452 : "exactly",
2453 m, kwcount ? "non-keyword " : "",
2454 m == 1 ? "" : "s", i);
2455 goto fail;
2456 }
2457 }
2458 if (n > m)
2459 i = n - m;
2460 else
2461 i = 0;
2462 for (; i < defcount; i++) {
2463 if (GETLOCAL(m+i) == NULL) {
2464 PyObject *def = defs[i];
2465 Py_INCREF(def);
2466 SETLOCAL(m+i, def);
2467 }
2468 }
2469 }
2470 }
2471 else {
2472 if (argcount > 0 || kwcount > 0) {
2473 PyErr_Format(PyExc_TypeError,
2474 "%.200s() takes no arguments (%d given)",
2475 PyString_AsString(co->co_name),
2476 argcount + kwcount);
2477 goto fail;
2478 }
2479 }
2480 /* Allocate and initialize storage for cell vars, and copy free
2481 vars into frame. This isn't too efficient right now. */
2482 if (f->f_ncells) {
2483 int i = 0, j = 0, nargs, found;
2484 char *cellname, *argname;
2485 PyObject *c;
2486
2487 nargs = co->co_argcount;
2488 if (co->co_flags & CO_VARARGS)
2489 nargs++;
2490 if (co->co_flags & CO_VARKEYWORDS)
2491 nargs++;
2492
2493 /* Check for cells that shadow args */
2494 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2495 cellname = PyString_AS_STRING(
2496 PyTuple_GET_ITEM(co->co_cellvars, i));
2497 found = 0;
2498 while (j < nargs) {
2499 argname = PyString_AS_STRING(
2500 PyTuple_GET_ITEM(co->co_varnames, j));
2501 if (strcmp(cellname, argname) == 0) {
2502 c = PyCell_New(GETLOCAL(j));
2503 if (c == NULL)
2504 goto fail;
2505 GETLOCAL(f->f_nlocals + i) = c;
2506 found = 1;
2507 break;
2508 }
2509 j++;
2510 }
2511 if (found == 0) {
2512 c = PyCell_New(NULL);
2513 if (c == NULL)
2514 goto fail;
2515 SETLOCAL(f->f_nlocals + i, c);
2516 }
2517 }
2518 /* Initialize any that are left */
2519 while (i < f->f_ncells) {
2520 c = PyCell_New(NULL);
2521 if (c == NULL)
2522 goto fail;
2523 SETLOCAL(f->f_nlocals + i, c);
2524 i++;
2525 }
2526 }
2527 if (f->f_nfreevars) {
2528 int i;
2529 for (i = 0; i < f->f_nfreevars; ++i) {
2530 PyObject *o = PyTuple_GET_ITEM(closure, i);
2531 Py_INCREF(o);
2532 freevars[f->f_ncells + i] = o;
2533 }
2534 }
2535
Tim Peters5ca576e2001-06-18 22:08:13 +00002536 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002537 /* Don't need to keep the reference to f_back, it will be set
2538 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002539 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002540 f->f_back = NULL;
2541
2542 /* Create a new generator that owns the ready to run frame
2543 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002544 return gen_new(f);
2545 }
2546
2547 retval = eval_frame(f);
2548
2549 fail: /* Jump here from prelude on failure */
2550
Tim Petersb13680b2001-11-27 23:29:29 +00002551 /* decref'ing the frame can cause __del__ methods to get invoked,
2552 which can call back into Python. While we're done with the
2553 current Python frame (f), the associated C stack is still in use,
2554 so recursion_depth must be boosted for the duration.
2555 */
2556 assert(tstate != NULL);
2557 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002558 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002559 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002560 return retval;
2561}
2562
2563
Guido van Rossuma027efa1997-05-05 20:56:21 +00002564static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002565set_exc_info(PyThreadState *tstate,
2566 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002567{
2568 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002569 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002570
Guido van Rossuma027efa1997-05-05 20:56:21 +00002571 frame = tstate->frame;
2572 if (frame->f_exc_type == NULL) {
2573 /* This frame didn't catch an exception before */
2574 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002575 if (tstate->exc_type == NULL) {
2576 Py_INCREF(Py_None);
2577 tstate->exc_type = Py_None;
2578 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002579 tmp_type = frame->f_exc_type;
2580 tmp_value = frame->f_exc_value;
2581 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002582 Py_XINCREF(tstate->exc_type);
2583 Py_XINCREF(tstate->exc_value);
2584 Py_XINCREF(tstate->exc_traceback);
2585 frame->f_exc_type = tstate->exc_type;
2586 frame->f_exc_value = tstate->exc_value;
2587 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002588 Py_XDECREF(tmp_type);
2589 Py_XDECREF(tmp_value);
2590 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 }
2592 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002593 tmp_type = tstate->exc_type;
2594 tmp_value = tstate->exc_value;
2595 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002596 Py_XINCREF(type);
2597 Py_XINCREF(value);
2598 Py_XINCREF(tb);
2599 tstate->exc_type = type;
2600 tstate->exc_value = value;
2601 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002602 Py_XDECREF(tmp_type);
2603 Py_XDECREF(tmp_value);
2604 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605 /* For b/w compatibility */
2606 PySys_SetObject("exc_type", type);
2607 PySys_SetObject("exc_value", value);
2608 PySys_SetObject("exc_traceback", tb);
2609}
2610
2611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002613{
2614 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002615 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002616 frame = tstate->frame;
2617 if (frame->f_exc_type != NULL) {
2618 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002619 tmp_type = tstate->exc_type;
2620 tmp_value = tstate->exc_value;
2621 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002622 Py_XINCREF(frame->f_exc_type);
2623 Py_XINCREF(frame->f_exc_value);
2624 Py_XINCREF(frame->f_exc_traceback);
2625 tstate->exc_type = frame->f_exc_type;
2626 tstate->exc_value = frame->f_exc_value;
2627 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002628 Py_XDECREF(tmp_type);
2629 Py_XDECREF(tmp_value);
2630 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002631 /* For b/w compatibility */
2632 PySys_SetObject("exc_type", frame->f_exc_type);
2633 PySys_SetObject("exc_value", frame->f_exc_value);
2634 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2635 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002636 tmp_type = frame->f_exc_type;
2637 tmp_value = frame->f_exc_value;
2638 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002639 frame->f_exc_type = NULL;
2640 frame->f_exc_value = NULL;
2641 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002642 Py_XDECREF(tmp_type);
2643 Py_XDECREF(tmp_value);
2644 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002645}
2646
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002647/* Logic for the raise statement (too complicated for inlining).
2648 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002649static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002650do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002651{
Guido van Rossumd295f121998-04-09 21:39:57 +00002652 if (type == NULL) {
2653 /* Reraise */
2654 PyThreadState *tstate = PyThreadState_Get();
2655 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2656 value = tstate->exc_value;
2657 tb = tstate->exc_traceback;
2658 Py_XINCREF(type);
2659 Py_XINCREF(value);
2660 Py_XINCREF(tb);
2661 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002662
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002663 /* We support the following forms of raise:
2664 raise <class>, <classinstance>
2665 raise <class>, <argument tuple>
2666 raise <class>, None
2667 raise <class>, <argument>
2668 raise <classinstance>, None
2669 raise <string>, <object>
2670 raise <string>, None
2671
2672 An omitted second argument is the same as None.
2673
2674 In addition, raise <tuple>, <anything> is the same as
2675 raising the tuple's first item (and it better have one!);
2676 this rule is applied recursively.
2677
2678 Finally, an optional third argument can be supplied, which
2679 gives the traceback to be substituted (useful when
2680 re-raising an exception after examining it). */
2681
2682 /* First, check the traceback argument, replacing None with
2683 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 if (tb == Py_None) {
2685 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 tb = NULL;
2687 }
2688 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002689 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002690 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002691 goto raise_error;
2692 }
2693
2694 /* Next, replace a missing value with None */
2695 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 value = Py_None;
2697 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002698 }
2699
2700 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2702 PyObject *tmp = type;
2703 type = PyTuple_GET_ITEM(type, 0);
2704 Py_INCREF(type);
2705 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002706 }
2707
Tim Petersafb2c802002-04-18 18:06:20 +00002708 if (PyString_CheckExact(type))
2709 /* Raising builtin string is deprecated but still allowed --
2710 * do nothing. Raising an instance of a new-style str
2711 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002712 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002713
2714 else if (PyClass_Check(type))
2715 PyErr_NormalizeException(&type, &value, &tb);
2716
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002718 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002719 if (value != Py_None) {
2720 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002721 "instance exception may not have a separate value");
2722 goto raise_error;
2723 }
2724 else {
2725 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002727 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2729 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002730 }
2731 }
2732 else {
2733 /* Not something you can raise. You get an exception
2734 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002735 PyErr_Format(PyExc_TypeError,
2736 "exceptions must be strings, classes, or "
2737 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002738 goto raise_error;
2739 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002741 if (tb == NULL)
2742 return WHY_EXCEPTION;
2743 else
2744 return WHY_RERAISE;
2745 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 Py_XDECREF(value);
2747 Py_XDECREF(type);
2748 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002749 return WHY_EXCEPTION;
2750}
2751
Tim Petersd6d010b2001-06-21 02:49:55 +00002752/* Iterate v argcnt times and store the results on the stack (via decreasing
2753 sp). Return 1 for success, 0 if error. */
2754
Barry Warsawe42b18f1997-08-25 22:13:04 +00002755static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002756unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002757{
Tim Petersd6d010b2001-06-21 02:49:55 +00002758 int i = 0;
2759 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002760 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002761
Tim Petersd6d010b2001-06-21 02:49:55 +00002762 assert(v != NULL);
2763
2764 it = PyObject_GetIter(v);
2765 if (it == NULL)
2766 goto Error;
2767
2768 for (; i < argcnt; i++) {
2769 w = PyIter_Next(it);
2770 if (w == NULL) {
2771 /* Iterator done, via error or exhaustion. */
2772 if (!PyErr_Occurred()) {
2773 PyErr_Format(PyExc_ValueError,
2774 "need more than %d value%s to unpack",
2775 i, i == 1 ? "" : "s");
2776 }
2777 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002778 }
2779 *--sp = w;
2780 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002781
2782 /* We better have exhausted the iterator now. */
2783 w = PyIter_Next(it);
2784 if (w == NULL) {
2785 if (PyErr_Occurred())
2786 goto Error;
2787 Py_DECREF(it);
2788 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002789 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002790 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002791 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002792 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002793Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002794 for (; i > 0; i--, sp++)
2795 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002796 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002797 return 0;
2798}
2799
2800
Guido van Rossum96a42c81992-01-12 02:29:51 +00002801#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002802static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002803prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002805 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 if (PyObject_Print(v, stdout, 0) != 0)
2807 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002808 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002809 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002813static void
Fred Drake5755ce62001-06-27 19:19:46 +00002814call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002815{
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002817 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002819 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 value = Py_None;
2821 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002822 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002824 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002826 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002827 }
Fred Drake5755ce62001-06-27 19:19:46 +00002828 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002830 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002832 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 Py_XDECREF(type);
2834 Py_XDECREF(value);
2835 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002836 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002837}
2838
Fred Drake4ec5d562001-10-04 19:26:43 +00002839static void
2840call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2841 int what)
2842{
2843 PyObject *type, *value, *traceback;
2844 int err;
2845 PyErr_Fetch(&type, &value, &traceback);
2846 err = call_trace(func, obj, frame, what, NULL);
2847 if (err == 0)
2848 PyErr_Restore(type, value, traceback);
2849 else {
2850 Py_XDECREF(type);
2851 Py_XDECREF(value);
2852 Py_XDECREF(traceback);
2853 }
2854}
2855
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002856static int
Fred Drake5755ce62001-06-27 19:19:46 +00002857call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2858 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002859{
Fred Drake5755ce62001-06-27 19:19:46 +00002860 register PyThreadState *tstate = frame->f_tstate;
2861 int result;
2862 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002863 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002864 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002865 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002866 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002867 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2868 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002869 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002870 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002871}
2872
Fred Drake5755ce62001-06-27 19:19:46 +00002873void
2874PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002875{
Fred Drake5755ce62001-06-27 19:19:46 +00002876 PyThreadState *tstate = PyThreadState_Get();
2877 PyObject *temp = tstate->c_profileobj;
2878 Py_XINCREF(arg);
2879 tstate->c_profilefunc = NULL;
2880 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002881 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002882 Py_XDECREF(temp);
2883 tstate->c_profilefunc = func;
2884 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002885 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002886}
2887
2888void
2889PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2890{
2891 PyThreadState *tstate = PyThreadState_Get();
2892 PyObject *temp = tstate->c_traceobj;
2893 Py_XINCREF(arg);
2894 tstate->c_tracefunc = NULL;
2895 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002896 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002897 Py_XDECREF(temp);
2898 tstate->c_tracefunc = func;
2899 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002900 tstate->use_tracing = ((func != NULL)
2901 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002902}
2903
Guido van Rossumb209a111997-04-29 18:18:01 +00002904PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002905PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002906{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002907 PyThreadState *tstate = PyThreadState_Get();
2908 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002909 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002910 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002911 else
2912 return current_frame->f_builtins;
2913}
2914
Guido van Rossumb209a111997-04-29 18:18:01 +00002915PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002916PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002917{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002918 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002919 if (current_frame == NULL)
2920 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002921 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002922 return current_frame->f_locals;
2923}
2924
Guido van Rossumb209a111997-04-29 18:18:01 +00002925PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002926PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002927{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002928 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002929 if (current_frame == NULL)
2930 return NULL;
2931 else
2932 return current_frame->f_globals;
2933}
2934
Guido van Rossumb209a111997-04-29 18:18:01 +00002935PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002936PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002937{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002938 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002939 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002940}
2941
Guido van Rossum6135a871995-01-09 17:53:26 +00002942int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002943PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002944{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002945 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002946 return current_frame == NULL ? 0 : current_frame->f_restricted;
2947}
2948
Guido van Rossumbe270261997-05-22 22:26:18 +00002949int
Tim Peters5ba58662001-07-16 02:29:45 +00002950PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002951{
2952 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002953 int result = 0;
2954
2955 if (current_frame != NULL) {
2956 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002957 const int compilerflags = codeflags & PyCF_MASK;
2958 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002959 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002960 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002961 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002962#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002963 if (codeflags & CO_GENERATOR_ALLOWED) {
2964 result = 1;
2965 cf->cf_flags |= CO_GENERATOR_ALLOWED;
2966 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002967#endif
Tim Peters5ba58662001-07-16 02:29:45 +00002968 }
2969 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002970}
2971
2972int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002973Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974{
Guido van Rossumb209a111997-04-29 18:18:01 +00002975 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002976 if (f == NULL)
2977 return 0;
2978 if (!PyFile_SoftSpace(f, 0))
2979 return 0;
2980 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981}
2982
Guido van Rossum3f5da241990-12-20 15:06:42 +00002983
Guido van Rossum681d79a1995-07-18 14:51:37 +00002984/* External interface to call any callable object.
2985 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002986
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002987#undef PyEval_CallObject
2988/* for backward compatibility: export this interface */
2989
Guido van Rossumb209a111997-04-29 18:18:01 +00002990PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002991PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002992{
Guido van Rossumb209a111997-04-29 18:18:01 +00002993 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002994}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002995#define PyEval_CallObject(func,arg) \
2996 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002997
Guido van Rossumb209a111997-04-29 18:18:01 +00002998PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003000{
Jeremy Hylton52820442001-01-03 23:52:36 +00003001 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003002
3003 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003004 arg = PyTuple_New(0);
3005 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003006 PyErr_SetString(PyExc_TypeError,
3007 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003008 return NULL;
3009 }
3010 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003011 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003012
Guido van Rossumb209a111997-04-29 18:18:01 +00003013 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003014 PyErr_SetString(PyExc_TypeError,
3015 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003016 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003017 return NULL;
3018 }
3019
Tim Peters6d6c1a32001-08-02 04:15:00 +00003020 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003021 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003022 return result;
3023}
3024
Tim Peters6d6c1a32001-08-02 04:15:00 +00003025char *
3026PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003027{
3028 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003029 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003030 else if (PyFunction_Check(func))
3031 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3032 else if (PyCFunction_Check(func))
3033 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3034 else if (PyClass_Check(func))
3035 return PyString_AsString(((PyClassObject*)func)->cl_name);
3036 else if (PyInstance_Check(func)) {
3037 return PyString_AsString(
3038 ((PyInstanceObject*)func)->in_class->cl_name);
3039 } else {
3040 return func->ob_type->tp_name;
3041 }
3042}
3043
Tim Peters6d6c1a32001-08-02 04:15:00 +00003044char *
3045PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003046{
3047 if (PyMethod_Check(func))
3048 return "()";
3049 else if (PyFunction_Check(func))
3050 return "()";
3051 else if (PyCFunction_Check(func))
3052 return "()";
3053 else if (PyClass_Check(func))
3054 return " constructor";
3055 else if (PyInstance_Check(func)) {
3056 return " instance";
3057 } else {
3058 return " object";
3059 }
3060}
3061
Jeremy Hylton52820442001-01-03 23:52:36 +00003062#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3063
3064/* The two fast_xxx() functions optimize calls for which no argument
3065 tuple is necessary; the objects are passed directly from the stack.
3066 fast_cfunction() is called for METH_OLDARGS functions.
3067 fast_function() is for functions with no special argument handling.
3068*/
3069
3070static PyObject *
3071fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3072{
3073 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3074 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003075 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003076
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003077 switch (flags) {
3078 case METH_OLDARGS:
3079 if (na == 0)
3080 return (*meth)(self, NULL);
3081 else if (na == 1) {
3082 PyObject *arg = EXT_POP(*pp_stack);
3083 PyObject *result = (*meth)(self, arg);
3084 Py_DECREF(arg);
3085 return result;
3086 } else {
3087 PyObject *args = load_args(pp_stack, na);
3088 PyObject *result = (*meth)(self, args);
3089 Py_DECREF(args);
3090 return result;
3091 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003092 case METH_NOARGS:
3093 if (na == 0)
3094 return (*meth)(self, NULL);
3095 PyErr_Format(PyExc_TypeError,
3096 "%.200s() takes no arguments (%d given)",
3097 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3098 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003099 case METH_O:
3100 if (na == 1) {
3101 PyObject *arg = EXT_POP(*pp_stack);
3102 PyObject *result = (*meth)(self, arg);
3103 Py_DECREF(arg);
3104 return result;
3105 }
3106 PyErr_Format(PyExc_TypeError,
3107 "%.200s() takes exactly one argument (%d given)",
3108 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3109 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003110 default:
3111 fprintf(stderr, "%.200s() flags = %d\n",
3112 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3113 PyErr_BadInternalCall();
3114 return NULL;
3115 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003116}
3117
3118static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003119fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003120{
3121 PyObject *co = PyFunction_GET_CODE(func);
3122 PyObject *globals = PyFunction_GET_GLOBALS(func);
3123 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003124 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003125 PyObject **d = NULL;
3126 int nd = 0;
3127
3128 if (argdefs != NULL) {
3129 d = &PyTuple_GET_ITEM(argdefs, 0);
3130 nd = ((PyTupleObject *)argdefs)->ob_size;
3131 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003132 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003133 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003134 (*pp_stack)-2*nk, nk, d, nd,
3135 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003136}
3137
3138static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003139update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3140 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003141{
3142 PyObject *kwdict = NULL;
3143 if (orig_kwdict == NULL)
3144 kwdict = PyDict_New();
3145 else {
3146 kwdict = PyDict_Copy(orig_kwdict);
3147 Py_DECREF(orig_kwdict);
3148 }
3149 if (kwdict == NULL)
3150 return NULL;
3151 while (--nk >= 0) {
3152 int err;
3153 PyObject *value = EXT_POP(*pp_stack);
3154 PyObject *key = EXT_POP(*pp_stack);
3155 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003156 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003157 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003158 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003159 PyEval_GetFuncName(func),
3160 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003161 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003162 Py_DECREF(key);
3163 Py_DECREF(value);
3164 Py_DECREF(kwdict);
3165 return NULL;
3166 }
3167 err = PyDict_SetItem(kwdict, key, value);
3168 Py_DECREF(key);
3169 Py_DECREF(value);
3170 if (err) {
3171 Py_DECREF(kwdict);
3172 return NULL;
3173 }
3174 }
3175 return kwdict;
3176}
3177
3178static PyObject *
3179update_star_args(int nstack, int nstar, PyObject *stararg,
3180 PyObject ***pp_stack)
3181{
3182 PyObject *callargs, *w;
3183
3184 callargs = PyTuple_New(nstack + nstar);
3185 if (callargs == NULL) {
3186 return NULL;
3187 }
3188 if (nstar) {
3189 int i;
3190 for (i = 0; i < nstar; i++) {
3191 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3192 Py_INCREF(a);
3193 PyTuple_SET_ITEM(callargs, nstack + i, a);
3194 }
3195 }
3196 while (--nstack >= 0) {
3197 w = EXT_POP(*pp_stack);
3198 PyTuple_SET_ITEM(callargs, nstack, w);
3199 }
3200 return callargs;
3201}
3202
3203static PyObject *
3204load_args(PyObject ***pp_stack, int na)
3205{
3206 PyObject *args = PyTuple_New(na);
3207 PyObject *w;
3208
3209 if (args == NULL)
3210 return NULL;
3211 while (--na >= 0) {
3212 w = EXT_POP(*pp_stack);
3213 PyTuple_SET_ITEM(args, na, w);
3214 }
3215 return args;
3216}
3217
3218static PyObject *
3219do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3220{
3221 PyObject *callargs = NULL;
3222 PyObject *kwdict = NULL;
3223 PyObject *result = NULL;
3224
3225 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003226 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003227 if (kwdict == NULL)
3228 goto call_fail;
3229 }
3230 callargs = load_args(pp_stack, na);
3231 if (callargs == NULL)
3232 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003233 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003234 call_fail:
3235 Py_XDECREF(callargs);
3236 Py_XDECREF(kwdict);
3237 return result;
3238}
3239
3240static PyObject *
3241ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3242{
3243 int nstar = 0;
3244 PyObject *callargs = NULL;
3245 PyObject *stararg = NULL;
3246 PyObject *kwdict = NULL;
3247 PyObject *result = NULL;
3248
3249 if (flags & CALL_FLAG_KW) {
3250 kwdict = EXT_POP(*pp_stack);
3251 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003252 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003253 "%s%s argument after ** "
3254 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003255 PyEval_GetFuncName(func),
3256 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003257 goto ext_call_fail;
3258 }
3259 }
3260 if (flags & CALL_FLAG_VAR) {
3261 stararg = EXT_POP(*pp_stack);
3262 if (!PyTuple_Check(stararg)) {
3263 PyObject *t = NULL;
3264 t = PySequence_Tuple(stararg);
3265 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003266 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3267 PyErr_Format(PyExc_TypeError,
3268 "%s%s argument after * "
3269 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003270 PyEval_GetFuncName(func),
3271 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003272 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003273 goto ext_call_fail;
3274 }
3275 Py_DECREF(stararg);
3276 stararg = t;
3277 }
3278 nstar = PyTuple_GET_SIZE(stararg);
3279 }
3280 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003281 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003282 if (kwdict == NULL)
3283 goto ext_call_fail;
3284 }
3285 callargs = update_star_args(na, nstar, stararg, pp_stack);
3286 if (callargs == NULL)
3287 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003288 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003289 ext_call_fail:
3290 Py_XDECREF(callargs);
3291 Py_XDECREF(kwdict);
3292 Py_XDECREF(stararg);
3293 return result;
3294}
3295
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003296#define SLICE_ERROR_MSG \
3297 "standard sequence type does not support step size other than one"
3298
Tim Peterscb479e72001-12-16 19:11:44 +00003299/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3300 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3301 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3302*/
Tim Petersb5196382001-12-16 19:44:20 +00003303/* Note: If v is NULL, return success without storing into *pi. This
3304 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3305 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003306*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003307int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003308_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309{
Tim Petersb5196382001-12-16 19:44:20 +00003310 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003311 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003312 if (PyInt_Check(v)) {
3313 x = PyInt_AsLong(v);
3314 } else if (PyLong_Check(v)) {
3315 x = PyLong_AsLong(v);
3316 if (x==-1 && PyErr_Occurred()) {
3317 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003318 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003319
Guido van Rossumac7be682001-01-17 15:42:30 +00003320 if (!PyErr_ExceptionMatches(
3321 PyExc_OverflowError)) {
3322 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003323 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003324 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003325 }
3326
Guido van Rossumac7be682001-01-17 15:42:30 +00003327 /* Clear the OverflowError */
3328 PyErr_Clear();
3329
3330 /* It's an overflow error, so we need to
3331 check the sign of the long integer,
3332 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003333 the error. */
3334
3335 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003336 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003337 if (long_zero == NULL)
3338 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003339
3340 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003341 cmp = PyObject_RichCompareBool(v, long_zero,
3342 Py_GT);
3343 Py_DECREF(long_zero);
3344 if (cmp < 0)
3345 return 0;
3346 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003347 x = INT_MAX;
3348 else
3349 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003350 }
3351 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003352 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003353 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003354 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003356 /* Truncate -- very long indices are truncated anyway */
3357 if (x > INT_MAX)
3358 x = INT_MAX;
3359 else if (x < -INT_MAX)
3360 x = 0;
3361 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003363 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364}
3365
Guido van Rossum50d756e2001-08-18 17:43:36 +00003366#undef ISINT
3367#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3368
Guido van Rossumb209a111997-04-29 18:18:01 +00003369static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003370apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003372 PyTypeObject *tp = u->ob_type;
3373 PySequenceMethods *sq = tp->tp_as_sequence;
3374
3375 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3376 int ilow = 0, ihigh = INT_MAX;
3377 if (!_PyEval_SliceIndex(v, &ilow))
3378 return NULL;
3379 if (!_PyEval_SliceIndex(w, &ihigh))
3380 return NULL;
3381 return PySequence_GetSlice(u, ilow, ihigh);
3382 }
3383 else {
3384 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003385 if (slice != NULL) {
3386 PyObject *res = PyObject_GetItem(u, slice);
3387 Py_DECREF(slice);
3388 return res;
3389 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003390 else
3391 return NULL;
3392 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003394
3395static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003396assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3397 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003399 PyTypeObject *tp = u->ob_type;
3400 PySequenceMethods *sq = tp->tp_as_sequence;
3401
3402 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3403 int ilow = 0, ihigh = INT_MAX;
3404 if (!_PyEval_SliceIndex(v, &ilow))
3405 return -1;
3406 if (!_PyEval_SliceIndex(w, &ihigh))
3407 return -1;
3408 if (x == NULL)
3409 return PySequence_DelSlice(u, ilow, ihigh);
3410 else
3411 return PySequence_SetSlice(u, ilow, ihigh, x);
3412 }
3413 else {
3414 PyObject *slice = PySlice_New(v, w, NULL);
3415 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003416 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003417 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003418 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003419 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003420 res = PyObject_DelItem(u, slice);
3421 Py_DECREF(slice);
3422 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003423 }
3424 else
3425 return -1;
3426 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003427}
3428
Guido van Rossumb209a111997-04-29 18:18:01 +00003429static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003430cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431{
Guido van Rossumac7be682001-01-17 15:42:30 +00003432 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003434 case PyCmp_IS:
3435 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003436 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003437 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003438 res = !res;
3439 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003440 case PyCmp_IN:
3441 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003442 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003443 if (res < 0)
3444 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003445 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003446 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003448 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003449 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450 break;
3451 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003452 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003454 v = res ? Py_True : Py_False;
3455 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 return v;
3457}
3458
Thomas Wouters52152252000-08-17 22:55:00 +00003459static PyObject *
3460import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003461{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003462 PyObject *x;
3463
3464 x = PyObject_GetAttr(v, name);
3465 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003466 PyErr_Format(PyExc_ImportError,
3467 "cannot import name %.230s",
3468 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003469 }
Thomas Wouters52152252000-08-17 22:55:00 +00003470 return x;
3471}
Guido van Rossumac7be682001-01-17 15:42:30 +00003472
Thomas Wouters52152252000-08-17 22:55:00 +00003473static int
3474import_all_from(PyObject *locals, PyObject *v)
3475{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003476 PyObject *all = PyObject_GetAttrString(v, "__all__");
3477 PyObject *dict, *name, *value;
3478 int skip_leading_underscores = 0;
3479 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003480
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003481 if (all == NULL) {
3482 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3483 return -1; /* Unexpected error */
3484 PyErr_Clear();
3485 dict = PyObject_GetAttrString(v, "__dict__");
3486 if (dict == NULL) {
3487 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3488 return -1;
3489 PyErr_SetString(PyExc_ImportError,
3490 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003491 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003492 }
3493 all = PyMapping_Keys(dict);
3494 Py_DECREF(dict);
3495 if (all == NULL)
3496 return -1;
3497 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003498 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003499
3500 for (pos = 0, err = 0; ; pos++) {
3501 name = PySequence_GetItem(all, pos);
3502 if (name == NULL) {
3503 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3504 err = -1;
3505 else
3506 PyErr_Clear();
3507 break;
3508 }
3509 if (skip_leading_underscores &&
3510 PyString_Check(name) &&
3511 PyString_AS_STRING(name)[0] == '_')
3512 {
3513 Py_DECREF(name);
3514 continue;
3515 }
3516 value = PyObject_GetAttr(v, name);
3517 if (value == NULL)
3518 err = -1;
3519 else
3520 err = PyDict_SetItem(locals, name, value);
3521 Py_DECREF(name);
3522 Py_XDECREF(value);
3523 if (err != 0)
3524 break;
3525 }
3526 Py_DECREF(all);
3527 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003528}
3529
Guido van Rossumb209a111997-04-29 18:18:01 +00003530static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003531build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003532{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003533 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003534
3535 if (PyDict_Check(methods))
3536 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003537 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003538 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003539 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3540 base = PyTuple_GET_ITEM(bases, 0);
3541 metaclass = PyObject_GetAttrString(base, "__class__");
3542 if (metaclass == NULL) {
3543 PyErr_Clear();
3544 metaclass = (PyObject *)base->ob_type;
3545 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003546 }
3547 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003548 else {
3549 PyObject *g = PyEval_GetGlobals();
3550 if (g != NULL && PyDict_Check(g))
3551 metaclass = PyDict_GetItemString(g, "__metaclass__");
3552 if (metaclass == NULL)
3553 metaclass = (PyObject *) &PyClass_Type;
3554 Py_INCREF(metaclass);
3555 }
3556 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3557 Py_DECREF(metaclass);
3558 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003559}
3560
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003561static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003562exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3563 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003564{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003565 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003566 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003567 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003568
Guido van Rossumb209a111997-04-29 18:18:01 +00003569 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3570 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003571 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003572 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003573 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003574 locals = PyTuple_GetItem(prog, 2);
3575 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003576 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003577 if (globals == Py_None) {
3578 globals = PyEval_GetGlobals();
3579 if (locals == Py_None) {
3580 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003581 plain = 1;
3582 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003583 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003584 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003585 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003586 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003587 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003588 !PyCode_Check(prog) &&
3589 !PyFile_Check(prog)) {
3590 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003591 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003592 return -1;
3593 }
Fred Drake661ea262000-10-24 19:57:45 +00003594 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003595 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003596 "exec: arg 2 must be a dictionary or None");
3597 return -1;
3598 }
3599 if (!PyDict_Check(locals)) {
3600 PyErr_SetString(PyExc_TypeError,
3601 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003602 return -1;
3603 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003604 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003605 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003606 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003607 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3608 PyErr_SetString(PyExc_TypeError,
3609 "code object passed to exec may not contain free variables");
3610 return -1;
3611 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003612 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003613 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003614 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003615 FILE *fp = PyFile_AsFile(prog);
3616 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003617 PyCompilerFlags cf;
3618 cf.cf_flags = 0;
3619 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003620 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3621 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003622 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003623 v = PyRun_File(fp, name, Py_file_input, globals,
3624 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003625 }
3626 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003627 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003628 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003629 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003630 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003631 cf.cf_flags = 0;
3632 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003633 v = PyRun_StringFlags(str, Py_file_input, globals,
3634 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003635 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003636 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003637 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003638 if (plain)
3639 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003640 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003641 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003642 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003643 return 0;
3644}
Guido van Rossum24c13741995-02-14 09:42:43 +00003645
Guido van Rossumac7be682001-01-17 15:42:30 +00003646static void
Paul Prescode68140d2000-08-30 20:25:01 +00003647format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3648{
3649 char *obj_str;
3650
3651 if (!obj)
3652 return;
3653
3654 obj_str = PyString_AsString(obj);
3655 if (!obj_str)
3656 return;
3657
3658 PyErr_Format(exc, format_str, obj_str);
3659}
Guido van Rossum950361c1997-01-24 13:49:28 +00003660
3661#ifdef DYNAMIC_EXECUTION_PROFILE
3662
Skip Montanarof118cb12001-10-15 20:51:38 +00003663static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003664getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003665{
3666 int i;
3667 PyObject *l = PyList_New(256);
3668 if (l == NULL) return NULL;
3669 for (i = 0; i < 256; i++) {
3670 PyObject *x = PyInt_FromLong(a[i]);
3671 if (x == NULL) {
3672 Py_DECREF(l);
3673 return NULL;
3674 }
3675 PyList_SetItem(l, i, x);
3676 }
3677 for (i = 0; i < 256; i++)
3678 a[i] = 0;
3679 return l;
3680}
3681
3682PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003683_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003684{
3685#ifndef DXPAIRS
3686 return getarray(dxp);
3687#else
3688 int i;
3689 PyObject *l = PyList_New(257);
3690 if (l == NULL) return NULL;
3691 for (i = 0; i < 257; i++) {
3692 PyObject *x = getarray(dxpairs[i]);
3693 if (x == NULL) {
3694 Py_DECREF(l);
3695 return NULL;
3696 }
3697 PyList_SetItem(l, i, x);
3698 }
3699 return l;
3700#endif
3701}
3702
3703#endif