blob: 9df336e1adb4f27dcb811fde7eaf9c360e9cc798 [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
Guido van Rossumd076c731998-10-07 19:42:25 +0000517#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000518#define NEXTOP() (*next_instr++)
519#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000520#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000521#define JUMPBY(x) (next_instr += (x))
522
523/* Stack manipulation macros */
524
525#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
526#define EMPTY() (STACK_LEVEL() == 0)
527#define TOP() (stack_pointer[-1])
528#define BASIC_PUSH(v) (*stack_pointer++ = (v))
529#define BASIC_POP() (*--stack_pointer)
530
Guido van Rossum96a42c81992-01-12 02:29:51 +0000531#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000532#define PUSH(v) { (void)(BASIC_PUSH(v), \
533 lltrace && prtrace(TOP(), "push")); \
534 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000535#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000536#else
537#define PUSH(v) BASIC_PUSH(v)
538#define POP() BASIC_POP()
539#endif
540
Guido van Rossum681d79a1995-07-18 14:51:37 +0000541/* Local variable macros */
542
543#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000544
545/* The SETLOCAL() macro must not DECREF the local variable in-place and
546 then store the new value; it must copy the old value to a temporary
547 value, then store the new value, and then DECREF the temporary value.
548 This is because it is possible that during the DECREF the frame is
549 accessed by other code (e.g. a __del__ method or gc.collect()) and the
550 variable would be pointing to already-freed memory. */
551#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
552 GETLOCAL(i) = value; \
553 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554
Guido van Rossuma027efa1997-05-05 20:56:21 +0000555/* Start of code */
556
Tim Peters5ca576e2001-06-18 22:08:13 +0000557 if (f == NULL)
558 return NULL;
559
Guido van Rossum8861b741996-07-30 16:49:37 +0000560#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000561 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000562 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000563 return NULL;
564 }
565#endif
566
Tim Peters5ca576e2001-06-18 22:08:13 +0000567 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000568 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000569 --tstate->recursion_depth;
570 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000571 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000572 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000573 return NULL;
574 }
575
Tim Peters5ca576e2001-06-18 22:08:13 +0000576 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000577 co = f->f_code;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000578 names = co->co_names;
579 consts = co->co_consts;
Tim Peters5ca576e2001-06-18 22:08:13 +0000580 fastlocals = f->f_localsplus;
581 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000582 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000583 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000584 stack_pointer = f->f_stacktop;
585 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000586 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000587
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000588 if (tstate->use_tracing) {
589 if (tstate->c_tracefunc != NULL) {
590 /* tstate->c_tracefunc, if defined, is a
591 function that will be called on *every* entry
592 to a code block. Its return value, if not
593 None, is a function that will be called at
594 the start of each executed line of code.
595 (Actually, the function must return itself
596 in order to continue tracing.) The trace
597 functions are called with three arguments:
598 a pointer to the current frame, a string
599 indicating why the function is called, and
600 an argument which depends on the situation.
601 The global trace function is also called
602 whenever an exception is detected. */
603 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
604 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000605 /* Trace function raised an error */
606 return NULL;
607 }
608 }
609 if (tstate->c_profilefunc != NULL) {
610 /* Similar for c_profilefunc, except it needn't
611 return itself and isn't called for "line" events */
612 if (call_trace(tstate->c_profilefunc,
613 tstate->c_profileobj,
614 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000615 /* Profile function raised an error */
616 return NULL;
617 }
618 }
619 }
620
Tim Peters5ca576e2001-06-18 22:08:13 +0000621#ifdef LLTRACE
622 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
623#endif
624#if defined(Py_DEBUG) || defined(LLTRACE)
625 filename = PyString_AsString(co->co_filename);
626#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000627
Guido van Rossum374a9221991-04-04 10:40:29 +0000628 why = WHY_NOT;
629 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000630 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000631 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000632
Guido van Rossum374a9221991-04-04 10:40:29 +0000633 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000634 assert(stack_pointer >= f->f_valuestack); /* else underflow */
635 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000636 /* Do periodic things. Doing this every time through
637 the loop would add too much overhead, so we do it
638 only every Nth instruction. We also do it if
639 ``things_to_do'' is set, i.e. when an asynchronous
640 event needs attention (e.g. a signal handler or
641 async I/O handler); see Py_AddPendingCall() and
642 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000643
Guido van Rossuma027efa1997-05-05 20:56:21 +0000644 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000645 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000646 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000647 if (Py_MakePendingCalls() < 0) {
648 why = WHY_EXCEPTION;
649 goto on_error;
650 }
651 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000652#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000653 /* If we have true signals, the signal handler
654 will call Py_AddPendingCall() so we don't
655 have to call sigcheck(). On the Mac and
656 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000657 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 goto on_error;
660 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000661#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662
Guido van Rossume59214e1994-08-30 08:01:59 +0000663#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664 if (interpreter_lock) {
665 /* Give another thread a chance */
666
Guido van Rossum25ce5661997-08-02 03:10:38 +0000667 if (PyThreadState_Swap(NULL) != tstate)
668 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000669 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670
671 /* Other threads may run now */
672
Guido van Rossum65d5b571998-12-21 19:32:43 +0000673 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000674 if (PyThreadState_Swap(tstate) != NULL)
675 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000676 }
677#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679
Neil Schemenauer63543862002-02-17 19:10:14 +0000680 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000682
Guido van Rossum408027e1996-12-30 16:17:54 +0000683#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000684 f->f_lasti = INSTR_OFFSET();
685#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000686
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 opcode = NEXTOP();
688 if (HAS_ARG(opcode))
689 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000690 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000691#ifdef DYNAMIC_EXECUTION_PROFILE
692#ifdef DXPAIRS
693 dxpairs[lastopcode][opcode]++;
694 lastopcode = opcode;
695#endif
696 dxp[opcode]++;
697#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000698
Guido van Rossum96a42c81992-01-12 02:29:51 +0000699#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000701
Guido van Rossum96a42c81992-01-12 02:29:51 +0000702 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 if (HAS_ARG(opcode)) {
704 printf("%d: %d, %d\n",
705 (int) (INSTR_OFFSET() - 3),
706 opcode, oparg);
707 }
708 else {
709 printf("%d: %d\n",
710 (int) (INSTR_OFFSET() - 1), opcode);
711 }
712 }
713#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000717
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 /* BEWARE!
719 It is essential that any operation that fails sets either
720 x to NULL, err to nonzero, or why to anything but WHY_NOT,
721 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000724
Neil Schemenauer63543862002-02-17 19:10:14 +0000725 case SET_LINENO:
726#ifdef LLTRACE
727 if (lltrace)
728 printf("--- %s:%d \n", filename, oparg);
729#endif
730 f->f_lineno = oparg;
731 if (tstate->c_tracefunc == NULL || tstate->tracing)
732 goto fast_next_opcode;
733 /* Trace each line of code reached */
734 f->f_lasti = INSTR_OFFSET();
735 /* Inline call_trace() for performance: */
736 tstate->tracing++;
737 tstate->use_tracing = 0;
738 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
739 PyTrace_LINE, Py_None);
740 tstate->use_tracing = (tstate->c_tracefunc
741 || tstate->c_profilefunc);
742 tstate->tracing--;
743 break;
744
745 case LOAD_FAST:
746 x = GETLOCAL(oparg);
747 if (x != NULL) {
748 Py_INCREF(x);
749 PUSH(x);
750 goto fast_next_opcode;
751 }
752 format_exc_check_arg(PyExc_UnboundLocalError,
753 UNBOUNDLOCAL_ERROR_MSG,
754 PyTuple_GetItem(co->co_varnames, oparg));
755 break;
756
757 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000758 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000759 Py_INCREF(x);
760 PUSH(x);
761 goto fast_next_opcode;
762
763 case STORE_FAST:
764 v = POP();
765 SETLOCAL(oparg, v);
766 goto fast_next_opcode;
767
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 case POP_TOP:
769 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000770 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000771 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000772
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 case ROT_TWO:
774 v = POP();
775 w = POP();
776 PUSH(v);
777 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000778 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000779
Guido van Rossum374a9221991-04-04 10:40:29 +0000780 case ROT_THREE:
781 v = POP();
782 w = POP();
783 x = POP();
784 PUSH(v);
785 PUSH(x);
786 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000787 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000788
Thomas Wouters434d0822000-08-24 20:11:32 +0000789 case ROT_FOUR:
790 u = POP();
791 v = POP();
792 w = POP();
793 x = POP();
794 PUSH(u);
795 PUSH(x);
796 PUSH(w);
797 PUSH(v);
798 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000799
Guido van Rossum374a9221991-04-04 10:40:29 +0000800 case DUP_TOP:
801 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000802 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000804 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000805
Thomas Wouters434d0822000-08-24 20:11:32 +0000806 case DUP_TOPX:
807 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000808 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000809 x = TOP();
810 Py_INCREF(x);
811 PUSH(x);
812 continue;
813 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000814 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000815 Py_INCREF(x);
816 w = TOP();
817 Py_INCREF(w);
818 PUSH(x);
819 PUSH(w);
820 PUSH(x);
821 continue;
822 case 3:
823 x = POP();
824 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000825 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000826 Py_INCREF(w);
827 v = TOP();
828 Py_INCREF(v);
829 PUSH(w);
830 PUSH(x);
831 PUSH(v);
832 PUSH(w);
833 PUSH(x);
834 continue;
835 case 4:
836 x = POP();
837 Py_INCREF(x);
838 w = POP();
839 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000840 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000841 Py_INCREF(v);
842 u = TOP();
843 Py_INCREF(u);
844 PUSH(v);
845 PUSH(w);
846 PUSH(x);
847 PUSH(u);
848 PUSH(v);
849 PUSH(w);
850 PUSH(x);
851 continue;
852 case 5:
853 x = POP();
854 Py_INCREF(x);
855 w = POP();
856 Py_INCREF(w);
857 v = POP();
858 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000859 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000860 Py_INCREF(u);
861 t = TOP();
862 Py_INCREF(t);
863 PUSH(u);
864 PUSH(v);
865 PUSH(w);
866 PUSH(x);
867 PUSH(t);
868 PUSH(u);
869 PUSH(v);
870 PUSH(w);
871 PUSH(x);
872 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000873 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000874 Py_FatalError("invalid argument to DUP_TOPX"
875 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000876 }
Tim Peters35ba6892000-10-11 07:04:49 +0000877 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000878
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 case UNARY_POSITIVE:
880 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000881 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000882 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000884 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000885 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000886
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 case UNARY_NEGATIVE:
888 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000889 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000890 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000894
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 case UNARY_NOT:
896 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000897 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000899 if (err == 0) {
900 Py_INCREF(Py_True);
901 PUSH(Py_True);
902 continue;
903 }
904 else if (err > 0) {
905 Py_INCREF(Py_False);
906 PUSH(Py_False);
907 err = 0;
908 continue;
909 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000911
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 case UNARY_CONVERT:
913 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000914 x = PyObject_Repr(v);
915 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000917 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000919
Guido van Rossum7928cd71991-10-24 14:59:31 +0000920 case UNARY_INVERT:
921 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000922 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000923 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000924 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000925 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000926 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000927
Guido van Rossum50564e81996-01-12 01:13:16 +0000928 case BINARY_POWER:
929 w = POP();
930 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000931 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000932 Py_DECREF(v);
933 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000934 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000935 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000936 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000937
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 case BINARY_MULTIPLY:
939 w = POP();
940 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000941 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000949 if (!_Py_QnewFlag) {
950 w = POP();
951 v = POP();
952 x = PyNumber_Divide(v, w);
953 Py_DECREF(v);
954 Py_DECREF(w);
955 PUSH(x);
956 if (x != NULL) continue;
957 break;
958 }
959 /* -Qnew is in effect: fall through to
960 BINARY_TRUE_DIVIDE */
961 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 w = POP();
963 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000964 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000965 Py_DECREF(v);
966 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000968 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000970
Guido van Rossum4668b002001-08-08 05:00:18 +0000971 case BINARY_FLOOR_DIVIDE:
972 w = POP();
973 v = POP();
974 x = PyNumber_FloorDivide(v, w);
975 Py_DECREF(v);
976 Py_DECREF(w);
977 PUSH(x);
978 if (x != NULL) continue;
979 break;
980
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 case BINARY_MODULO:
982 w = POP();
983 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000984 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000985 Py_DECREF(v);
986 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000988 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000989 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000990
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 case BINARY_ADD:
992 w = POP();
993 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +0000994 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000995 /* INLINE: int + int */
996 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000997 a = PyInt_AS_LONG(v);
998 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000999 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001000 if ((i^a) < 0 && (i^b) < 0)
1001 goto slow_add;
1002 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001003 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001004 else {
1005 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001007 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001008 Py_DECREF(v);
1009 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001011 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001013
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 case BINARY_SUBTRACT:
1015 w = POP();
1016 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001017 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001018 /* INLINE: int - int */
1019 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001020 a = PyInt_AS_LONG(v);
1021 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001022 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001023 if ((i^a) < 0 && (i^~b) < 0)
1024 goto slow_sub;
1025 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001026 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001027 else {
1028 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001029 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001030 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001031 Py_DECREF(v);
1032 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001034 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001035 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001036
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 case BINARY_SUBSCR:
1038 w = POP();
1039 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001040 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001041 /* INLINE: list[int] */
1042 long i = PyInt_AsLong(w);
1043 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001044 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001045 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001046 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001047 PyErr_SetString(PyExc_IndexError,
1048 "list index out of range");
1049 x = NULL;
1050 }
1051 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001052 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001053 Py_INCREF(x);
1054 }
1055 }
1056 else
1057 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001058 Py_DECREF(v);
1059 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001061 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001062 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001063
Guido van Rossum7928cd71991-10-24 14:59:31 +00001064 case BINARY_LSHIFT:
1065 w = POP();
1066 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001067 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001068 Py_DECREF(v);
1069 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001070 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001071 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001072 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001073
Guido van Rossum7928cd71991-10-24 14:59:31 +00001074 case BINARY_RSHIFT:
1075 w = POP();
1076 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001077 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001078 Py_DECREF(v);
1079 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001080 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001081 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001082 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001083
Guido van Rossum7928cd71991-10-24 14:59:31 +00001084 case BINARY_AND:
1085 w = POP();
1086 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001087 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001088 Py_DECREF(v);
1089 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001090 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001091 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001092 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001093
Guido van Rossum7928cd71991-10-24 14:59:31 +00001094 case BINARY_XOR:
1095 w = POP();
1096 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001097 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001098 Py_DECREF(v);
1099 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001100 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001101 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001102 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001103
Guido van Rossum7928cd71991-10-24 14:59:31 +00001104 case BINARY_OR:
1105 w = POP();
1106 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001107 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001108 Py_DECREF(v);
1109 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001110 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001111 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001112 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001113
1114 case INPLACE_POWER:
1115 w = POP();
1116 v = POP();
1117 x = PyNumber_InPlacePower(v, w, Py_None);
1118 Py_DECREF(v);
1119 Py_DECREF(w);
1120 PUSH(x);
1121 if (x != NULL) continue;
1122 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001123
Thomas Wouters434d0822000-08-24 20:11:32 +00001124 case INPLACE_MULTIPLY:
1125 w = POP();
1126 v = POP();
1127 x = PyNumber_InPlaceMultiply(v, w);
1128 Py_DECREF(v);
1129 Py_DECREF(w);
1130 PUSH(x);
1131 if (x != NULL) continue;
1132 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001133
Thomas Wouters434d0822000-08-24 20:11:32 +00001134 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001135 if (!_Py_QnewFlag) {
1136 w = POP();
1137 v = POP();
1138 x = PyNumber_InPlaceDivide(v, w);
1139 Py_DECREF(v);
1140 Py_DECREF(w);
1141 PUSH(x);
1142 if (x != NULL) continue;
1143 break;
1144 }
1145 /* -Qnew is in effect: fall through to
1146 INPLACE_TRUE_DIVIDE */
1147 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 w = POP();
1149 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001150 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 Py_DECREF(v);
1152 Py_DECREF(w);
1153 PUSH(x);
1154 if (x != NULL) continue;
1155 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001156
Guido van Rossum4668b002001-08-08 05:00:18 +00001157 case INPLACE_FLOOR_DIVIDE:
1158 w = POP();
1159 v = POP();
1160 x = PyNumber_InPlaceFloorDivide(v, w);
1161 Py_DECREF(v);
1162 Py_DECREF(w);
1163 PUSH(x);
1164 if (x != NULL) continue;
1165 break;
1166
Thomas Wouters434d0822000-08-24 20:11:32 +00001167 case INPLACE_MODULO:
1168 w = POP();
1169 v = POP();
1170 x = PyNumber_InPlaceRemainder(v, w);
1171 Py_DECREF(v);
1172 Py_DECREF(w);
1173 PUSH(x);
1174 if (x != NULL) continue;
1175 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001176
Thomas Wouters434d0822000-08-24 20:11:32 +00001177 case INPLACE_ADD:
1178 w = POP();
1179 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001180 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001181 /* INLINE: int + int */
1182 register long a, b, i;
1183 a = PyInt_AS_LONG(v);
1184 b = PyInt_AS_LONG(w);
1185 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001186 if ((i^a) < 0 && (i^b) < 0)
1187 goto slow_iadd;
1188 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001189 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001190 else {
1191 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001192 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001193 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001194 Py_DECREF(v);
1195 Py_DECREF(w);
1196 PUSH(x);
1197 if (x != NULL) continue;
1198 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001199
Thomas Wouters434d0822000-08-24 20:11:32 +00001200 case INPLACE_SUBTRACT:
1201 w = POP();
1202 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001203 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001204 /* INLINE: int - int */
1205 register long a, b, i;
1206 a = PyInt_AS_LONG(v);
1207 b = PyInt_AS_LONG(w);
1208 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001209 if ((i^a) < 0 && (i^~b) < 0)
1210 goto slow_isub;
1211 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001212 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001213 else {
1214 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001216 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001217 Py_DECREF(v);
1218 Py_DECREF(w);
1219 PUSH(x);
1220 if (x != NULL) continue;
1221 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001222
Thomas Wouters434d0822000-08-24 20:11:32 +00001223 case INPLACE_LSHIFT:
1224 w = POP();
1225 v = POP();
1226 x = PyNumber_InPlaceLshift(v, w);
1227 Py_DECREF(v);
1228 Py_DECREF(w);
1229 PUSH(x);
1230 if (x != NULL) continue;
1231 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001232
Thomas Wouters434d0822000-08-24 20:11:32 +00001233 case INPLACE_RSHIFT:
1234 w = POP();
1235 v = POP();
1236 x = PyNumber_InPlaceRshift(v, w);
1237 Py_DECREF(v);
1238 Py_DECREF(w);
1239 PUSH(x);
1240 if (x != NULL) continue;
1241 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001242
Thomas Wouters434d0822000-08-24 20:11:32 +00001243 case INPLACE_AND:
1244 w = POP();
1245 v = POP();
1246 x = PyNumber_InPlaceAnd(v, w);
1247 Py_DECREF(v);
1248 Py_DECREF(w);
1249 PUSH(x);
1250 if (x != NULL) continue;
1251 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001252
Thomas Wouters434d0822000-08-24 20:11:32 +00001253 case INPLACE_XOR:
1254 w = POP();
1255 v = POP();
1256 x = PyNumber_InPlaceXor(v, w);
1257 Py_DECREF(v);
1258 Py_DECREF(w);
1259 PUSH(x);
1260 if (x != NULL) continue;
1261 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001262
Thomas Wouters434d0822000-08-24 20:11:32 +00001263 case INPLACE_OR:
1264 w = POP();
1265 v = POP();
1266 x = PyNumber_InPlaceOr(v, w);
1267 Py_DECREF(v);
1268 Py_DECREF(w);
1269 PUSH(x);
1270 if (x != NULL) continue;
1271 break;
1272
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 case SLICE+0:
1274 case SLICE+1:
1275 case SLICE+2:
1276 case SLICE+3:
1277 if ((opcode-SLICE) & 2)
1278 w = POP();
1279 else
1280 w = NULL;
1281 if ((opcode-SLICE) & 1)
1282 v = POP();
1283 else
1284 v = NULL;
1285 u = POP();
1286 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 Py_DECREF(u);
1288 Py_XDECREF(v);
1289 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001291 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001293
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 case STORE_SLICE+0:
1295 case STORE_SLICE+1:
1296 case STORE_SLICE+2:
1297 case STORE_SLICE+3:
1298 if ((opcode-STORE_SLICE) & 2)
1299 w = POP();
1300 else
1301 w = NULL;
1302 if ((opcode-STORE_SLICE) & 1)
1303 v = POP();
1304 else
1305 v = NULL;
1306 u = POP();
1307 t = POP();
1308 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 Py_DECREF(t);
1310 Py_DECREF(u);
1311 Py_XDECREF(v);
1312 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001313 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001314 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001315
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 case DELETE_SLICE+0:
1317 case DELETE_SLICE+1:
1318 case DELETE_SLICE+2:
1319 case DELETE_SLICE+3:
1320 if ((opcode-DELETE_SLICE) & 2)
1321 w = POP();
1322 else
1323 w = NULL;
1324 if ((opcode-DELETE_SLICE) & 1)
1325 v = POP();
1326 else
1327 v = NULL;
1328 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001329 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001331 Py_DECREF(u);
1332 Py_XDECREF(v);
1333 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001334 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001336
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 case STORE_SUBSCR:
1338 w = POP();
1339 v = POP();
1340 u = POP();
1341 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001342 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 Py_DECREF(u);
1344 Py_DECREF(v);
1345 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001346 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001348
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 case DELETE_SUBSCR:
1350 w = POP();
1351 v = POP();
1352 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001353 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001354 Py_DECREF(v);
1355 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001356 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001358
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 case PRINT_EXPR:
1360 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001361 w = PySys_GetObject("displayhook");
1362 if (w == NULL) {
1363 PyErr_SetString(PyExc_RuntimeError,
1364 "lost sys.displayhook");
1365 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001366 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001367 }
1368 if (err == 0) {
1369 x = Py_BuildValue("(O)", v);
1370 if (x == NULL)
1371 err = -1;
1372 }
1373 if (err == 0) {
1374 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001375 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001376 if (w == NULL)
1377 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001379 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001380 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001382
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001383 case PRINT_ITEM_TO:
1384 w = stream = POP();
1385 /* fall through to PRINT_ITEM */
1386
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 case PRINT_ITEM:
1388 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001389 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001390 w = PySys_GetObject("stdout");
1391 if (w == NULL) {
1392 PyErr_SetString(PyExc_RuntimeError,
1393 "lost sys.stdout");
1394 err = -1;
1395 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001396 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001397 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001398 err = PyFile_WriteString(" ", w);
1399 if (err == 0)
1400 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001401 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001402 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001403 if (PyString_Check(v)) {
1404 char *s = PyString_AS_STRING(v);
1405 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001406 if (len == 0 ||
1407 !isspace(Py_CHARMASK(s[len-1])) ||
1408 s[len-1] == ' ')
1409 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001410 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001411#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001412 else if (PyUnicode_Check(v)) {
1413 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1414 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001415 if (len == 0 ||
1416 !Py_UNICODE_ISSPACE(s[len-1]) ||
1417 s[len-1] == ' ')
1418 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001419 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001420#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001421 else
1422 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001424 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001425 Py_XDECREF(stream);
1426 stream = NULL;
1427 if (err == 0)
1428 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001430
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001431 case PRINT_NEWLINE_TO:
1432 w = stream = POP();
1433 /* fall through to PRINT_NEWLINE */
1434
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001436 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001437 w = PySys_GetObject("stdout");
1438 if (w == NULL)
1439 PyErr_SetString(PyExc_RuntimeError,
1440 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001441 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001442 if (w != NULL) {
1443 err = PyFile_WriteString("\n", w);
1444 if (err == 0)
1445 PyFile_SoftSpace(w, 0);
1446 }
1447 Py_XDECREF(stream);
1448 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001450
Thomas Wouters434d0822000-08-24 20:11:32 +00001451
1452#ifdef CASE_TOO_BIG
1453 default: switch (opcode) {
1454#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 case BREAK_LOOP:
1456 why = WHY_BREAK;
1457 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001458
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001459 case CONTINUE_LOOP:
1460 retval = PyInt_FromLong(oparg);
1461 why = WHY_CONTINUE;
1462 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001463
Guido van Rossumf10570b1995-07-07 22:53:21 +00001464 case RAISE_VARARGS:
1465 u = v = w = NULL;
1466 switch (oparg) {
1467 case 3:
1468 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001469 /* Fallthrough */
1470 case 2:
1471 v = POP(); /* value */
1472 /* Fallthrough */
1473 case 1:
1474 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001475 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001476 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001477 break;
1478 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001481 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001482 break;
1483 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001485
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001487 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001488 PyErr_SetString(PyExc_SystemError,
1489 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001490 break;
1491 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001493 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001495
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 case RETURN_VALUE:
1497 retval = POP();
1498 why = WHY_RETURN;
1499 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001500
Tim Peters5ca576e2001-06-18 22:08:13 +00001501 case YIELD_VALUE:
1502 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001503 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001504 f->f_lasti = INSTR_OFFSET();
1505 why = WHY_YIELD;
1506 break;
1507
1508
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001509 case EXEC_STMT:
1510 w = POP();
1511 v = POP();
1512 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001513 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001514 Py_DECREF(u);
1515 Py_DECREF(v);
1516 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001517 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001518
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 case POP_BLOCK:
1520 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001521 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 while (STACK_LEVEL() > b->b_level) {
1523 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 }
1526 }
1527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case END_FINALLY:
1530 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 if (PyInt_Check(v)) {
1532 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001533 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001534 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001535 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 retval = POP();
1537 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001540 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001543 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001545 else if (v != Py_None) {
1546 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 "'finally' pops bad exception");
1548 why = WHY_EXCEPTION;
1549 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001552
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001554 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001556 w = POP();
1557 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 Py_DECREF(u);
1560 Py_DECREF(v);
1561 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001563
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001565 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001568 PyErr_Format(PyExc_SystemError,
1569 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001570 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001571 break;
1572 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 err = PyDict_SetItem(x, w, v);
1574 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001576
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001578 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001579 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001580 PyErr_Format(PyExc_SystemError,
1581 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001582 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001583 break;
1584 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001585 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001586 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001587 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001589
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001590 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001592 if (PyTuple_Check(v)) {
1593 if (PyTuple_Size(v) != oparg) {
1594 PyErr_SetString(PyExc_ValueError,
1595 "unpack tuple of wrong size");
1596 why = WHY_EXCEPTION;
1597 }
1598 else {
1599 for (; --oparg >= 0; ) {
1600 w = PyTuple_GET_ITEM(v, oparg);
1601 Py_INCREF(w);
1602 PUSH(w);
1603 }
1604 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001606 else if (PyList_Check(v)) {
1607 if (PyList_Size(v) != oparg) {
1608 PyErr_SetString(PyExc_ValueError,
1609 "unpack list of wrong size");
1610 why = WHY_EXCEPTION;
1611 }
1612 else {
1613 for (; --oparg >= 0; ) {
1614 w = PyList_GET_ITEM(v, oparg);
1615 Py_INCREF(w);
1616 PUSH(w);
1617 }
1618 }
1619 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001620 else if (unpack_iterable(v, oparg,
1621 stack_pointer + oparg))
1622 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001623 else {
1624 if (PyErr_ExceptionMatches(PyExc_TypeError))
1625 PyErr_SetString(PyExc_TypeError,
1626 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001627 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001628 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001629 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001631
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001633 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 v = POP();
1635 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1637 Py_DECREF(v);
1638 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001640
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001642 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001644 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1645 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001647 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001648
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001649 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001650 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001651 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001652 err = PyDict_SetItem(f->f_globals, w, v);
1653 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001654 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001655
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001656 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001657 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001659 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001660 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001661 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001662
Guido van Rossum374a9221991-04-04 10:40:29 +00001663 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001664 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001665 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001666 PyErr_Format(PyExc_SystemError,
1667 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001668 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001669 break;
1670 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001671 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001673 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001677 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001678 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001679 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 break;
1681 }
1682 }
1683 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 PUSH(x);
1686 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001687
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001689 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001690 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001692 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001694 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001695 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001696 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 break;
1698 }
1699 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 PUSH(x);
1702 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001703
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001704 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001705 x = GETLOCAL(oparg);
1706 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001707 format_exc_check_arg(
1708 PyExc_UnboundLocalError,
1709 UNBOUNDLOCAL_ERROR_MSG,
1710 PyTuple_GetItem(co->co_varnames, oparg)
1711 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001712 break;
1713 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001714 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001715 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001716
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001717 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001718 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001719 Py_INCREF(x);
1720 PUSH(x);
1721 break;
1722
1723 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001724 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001725 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001726 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001727 err = -1;
1728 /* Don't stomp existing exception */
1729 if (PyErr_Occurred())
1730 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001731 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001732 v = PyTuple_GetItem(co->co_cellvars,
1733 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001734 format_exc_check_arg(
1735 PyExc_UnboundLocalError,
1736 UNBOUNDLOCAL_ERROR_MSG,
1737 v);
1738 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001739 v = PyTuple_GetItem(
1740 co->co_freevars,
1741 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001742 format_exc_check_arg(
1743 PyExc_NameError,
1744 UNBOUNDFREE_ERROR_MSG,
1745 v);
1746 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001747 break;
1748 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001749 PUSH(w);
1750 break;
1751
1752 case STORE_DEREF:
1753 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001754 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001755 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001756 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001757 continue;
1758
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 if (x != NULL) {
1762 for (; --oparg >= 0;) {
1763 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001764 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 }
1766 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001767 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 }
1769 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001770
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 if (x != NULL) {
1774 for (; --oparg >= 0;) {
1775 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001776 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001777 }
1778 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001779 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 }
1781 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001782
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001786 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001788
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001790 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001792 x = PyObject_GetAttr(v, w);
1793 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001795 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001797
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 case COMPARE_OP:
1799 w = POP();
1800 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001801 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001802 /* INLINE: cmp(int, int) */
1803 register long a, b;
1804 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001805 a = PyInt_AS_LONG(v);
1806 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001807 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001808 case PyCmp_LT: res = a < b; break;
1809 case PyCmp_LE: res = a <= b; break;
1810 case PyCmp_EQ: res = a == b; break;
1811 case PyCmp_NE: res = a != b; break;
1812 case PyCmp_GT: res = a > b; break;
1813 case PyCmp_GE: res = a >= b; break;
1814 case PyCmp_IS: res = v == w; break;
1815 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001816 default: goto slow_compare;
1817 }
1818 x = res ? Py_True : Py_False;
1819 Py_INCREF(x);
1820 }
1821 else {
1822 slow_compare:
1823 x = cmp_outcome(oparg, v, w);
1824 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001825 Py_DECREF(v);
1826 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001828 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001830
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001832 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001833 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001834 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001835 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001836 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001837 break;
1838 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001839 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001840 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001841 w,
1842 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001843 f->f_locals == NULL ?
1844 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001845 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001847 if (w == NULL) {
1848 x = NULL;
1849 break;
1850 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 x = PyEval_CallObject(x, w);
1852 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001853 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001854 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001856
Thomas Wouters52152252000-08-17 22:55:00 +00001857 case IMPORT_STAR:
1858 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001860 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001861 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001862 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001863 break;
1864 }
Thomas Wouters52152252000-08-17 22:55:00 +00001865 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001866 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001867 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001868 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001870
Thomas Wouters52152252000-08-17 22:55:00 +00001871 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001872 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001873 v = TOP();
1874 x = import_from(v, w);
1875 PUSH(x);
1876 if (x != NULL) continue;
1877 break;
1878
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 case JUMP_FORWARD:
1880 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001881 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001882
Guido van Rossum374a9221991-04-04 10:40:29 +00001883 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001884 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001885 if (err > 0)
1886 err = 0;
1887 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001888 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001889 else
1890 break;
1891 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001892
Guido van Rossum374a9221991-04-04 10:40:29 +00001893 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001894 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001895 if (err > 0) {
1896 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001897 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001898 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001899 else if (err == 0)
1900 ;
1901 else
1902 break;
1903 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001904
Guido van Rossum374a9221991-04-04 10:40:29 +00001905 case JUMP_ABSOLUTE:
1906 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001907 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001908
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001909 case GET_ITER:
1910 /* before: [obj]; after [getiter(obj)] */
1911 v = POP();
1912 x = PyObject_GetIter(v);
1913 Py_DECREF(v);
1914 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001915 PUSH(x);
1916 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001917 }
1918 break;
1919
1920 case FOR_ITER:
1921 /* before: [iter]; after: [iter, iter()] *or* [] */
1922 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001923 x = PyIter_Next(v);
1924 if (x != NULL) {
1925 PUSH(x);
1926 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001927 }
Tim Petersf4848da2001-05-05 00:14:56 +00001928 if (!PyErr_Occurred()) {
1929 /* iterator ended normally */
1930 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001931 Py_DECREF(v);
1932 JUMPBY(oparg);
1933 continue;
1934 }
1935 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001936
Guido van Rossum374a9221991-04-04 10:40:29 +00001937 case SETUP_LOOP:
1938 case SETUP_EXCEPT:
1939 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001940 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001941 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001942 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001943
Guido van Rossumf10570b1995-07-07 22:53:21 +00001944 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001945 {
1946 int na = oparg & 0xff;
1947 int nk = (oparg>>8) & 0xff;
1948 int n = na + 2 * nk;
1949 PyObject **pfunc = stack_pointer - n - 1;
1950 PyObject *func = *pfunc;
1951 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1952
1953 /* Always dispatch PyCFunction first, because
1954 these are presumed to be the most frequent
1955 callable object.
1956 */
1957 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001958 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001959 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001960 x = do_call(func, &stack_pointer,
1961 na, nk);
1962 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001963 PyObject *callargs;
1964 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001965 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001966 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001967 } else
1968 x = fast_cfunction(func,
1969 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001970 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001971 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001972 && PyMethod_GET_SELF(func) != NULL) {
1973 /* optimize access to bound methods */
1974 PyObject *self = PyMethod_GET_SELF(func);
1975 Py_INCREF(self);
1976 func = PyMethod_GET_FUNCTION(func);
1977 Py_INCREF(func);
1978 Py_DECREF(*pfunc);
1979 *pfunc = self;
1980 na++;
1981 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001982 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001983 Py_INCREF(func);
1984 if (PyFunction_Check(func)) {
1985 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001986 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001987 } else {
1988 x = do_call(func, &stack_pointer,
1989 na, nk);
1990 }
1991 Py_DECREF(func);
1992 }
1993
1994 while (stack_pointer > pfunc) {
1995 w = POP();
1996 Py_DECREF(w);
1997 }
1998 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001999 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002000 continue;
2001 break;
2002 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002003
Jeremy Hylton76901512000-03-28 23:49:17 +00002004 case CALL_FUNCTION_VAR:
2005 case CALL_FUNCTION_KW:
2006 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002007 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002008 int na = oparg & 0xff;
2009 int nk = (oparg>>8) & 0xff;
2010 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 int n = na + 2 * nk;
2012 PyObject **pfunc, *func;
2013 if (flags & CALL_FLAG_VAR)
2014 n++;
2015 if (flags & CALL_FLAG_KW)
2016 n++;
2017 pfunc = stack_pointer - n - 1;
2018 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002019 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002020
Guido van Rossumac7be682001-01-17 15:42:30 +00002021 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002022 && PyMethod_GET_SELF(func) != NULL) {
2023 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002024 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002025 func = PyMethod_GET_FUNCTION(func);
2026 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002027 Py_DECREF(*pfunc);
2028 *pfunc = self;
2029 na++;
2030 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002031 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002032 Py_INCREF(func);
2033 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002034 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002035
Jeremy Hylton76901512000-03-28 23:49:17 +00002036 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002037 w = POP();
2038 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002039 }
2040 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002041 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002042 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002043 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002044 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002045
Guido van Rossum681d79a1995-07-18 14:51:37 +00002046 case MAKE_FUNCTION:
2047 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002048 x = PyFunction_New(v, f->f_globals);
2049 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002050 /* XXX Maybe this should be a separate opcode? */
2051 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002053 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002054 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002055 x = NULL;
2056 break;
2057 }
2058 while (--oparg >= 0) {
2059 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002060 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002061 }
2062 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002064 }
2065 PUSH(x);
2066 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002067
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002068 case MAKE_CLOSURE:
2069 {
2070 int nfree;
2071 v = POP(); /* code object */
2072 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002073 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002074 Py_DECREF(v);
2075 /* XXX Maybe this should be a separate opcode? */
2076 if (x != NULL && nfree > 0) {
2077 v = PyTuple_New(nfree);
2078 if (v == NULL) {
2079 Py_DECREF(x);
2080 x = NULL;
2081 break;
2082 }
2083 while (--nfree >= 0) {
2084 w = POP();
2085 PyTuple_SET_ITEM(v, nfree, w);
2086 }
2087 err = PyFunction_SetClosure(x, v);
2088 Py_DECREF(v);
2089 }
2090 if (x != NULL && oparg > 0) {
2091 v = PyTuple_New(oparg);
2092 if (v == NULL) {
2093 Py_DECREF(x);
2094 x = NULL;
2095 break;
2096 }
2097 while (--oparg >= 0) {
2098 w = POP();
2099 PyTuple_SET_ITEM(v, oparg, w);
2100 }
2101 err = PyFunction_SetDefaults(x, v);
2102 Py_DECREF(v);
2103 }
2104 PUSH(x);
2105 break;
2106 }
2107
Guido van Rossum8861b741996-07-30 16:49:37 +00002108 case BUILD_SLICE:
2109 if (oparg == 3)
2110 w = POP();
2111 else
2112 w = NULL;
2113 v = POP();
2114 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002115 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 Py_DECREF(u);
2117 Py_DECREF(v);
2118 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002119 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002120 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002121 break;
2122
Fred Drakeef8ace32000-08-24 00:32:09 +00002123 case EXTENDED_ARG:
2124 opcode = NEXTOP();
2125 oparg = oparg<<16 | NEXTARG();
2126 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002127
Guido van Rossum374a9221991-04-04 10:40:29 +00002128 default:
2129 fprintf(stderr,
2130 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002131 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 why = WHY_EXCEPTION;
2134 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002135
2136#ifdef CASE_TOO_BIG
2137 }
2138#endif
2139
Guido van Rossum374a9221991-04-04 10:40:29 +00002140 } /* switch */
2141
2142 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002143
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002145
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002147 if (err == 0 && x != NULL) {
2148#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002149 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002151 fprintf(stderr,
2152 "XXX undetected error\n");
2153 else
2154#endif
2155 continue; /* Normal, fast path */
2156 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002159 err = 0;
2160 }
2161
Guido van Rossum374a9221991-04-04 10:40:29 +00002162 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002163
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002166 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002167 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 why = WHY_EXCEPTION;
2169 }
2170 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002171#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002173 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002175 fprintf(stderr,
2176 "XXX undetected error (why=%d)\n",
2177 why);
2178 why = WHY_EXCEPTION;
2179 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 }
2181#endif
2182
2183 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002184
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002186 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002188 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002190
Fred Drake8f51f542001-10-04 14:48:42 +00002191 if (tstate->c_tracefunc != NULL)
2192 call_exc_trace(tstate->c_tracefunc,
2193 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002194 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002195
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002197
Guido van Rossum374a9221991-04-04 10:40:29 +00002198 if (why == WHY_RERAISE)
2199 why = WHY_EXCEPTION;
2200
2201 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002202
Tim Peters5ca576e2001-06-18 22:08:13 +00002203 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002204 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002205
2206 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2207 /* For a continue inside a try block,
2208 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002209 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2210 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002211 why = WHY_NOT;
2212 JUMPTO(PyInt_AS_LONG(retval));
2213 Py_DECREF(retval);
2214 break;
2215 }
2216
Guido van Rossum374a9221991-04-04 10:40:29 +00002217 while (STACK_LEVEL() > b->b_level) {
2218 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002220 }
2221 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2222 why = WHY_NOT;
2223 JUMPTO(b->b_handler);
2224 break;
2225 }
2226 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002227 (b->b_type == SETUP_EXCEPT &&
2228 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002229 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002230 PyObject *exc, *val, *tb;
2231 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 val = Py_None;
2234 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002235 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002236 /* Make the raw exception data
2237 available to the handler,
2238 so a program can emulate the
2239 Python main loop. Don't do
2240 this for 'finally'. */
2241 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002242 PyErr_NormalizeException(
2243 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002244 set_exc_info(tstate,
2245 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002247 if (tb == NULL) {
2248 Py_INCREF(Py_None);
2249 PUSH(Py_None);
2250 } else
2251 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002252 PUSH(val);
2253 PUSH(exc);
2254 }
2255 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002256 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002257 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002258 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 PUSH(v);
2261 }
2262 why = WHY_NOT;
2263 JUMPTO(b->b_handler);
2264 break;
2265 }
2266 } /* unwind stack */
2267
2268 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002269
Guido van Rossum374a9221991-04-04 10:40:29 +00002270 if (why != WHY_NOT)
2271 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002272
Guido van Rossum374a9221991-04-04 10:40:29 +00002273 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002274
Guido van Rossum35974fb2001-12-06 21:28:18 +00002275 if (why != WHY_YIELD) {
2276 /* Pop remaining stack entries -- but when yielding */
2277 while (!EMPTY()) {
2278 v = POP();
2279 Py_XDECREF(v);
2280 }
2281 }
2282
Tim Peters5ca576e2001-06-18 22:08:13 +00002283 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002284 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002285
Fred Drake9e3ad782001-07-03 23:39:52 +00002286 if (tstate->use_tracing) {
2287 if (tstate->c_tracefunc
2288 && (why == WHY_RETURN || why == WHY_YIELD)) {
2289 if (call_trace(tstate->c_tracefunc,
2290 tstate->c_traceobj, f,
2291 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002292 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002293 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002294 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002295 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002296 }
Fred Drake8f51f542001-10-04 14:48:42 +00002297 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002298 if (why == WHY_EXCEPTION)
2299 call_trace_protected(tstate->c_profilefunc,
2300 tstate->c_profileobj, f,
2301 PyTrace_RETURN);
2302 else if (call_trace(tstate->c_profilefunc,
2303 tstate->c_profileobj, f,
2304 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002305 Py_XDECREF(retval);
2306 retval = NULL;
2307 why = WHY_EXCEPTION;
2308 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002309 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002310 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002311
Guido van Rossuma027efa1997-05-05 20:56:21 +00002312 reset_exc_info(tstate);
2313
Tim Peters5ca576e2001-06-18 22:08:13 +00002314 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002315 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002316 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002317
Guido van Rossum96a42c81992-01-12 02:29:51 +00002318 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002319}
2320
Tim Peters6d6c1a32001-08-02 04:15:00 +00002321PyObject *
2322PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002323 PyObject **args, int argcount, PyObject **kws, int kwcount,
2324 PyObject **defs, int defcount, PyObject *closure)
2325{
2326 register PyFrameObject *f;
2327 register PyObject *retval = NULL;
2328 register PyObject **fastlocals, **freevars;
2329 PyThreadState *tstate = PyThreadState_GET();
2330 PyObject *x, *u;
2331
2332 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002333 PyErr_SetString(PyExc_SystemError,
2334 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002335 return NULL;
2336 }
2337
2338 f = PyFrame_New(tstate, /*back*/
2339 co, /*code*/
2340 globals, locals);
2341 if (f == NULL)
2342 return NULL;
2343
2344 fastlocals = f->f_localsplus;
2345 freevars = f->f_localsplus + f->f_nlocals;
2346
2347 if (co->co_argcount > 0 ||
2348 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2349 int i;
2350 int n = argcount;
2351 PyObject *kwdict = NULL;
2352 if (co->co_flags & CO_VARKEYWORDS) {
2353 kwdict = PyDict_New();
2354 if (kwdict == NULL)
2355 goto fail;
2356 i = co->co_argcount;
2357 if (co->co_flags & CO_VARARGS)
2358 i++;
2359 SETLOCAL(i, kwdict);
2360 }
2361 if (argcount > co->co_argcount) {
2362 if (!(co->co_flags & CO_VARARGS)) {
2363 PyErr_Format(PyExc_TypeError,
2364 "%.200s() takes %s %d "
2365 "%sargument%s (%d given)",
2366 PyString_AsString(co->co_name),
2367 defcount ? "at most" : "exactly",
2368 co->co_argcount,
2369 kwcount ? "non-keyword " : "",
2370 co->co_argcount == 1 ? "" : "s",
2371 argcount);
2372 goto fail;
2373 }
2374 n = co->co_argcount;
2375 }
2376 for (i = 0; i < n; i++) {
2377 x = args[i];
2378 Py_INCREF(x);
2379 SETLOCAL(i, x);
2380 }
2381 if (co->co_flags & CO_VARARGS) {
2382 u = PyTuple_New(argcount - n);
2383 if (u == NULL)
2384 goto fail;
2385 SETLOCAL(co->co_argcount, u);
2386 for (i = n; i < argcount; i++) {
2387 x = args[i];
2388 Py_INCREF(x);
2389 PyTuple_SET_ITEM(u, i-n, x);
2390 }
2391 }
2392 for (i = 0; i < kwcount; i++) {
2393 PyObject *keyword = kws[2*i];
2394 PyObject *value = kws[2*i + 1];
2395 int j;
2396 if (keyword == NULL || !PyString_Check(keyword)) {
2397 PyErr_Format(PyExc_TypeError,
2398 "%.200s() keywords must be strings",
2399 PyString_AsString(co->co_name));
2400 goto fail;
2401 }
2402 /* XXX slow -- speed up using dictionary? */
2403 for (j = 0; j < co->co_argcount; j++) {
2404 PyObject *nm = PyTuple_GET_ITEM(
2405 co->co_varnames, j);
2406 int cmp = PyObject_RichCompareBool(
2407 keyword, nm, Py_EQ);
2408 if (cmp > 0)
2409 break;
2410 else if (cmp < 0)
2411 goto fail;
2412 }
2413 /* Check errors from Compare */
2414 if (PyErr_Occurred())
2415 goto fail;
2416 if (j >= co->co_argcount) {
2417 if (kwdict == NULL) {
2418 PyErr_Format(PyExc_TypeError,
2419 "%.200s() got an unexpected "
2420 "keyword argument '%.400s'",
2421 PyString_AsString(co->co_name),
2422 PyString_AsString(keyword));
2423 goto fail;
2424 }
2425 PyDict_SetItem(kwdict, keyword, value);
2426 }
2427 else {
2428 if (GETLOCAL(j) != NULL) {
2429 PyErr_Format(PyExc_TypeError,
2430 "%.200s() got multiple "
2431 "values for keyword "
2432 "argument '%.400s'",
2433 PyString_AsString(co->co_name),
2434 PyString_AsString(keyword));
2435 goto fail;
2436 }
2437 Py_INCREF(value);
2438 SETLOCAL(j, value);
2439 }
2440 }
2441 if (argcount < co->co_argcount) {
2442 int m = co->co_argcount - defcount;
2443 for (i = argcount; i < m; i++) {
2444 if (GETLOCAL(i) == NULL) {
2445 PyErr_Format(PyExc_TypeError,
2446 "%.200s() takes %s %d "
2447 "%sargument%s (%d given)",
2448 PyString_AsString(co->co_name),
2449 ((co->co_flags & CO_VARARGS) ||
2450 defcount) ? "at least"
2451 : "exactly",
2452 m, kwcount ? "non-keyword " : "",
2453 m == 1 ? "" : "s", i);
2454 goto fail;
2455 }
2456 }
2457 if (n > m)
2458 i = n - m;
2459 else
2460 i = 0;
2461 for (; i < defcount; i++) {
2462 if (GETLOCAL(m+i) == NULL) {
2463 PyObject *def = defs[i];
2464 Py_INCREF(def);
2465 SETLOCAL(m+i, def);
2466 }
2467 }
2468 }
2469 }
2470 else {
2471 if (argcount > 0 || kwcount > 0) {
2472 PyErr_Format(PyExc_TypeError,
2473 "%.200s() takes no arguments (%d given)",
2474 PyString_AsString(co->co_name),
2475 argcount + kwcount);
2476 goto fail;
2477 }
2478 }
2479 /* Allocate and initialize storage for cell vars, and copy free
2480 vars into frame. This isn't too efficient right now. */
2481 if (f->f_ncells) {
2482 int i = 0, j = 0, nargs, found;
2483 char *cellname, *argname;
2484 PyObject *c;
2485
2486 nargs = co->co_argcount;
2487 if (co->co_flags & CO_VARARGS)
2488 nargs++;
2489 if (co->co_flags & CO_VARKEYWORDS)
2490 nargs++;
2491
2492 /* Check for cells that shadow args */
2493 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2494 cellname = PyString_AS_STRING(
2495 PyTuple_GET_ITEM(co->co_cellvars, i));
2496 found = 0;
2497 while (j < nargs) {
2498 argname = PyString_AS_STRING(
2499 PyTuple_GET_ITEM(co->co_varnames, j));
2500 if (strcmp(cellname, argname) == 0) {
2501 c = PyCell_New(GETLOCAL(j));
2502 if (c == NULL)
2503 goto fail;
2504 GETLOCAL(f->f_nlocals + i) = c;
2505 found = 1;
2506 break;
2507 }
2508 j++;
2509 }
2510 if (found == 0) {
2511 c = PyCell_New(NULL);
2512 if (c == NULL)
2513 goto fail;
2514 SETLOCAL(f->f_nlocals + i, c);
2515 }
2516 }
2517 /* Initialize any that are left */
2518 while (i < f->f_ncells) {
2519 c = PyCell_New(NULL);
2520 if (c == NULL)
2521 goto fail;
2522 SETLOCAL(f->f_nlocals + i, c);
2523 i++;
2524 }
2525 }
2526 if (f->f_nfreevars) {
2527 int i;
2528 for (i = 0; i < f->f_nfreevars; ++i) {
2529 PyObject *o = PyTuple_GET_ITEM(closure, i);
2530 Py_INCREF(o);
2531 freevars[f->f_ncells + i] = o;
2532 }
2533 }
2534
Tim Peters5ca576e2001-06-18 22:08:13 +00002535 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002536 /* Don't need to keep the reference to f_back, it will be set
2537 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002538 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002539 f->f_back = NULL;
2540
2541 /* Create a new generator that owns the ready to run frame
2542 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002543 return gen_new(f);
2544 }
2545
2546 retval = eval_frame(f);
2547
2548 fail: /* Jump here from prelude on failure */
2549
Tim Petersb13680b2001-11-27 23:29:29 +00002550 /* decref'ing the frame can cause __del__ methods to get invoked,
2551 which can call back into Python. While we're done with the
2552 current Python frame (f), the associated C stack is still in use,
2553 so recursion_depth must be boosted for the duration.
2554 */
2555 assert(tstate != NULL);
2556 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002557 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002558 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002559 return retval;
2560}
2561
2562
Guido van Rossuma027efa1997-05-05 20:56:21 +00002563static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002564set_exc_info(PyThreadState *tstate,
2565 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566{
2567 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002568 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002569
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 frame = tstate->frame;
2571 if (frame->f_exc_type == NULL) {
2572 /* This frame didn't catch an exception before */
2573 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002574 if (tstate->exc_type == NULL) {
2575 Py_INCREF(Py_None);
2576 tstate->exc_type = Py_None;
2577 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002578 tmp_type = frame->f_exc_type;
2579 tmp_value = frame->f_exc_value;
2580 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002581 Py_XINCREF(tstate->exc_type);
2582 Py_XINCREF(tstate->exc_value);
2583 Py_XINCREF(tstate->exc_traceback);
2584 frame->f_exc_type = tstate->exc_type;
2585 frame->f_exc_value = tstate->exc_value;
2586 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002587 Py_XDECREF(tmp_type);
2588 Py_XDECREF(tmp_value);
2589 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002590 }
2591 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002592 tmp_type = tstate->exc_type;
2593 tmp_value = tstate->exc_value;
2594 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002595 Py_XINCREF(type);
2596 Py_XINCREF(value);
2597 Py_XINCREF(tb);
2598 tstate->exc_type = type;
2599 tstate->exc_value = value;
2600 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002601 Py_XDECREF(tmp_type);
2602 Py_XDECREF(tmp_value);
2603 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002604 /* For b/w compatibility */
2605 PySys_SetObject("exc_type", type);
2606 PySys_SetObject("exc_value", value);
2607 PySys_SetObject("exc_traceback", tb);
2608}
2609
2610static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002611reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002612{
2613 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002614 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002615 frame = tstate->frame;
2616 if (frame->f_exc_type != NULL) {
2617 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002618 tmp_type = tstate->exc_type;
2619 tmp_value = tstate->exc_value;
2620 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002621 Py_XINCREF(frame->f_exc_type);
2622 Py_XINCREF(frame->f_exc_value);
2623 Py_XINCREF(frame->f_exc_traceback);
2624 tstate->exc_type = frame->f_exc_type;
2625 tstate->exc_value = frame->f_exc_value;
2626 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002627 Py_XDECREF(tmp_type);
2628 Py_XDECREF(tmp_value);
2629 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002630 /* For b/w compatibility */
2631 PySys_SetObject("exc_type", frame->f_exc_type);
2632 PySys_SetObject("exc_value", frame->f_exc_value);
2633 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2634 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002635 tmp_type = frame->f_exc_type;
2636 tmp_value = frame->f_exc_value;
2637 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002638 frame->f_exc_type = NULL;
2639 frame->f_exc_value = NULL;
2640 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002641 Py_XDECREF(tmp_type);
2642 Py_XDECREF(tmp_value);
2643 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002644}
2645
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002646/* Logic for the raise statement (too complicated for inlining).
2647 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002648static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002649do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002650{
Guido van Rossumd295f121998-04-09 21:39:57 +00002651 if (type == NULL) {
2652 /* Reraise */
2653 PyThreadState *tstate = PyThreadState_Get();
2654 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2655 value = tstate->exc_value;
2656 tb = tstate->exc_traceback;
2657 Py_XINCREF(type);
2658 Py_XINCREF(value);
2659 Py_XINCREF(tb);
2660 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002661
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002662 /* We support the following forms of raise:
2663 raise <class>, <classinstance>
2664 raise <class>, <argument tuple>
2665 raise <class>, None
2666 raise <class>, <argument>
2667 raise <classinstance>, None
2668 raise <string>, <object>
2669 raise <string>, None
2670
2671 An omitted second argument is the same as None.
2672
2673 In addition, raise <tuple>, <anything> is the same as
2674 raising the tuple's first item (and it better have one!);
2675 this rule is applied recursively.
2676
2677 Finally, an optional third argument can be supplied, which
2678 gives the traceback to be substituted (useful when
2679 re-raising an exception after examining it). */
2680
2681 /* First, check the traceback argument, replacing None with
2682 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 if (tb == Py_None) {
2684 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002685 tb = NULL;
2686 }
2687 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002688 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002689 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002690 goto raise_error;
2691 }
2692
2693 /* Next, replace a missing value with None */
2694 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 value = Py_None;
2696 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002697 }
2698
2699 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002700 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2701 PyObject *tmp = type;
2702 type = PyTuple_GET_ITEM(type, 0);
2703 Py_INCREF(type);
2704 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002705 }
2706
Tim Petersafb2c802002-04-18 18:06:20 +00002707 if (PyString_CheckExact(type))
2708 /* Raising builtin string is deprecated but still allowed --
2709 * do nothing. Raising an instance of a new-style str
2710 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002711 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002712
2713 else if (PyClass_Check(type))
2714 PyErr_NormalizeException(&type, &value, &tb);
2715
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002717 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 if (value != Py_None) {
2719 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002720 "instance exception may not have a separate value");
2721 goto raise_error;
2722 }
2723 else {
2724 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002725 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002726 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2728 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002729 }
2730 }
2731 else {
2732 /* Not something you can raise. You get an exception
2733 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002734 PyErr_Format(PyExc_TypeError,
2735 "exceptions must be strings, classes, or "
2736 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002737 goto raise_error;
2738 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002740 if (tb == NULL)
2741 return WHY_EXCEPTION;
2742 else
2743 return WHY_RERAISE;
2744 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 Py_XDECREF(value);
2746 Py_XDECREF(type);
2747 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002748 return WHY_EXCEPTION;
2749}
2750
Tim Petersd6d010b2001-06-21 02:49:55 +00002751/* Iterate v argcnt times and store the results on the stack (via decreasing
2752 sp). Return 1 for success, 0 if error. */
2753
Barry Warsawe42b18f1997-08-25 22:13:04 +00002754static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002755unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002756{
Tim Petersd6d010b2001-06-21 02:49:55 +00002757 int i = 0;
2758 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002759 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002760
Tim Petersd6d010b2001-06-21 02:49:55 +00002761 assert(v != NULL);
2762
2763 it = PyObject_GetIter(v);
2764 if (it == NULL)
2765 goto Error;
2766
2767 for (; i < argcnt; i++) {
2768 w = PyIter_Next(it);
2769 if (w == NULL) {
2770 /* Iterator done, via error or exhaustion. */
2771 if (!PyErr_Occurred()) {
2772 PyErr_Format(PyExc_ValueError,
2773 "need more than %d value%s to unpack",
2774 i, i == 1 ? "" : "s");
2775 }
2776 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002777 }
2778 *--sp = w;
2779 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002780
2781 /* We better have exhausted the iterator now. */
2782 w = PyIter_Next(it);
2783 if (w == NULL) {
2784 if (PyErr_Occurred())
2785 goto Error;
2786 Py_DECREF(it);
2787 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002788 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002789 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002790 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002791 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002792Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002793 for (; i > 0; i--, sp++)
2794 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002795 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002796 return 0;
2797}
2798
2799
Guido van Rossum96a42c81992-01-12 02:29:51 +00002800#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002801static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002802prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002804 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002805 if (PyObject_Print(v, stdout, 0) != 0)
2806 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002807 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002808 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002810#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002812static void
Fred Drake5755ce62001-06-27 19:19:46 +00002813call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002814{
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002816 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002817 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002818 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002819 value = Py_None;
2820 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002821 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002825 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002826 }
Fred Drake5755ce62001-06-27 19:19:46 +00002827 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002829 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002830 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002831 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 Py_XDECREF(type);
2833 Py_XDECREF(value);
2834 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002835 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002836}
2837
Fred Drake4ec5d562001-10-04 19:26:43 +00002838static void
2839call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2840 int what)
2841{
2842 PyObject *type, *value, *traceback;
2843 int err;
2844 PyErr_Fetch(&type, &value, &traceback);
2845 err = call_trace(func, obj, frame, what, NULL);
2846 if (err == 0)
2847 PyErr_Restore(type, value, traceback);
2848 else {
2849 Py_XDECREF(type);
2850 Py_XDECREF(value);
2851 Py_XDECREF(traceback);
2852 }
2853}
2854
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002855static int
Fred Drake5755ce62001-06-27 19:19:46 +00002856call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2857 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002858{
Fred Drake5755ce62001-06-27 19:19:46 +00002859 register PyThreadState *tstate = frame->f_tstate;
2860 int result;
2861 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002862 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002863 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002864 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002865 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002866 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2867 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002868 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002869 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002870}
2871
Fred Drake5755ce62001-06-27 19:19:46 +00002872void
2873PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002874{
Fred Drake5755ce62001-06-27 19:19:46 +00002875 PyThreadState *tstate = PyThreadState_Get();
2876 PyObject *temp = tstate->c_profileobj;
2877 Py_XINCREF(arg);
2878 tstate->c_profilefunc = NULL;
2879 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002880 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002881 Py_XDECREF(temp);
2882 tstate->c_profilefunc = func;
2883 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002884 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002885}
2886
2887void
2888PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2889{
2890 PyThreadState *tstate = PyThreadState_Get();
2891 PyObject *temp = tstate->c_traceobj;
2892 Py_XINCREF(arg);
2893 tstate->c_tracefunc = NULL;
2894 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002895 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002896 Py_XDECREF(temp);
2897 tstate->c_tracefunc = func;
2898 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002899 tstate->use_tracing = ((func != NULL)
2900 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002901}
2902
Guido van Rossumb209a111997-04-29 18:18:01 +00002903PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002904PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002905{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002906 PyThreadState *tstate = PyThreadState_Get();
2907 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002908 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002909 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002910 else
2911 return current_frame->f_builtins;
2912}
2913
Guido van Rossumb209a111997-04-29 18:18:01 +00002914PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002915PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002916{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002917 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002918 if (current_frame == NULL)
2919 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002920 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002921 return current_frame->f_locals;
2922}
2923
Guido van Rossumb209a111997-04-29 18:18:01 +00002924PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002926{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002927 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002928 if (current_frame == NULL)
2929 return NULL;
2930 else
2931 return current_frame->f_globals;
2932}
2933
Guido van Rossumb209a111997-04-29 18:18:01 +00002934PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002936{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002937 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002938 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002939}
2940
Guido van Rossum6135a871995-01-09 17:53:26 +00002941int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002942PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002943{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002944 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002945 return current_frame == NULL ? 0 : current_frame->f_restricted;
2946}
2947
Guido van Rossumbe270261997-05-22 22:26:18 +00002948int
Tim Peters5ba58662001-07-16 02:29:45 +00002949PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002950{
2951 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002952 int result = 0;
2953
2954 if (current_frame != NULL) {
2955 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002956 const int compilerflags = codeflags & PyCF_MASK;
2957 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002958 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002959 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002960 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002961#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002962 if (codeflags & CO_GENERATOR_ALLOWED) {
2963 result = 1;
2964 cf->cf_flags |= CO_GENERATOR_ALLOWED;
2965 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002966#endif
Tim Peters5ba58662001-07-16 02:29:45 +00002967 }
2968 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002969}
2970
2971int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002972Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973{
Guido van Rossumb209a111997-04-29 18:18:01 +00002974 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002975 if (f == NULL)
2976 return 0;
2977 if (!PyFile_SoftSpace(f, 0))
2978 return 0;
2979 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980}
2981
Guido van Rossum3f5da241990-12-20 15:06:42 +00002982
Guido van Rossum681d79a1995-07-18 14:51:37 +00002983/* External interface to call any callable object.
2984 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002985
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002986#undef PyEval_CallObject
2987/* for backward compatibility: export this interface */
2988
Guido van Rossumb209a111997-04-29 18:18:01 +00002989PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002990PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002991{
Guido van Rossumb209a111997-04-29 18:18:01 +00002992 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002993}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002994#define PyEval_CallObject(func,arg) \
2995 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002996
Guido van Rossumb209a111997-04-29 18:18:01 +00002997PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002998PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002999{
Jeremy Hylton52820442001-01-03 23:52:36 +00003000 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003001
3002 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003003 arg = PyTuple_New(0);
3004 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003005 PyErr_SetString(PyExc_TypeError,
3006 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003007 return NULL;
3008 }
3009 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003010 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003011
Guido van Rossumb209a111997-04-29 18:18:01 +00003012 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003013 PyErr_SetString(PyExc_TypeError,
3014 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003015 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003016 return NULL;
3017 }
3018
Tim Peters6d6c1a32001-08-02 04:15:00 +00003019 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003021 return result;
3022}
3023
Tim Peters6d6c1a32001-08-02 04:15:00 +00003024char *
3025PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003026{
3027 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003028 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003029 else if (PyFunction_Check(func))
3030 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3031 else if (PyCFunction_Check(func))
3032 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3033 else if (PyClass_Check(func))
3034 return PyString_AsString(((PyClassObject*)func)->cl_name);
3035 else if (PyInstance_Check(func)) {
3036 return PyString_AsString(
3037 ((PyInstanceObject*)func)->in_class->cl_name);
3038 } else {
3039 return func->ob_type->tp_name;
3040 }
3041}
3042
Tim Peters6d6c1a32001-08-02 04:15:00 +00003043char *
3044PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003045{
3046 if (PyMethod_Check(func))
3047 return "()";
3048 else if (PyFunction_Check(func))
3049 return "()";
3050 else if (PyCFunction_Check(func))
3051 return "()";
3052 else if (PyClass_Check(func))
3053 return " constructor";
3054 else if (PyInstance_Check(func)) {
3055 return " instance";
3056 } else {
3057 return " object";
3058 }
3059}
3060
Jeremy Hylton52820442001-01-03 23:52:36 +00003061#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3062
3063/* The two fast_xxx() functions optimize calls for which no argument
3064 tuple is necessary; the objects are passed directly from the stack.
3065 fast_cfunction() is called for METH_OLDARGS functions.
3066 fast_function() is for functions with no special argument handling.
3067*/
3068
3069static PyObject *
3070fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3071{
3072 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3073 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003074 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003075
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003076 switch (flags) {
3077 case METH_OLDARGS:
3078 if (na == 0)
3079 return (*meth)(self, NULL);
3080 else if (na == 1) {
3081 PyObject *arg = EXT_POP(*pp_stack);
3082 PyObject *result = (*meth)(self, arg);
3083 Py_DECREF(arg);
3084 return result;
3085 } else {
3086 PyObject *args = load_args(pp_stack, na);
3087 PyObject *result = (*meth)(self, args);
3088 Py_DECREF(args);
3089 return result;
3090 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003091 case METH_NOARGS:
3092 if (na == 0)
3093 return (*meth)(self, NULL);
3094 PyErr_Format(PyExc_TypeError,
3095 "%.200s() takes no arguments (%d given)",
3096 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3097 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003098 case METH_O:
3099 if (na == 1) {
3100 PyObject *arg = EXT_POP(*pp_stack);
3101 PyObject *result = (*meth)(self, arg);
3102 Py_DECREF(arg);
3103 return result;
3104 }
3105 PyErr_Format(PyExc_TypeError,
3106 "%.200s() takes exactly one argument (%d given)",
3107 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3108 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003109 default:
3110 fprintf(stderr, "%.200s() flags = %d\n",
3111 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3112 PyErr_BadInternalCall();
3113 return NULL;
3114 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003115}
3116
3117static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003118fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003119{
3120 PyObject *co = PyFunction_GET_CODE(func);
3121 PyObject *globals = PyFunction_GET_GLOBALS(func);
3122 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003123 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003124 PyObject **d = NULL;
3125 int nd = 0;
3126
3127 if (argdefs != NULL) {
3128 d = &PyTuple_GET_ITEM(argdefs, 0);
3129 nd = ((PyTupleObject *)argdefs)->ob_size;
3130 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003131 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003132 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003133 (*pp_stack)-2*nk, nk, d, nd,
3134 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003135}
3136
3137static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003138update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3139 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003140{
3141 PyObject *kwdict = NULL;
3142 if (orig_kwdict == NULL)
3143 kwdict = PyDict_New();
3144 else {
3145 kwdict = PyDict_Copy(orig_kwdict);
3146 Py_DECREF(orig_kwdict);
3147 }
3148 if (kwdict == NULL)
3149 return NULL;
3150 while (--nk >= 0) {
3151 int err;
3152 PyObject *value = EXT_POP(*pp_stack);
3153 PyObject *key = EXT_POP(*pp_stack);
3154 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003155 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003156 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003157 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003158 PyEval_GetFuncName(func),
3159 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003160 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003161 Py_DECREF(key);
3162 Py_DECREF(value);
3163 Py_DECREF(kwdict);
3164 return NULL;
3165 }
3166 err = PyDict_SetItem(kwdict, key, value);
3167 Py_DECREF(key);
3168 Py_DECREF(value);
3169 if (err) {
3170 Py_DECREF(kwdict);
3171 return NULL;
3172 }
3173 }
3174 return kwdict;
3175}
3176
3177static PyObject *
3178update_star_args(int nstack, int nstar, PyObject *stararg,
3179 PyObject ***pp_stack)
3180{
3181 PyObject *callargs, *w;
3182
3183 callargs = PyTuple_New(nstack + nstar);
3184 if (callargs == NULL) {
3185 return NULL;
3186 }
3187 if (nstar) {
3188 int i;
3189 for (i = 0; i < nstar; i++) {
3190 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3191 Py_INCREF(a);
3192 PyTuple_SET_ITEM(callargs, nstack + i, a);
3193 }
3194 }
3195 while (--nstack >= 0) {
3196 w = EXT_POP(*pp_stack);
3197 PyTuple_SET_ITEM(callargs, nstack, w);
3198 }
3199 return callargs;
3200}
3201
3202static PyObject *
3203load_args(PyObject ***pp_stack, int na)
3204{
3205 PyObject *args = PyTuple_New(na);
3206 PyObject *w;
3207
3208 if (args == NULL)
3209 return NULL;
3210 while (--na >= 0) {
3211 w = EXT_POP(*pp_stack);
3212 PyTuple_SET_ITEM(args, na, w);
3213 }
3214 return args;
3215}
3216
3217static PyObject *
3218do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3219{
3220 PyObject *callargs = NULL;
3221 PyObject *kwdict = NULL;
3222 PyObject *result = NULL;
3223
3224 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003225 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003226 if (kwdict == NULL)
3227 goto call_fail;
3228 }
3229 callargs = load_args(pp_stack, na);
3230 if (callargs == NULL)
3231 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003232 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003233 call_fail:
3234 Py_XDECREF(callargs);
3235 Py_XDECREF(kwdict);
3236 return result;
3237}
3238
3239static PyObject *
3240ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3241{
3242 int nstar = 0;
3243 PyObject *callargs = NULL;
3244 PyObject *stararg = NULL;
3245 PyObject *kwdict = NULL;
3246 PyObject *result = NULL;
3247
3248 if (flags & CALL_FLAG_KW) {
3249 kwdict = EXT_POP(*pp_stack);
3250 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003251 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003252 "%s%s argument after ** "
3253 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003254 PyEval_GetFuncName(func),
3255 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003256 goto ext_call_fail;
3257 }
3258 }
3259 if (flags & CALL_FLAG_VAR) {
3260 stararg = EXT_POP(*pp_stack);
3261 if (!PyTuple_Check(stararg)) {
3262 PyObject *t = NULL;
3263 t = PySequence_Tuple(stararg);
3264 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003265 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3266 PyErr_Format(PyExc_TypeError,
3267 "%s%s argument after * "
3268 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003269 PyEval_GetFuncName(func),
3270 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003271 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003272 goto ext_call_fail;
3273 }
3274 Py_DECREF(stararg);
3275 stararg = t;
3276 }
3277 nstar = PyTuple_GET_SIZE(stararg);
3278 }
3279 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003280 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003281 if (kwdict == NULL)
3282 goto ext_call_fail;
3283 }
3284 callargs = update_star_args(na, nstar, stararg, pp_stack);
3285 if (callargs == NULL)
3286 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003287 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003288 ext_call_fail:
3289 Py_XDECREF(callargs);
3290 Py_XDECREF(kwdict);
3291 Py_XDECREF(stararg);
3292 return result;
3293}
3294
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003295#define SLICE_ERROR_MSG \
3296 "standard sequence type does not support step size other than one"
3297
Tim Peterscb479e72001-12-16 19:11:44 +00003298/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3299 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3300 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3301*/
Tim Petersb5196382001-12-16 19:44:20 +00003302/* Note: If v is NULL, return success without storing into *pi. This
3303 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3304 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003305*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003306int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003307_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308{
Tim Petersb5196382001-12-16 19:44:20 +00003309 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003310 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003311 if (PyInt_Check(v)) {
3312 x = PyInt_AsLong(v);
3313 } else if (PyLong_Check(v)) {
3314 x = PyLong_AsLong(v);
3315 if (x==-1 && PyErr_Occurred()) {
3316 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003317 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003318
Guido van Rossumac7be682001-01-17 15:42:30 +00003319 if (!PyErr_ExceptionMatches(
3320 PyExc_OverflowError)) {
3321 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003322 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003323 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003324 }
3325
Guido van Rossumac7be682001-01-17 15:42:30 +00003326 /* Clear the OverflowError */
3327 PyErr_Clear();
3328
3329 /* It's an overflow error, so we need to
3330 check the sign of the long integer,
3331 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003332 the error. */
3333
3334 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003335 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003336 if (long_zero == NULL)
3337 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003338
3339 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003340 cmp = PyObject_RichCompareBool(v, long_zero,
3341 Py_GT);
3342 Py_DECREF(long_zero);
3343 if (cmp < 0)
3344 return 0;
3345 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003346 x = INT_MAX;
3347 else
3348 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003349 }
3350 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003351 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003352 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003353 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003355 /* Truncate -- very long indices are truncated anyway */
3356 if (x > INT_MAX)
3357 x = INT_MAX;
3358 else if (x < -INT_MAX)
3359 x = 0;
3360 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003362 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363}
3364
Guido van Rossum50d756e2001-08-18 17:43:36 +00003365#undef ISINT
3366#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3367
Guido van Rossumb209a111997-04-29 18:18:01 +00003368static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003369apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003371 PyTypeObject *tp = u->ob_type;
3372 PySequenceMethods *sq = tp->tp_as_sequence;
3373
3374 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3375 int ilow = 0, ihigh = INT_MAX;
3376 if (!_PyEval_SliceIndex(v, &ilow))
3377 return NULL;
3378 if (!_PyEval_SliceIndex(w, &ihigh))
3379 return NULL;
3380 return PySequence_GetSlice(u, ilow, ihigh);
3381 }
3382 else {
3383 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003384 if (slice != NULL) {
3385 PyObject *res = PyObject_GetItem(u, slice);
3386 Py_DECREF(slice);
3387 return res;
3388 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003389 else
3390 return NULL;
3391 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003393
3394static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003395assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3396 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003398 PyTypeObject *tp = u->ob_type;
3399 PySequenceMethods *sq = tp->tp_as_sequence;
3400
3401 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3402 int ilow = 0, ihigh = INT_MAX;
3403 if (!_PyEval_SliceIndex(v, &ilow))
3404 return -1;
3405 if (!_PyEval_SliceIndex(w, &ihigh))
3406 return -1;
3407 if (x == NULL)
3408 return PySequence_DelSlice(u, ilow, ihigh);
3409 else
3410 return PySequence_SetSlice(u, ilow, ihigh, x);
3411 }
3412 else {
3413 PyObject *slice = PySlice_New(v, w, NULL);
3414 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003415 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003416 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003417 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003418 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003419 res = PyObject_DelItem(u, slice);
3420 Py_DECREF(slice);
3421 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003422 }
3423 else
3424 return -1;
3425 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426}
3427
Guido van Rossumb209a111997-04-29 18:18:01 +00003428static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003429cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003430{
Guido van Rossumac7be682001-01-17 15:42:30 +00003431 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003433 case PyCmp_IS:
3434 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003435 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003436 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003437 res = !res;
3438 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003439 case PyCmp_IN:
3440 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003441 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003442 if (res < 0)
3443 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003444 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003445 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003447 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003448 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 break;
3450 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003451 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003452 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003453 v = res ? Py_True : Py_False;
3454 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 return v;
3456}
3457
Thomas Wouters52152252000-08-17 22:55:00 +00003458static PyObject *
3459import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003460{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003461 PyObject *x;
3462
3463 x = PyObject_GetAttr(v, name);
3464 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003465 PyErr_Format(PyExc_ImportError,
3466 "cannot import name %.230s",
3467 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003468 }
Thomas Wouters52152252000-08-17 22:55:00 +00003469 return x;
3470}
Guido van Rossumac7be682001-01-17 15:42:30 +00003471
Thomas Wouters52152252000-08-17 22:55:00 +00003472static int
3473import_all_from(PyObject *locals, PyObject *v)
3474{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003475 PyObject *all = PyObject_GetAttrString(v, "__all__");
3476 PyObject *dict, *name, *value;
3477 int skip_leading_underscores = 0;
3478 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003479
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003480 if (all == NULL) {
3481 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3482 return -1; /* Unexpected error */
3483 PyErr_Clear();
3484 dict = PyObject_GetAttrString(v, "__dict__");
3485 if (dict == NULL) {
3486 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3487 return -1;
3488 PyErr_SetString(PyExc_ImportError,
3489 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003490 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003491 }
3492 all = PyMapping_Keys(dict);
3493 Py_DECREF(dict);
3494 if (all == NULL)
3495 return -1;
3496 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003497 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003498
3499 for (pos = 0, err = 0; ; pos++) {
3500 name = PySequence_GetItem(all, pos);
3501 if (name == NULL) {
3502 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3503 err = -1;
3504 else
3505 PyErr_Clear();
3506 break;
3507 }
3508 if (skip_leading_underscores &&
3509 PyString_Check(name) &&
3510 PyString_AS_STRING(name)[0] == '_')
3511 {
3512 Py_DECREF(name);
3513 continue;
3514 }
3515 value = PyObject_GetAttr(v, name);
3516 if (value == NULL)
3517 err = -1;
3518 else
3519 err = PyDict_SetItem(locals, name, value);
3520 Py_DECREF(name);
3521 Py_XDECREF(value);
3522 if (err != 0)
3523 break;
3524 }
3525 Py_DECREF(all);
3526 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003527}
3528
Guido van Rossumb209a111997-04-29 18:18:01 +00003529static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003530build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003531{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003532 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003533
3534 if (PyDict_Check(methods))
3535 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003536 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003537 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003538 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3539 base = PyTuple_GET_ITEM(bases, 0);
3540 metaclass = PyObject_GetAttrString(base, "__class__");
3541 if (metaclass == NULL) {
3542 PyErr_Clear();
3543 metaclass = (PyObject *)base->ob_type;
3544 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003545 }
3546 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003547 else {
3548 PyObject *g = PyEval_GetGlobals();
3549 if (g != NULL && PyDict_Check(g))
3550 metaclass = PyDict_GetItemString(g, "__metaclass__");
3551 if (metaclass == NULL)
3552 metaclass = (PyObject *) &PyClass_Type;
3553 Py_INCREF(metaclass);
3554 }
3555 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3556 Py_DECREF(metaclass);
3557 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003558}
3559
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003560static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003561exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3562 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003563{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003564 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003565 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003566 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003567
Guido van Rossumb209a111997-04-29 18:18:01 +00003568 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3569 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003570 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003571 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003572 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003573 locals = PyTuple_GetItem(prog, 2);
3574 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003575 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003576 if (globals == Py_None) {
3577 globals = PyEval_GetGlobals();
3578 if (locals == Py_None) {
3579 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003580 plain = 1;
3581 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003583 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003584 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003585 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003586 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003587 !PyCode_Check(prog) &&
3588 !PyFile_Check(prog)) {
3589 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003590 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003591 return -1;
3592 }
Fred Drake661ea262000-10-24 19:57:45 +00003593 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003594 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003595 "exec: arg 2 must be a dictionary or None");
3596 return -1;
3597 }
3598 if (!PyDict_Check(locals)) {
3599 PyErr_SetString(PyExc_TypeError,
3600 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003601 return -1;
3602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003603 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003604 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003605 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003606 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3607 PyErr_SetString(PyExc_TypeError,
3608 "code object passed to exec may not contain free variables");
3609 return -1;
3610 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003611 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003612 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003613 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003614 FILE *fp = PyFile_AsFile(prog);
3615 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003616 PyCompilerFlags cf;
3617 cf.cf_flags = 0;
3618 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003619 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3620 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003621 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003622 v = PyRun_File(fp, name, Py_file_input, globals,
3623 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003624 }
3625 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003626 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003627 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003628 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003629 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003630 cf.cf_flags = 0;
3631 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003632 v = PyRun_StringFlags(str, Py_file_input, globals,
3633 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003634 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003635 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003636 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003637 if (plain)
3638 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003639 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003640 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003641 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003642 return 0;
3643}
Guido van Rossum24c13741995-02-14 09:42:43 +00003644
Guido van Rossumac7be682001-01-17 15:42:30 +00003645static void
Paul Prescode68140d2000-08-30 20:25:01 +00003646format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3647{
3648 char *obj_str;
3649
3650 if (!obj)
3651 return;
3652
3653 obj_str = PyString_AsString(obj);
3654 if (!obj_str)
3655 return;
3656
3657 PyErr_Format(exc, format_str, obj_str);
3658}
Guido van Rossum950361c1997-01-24 13:49:28 +00003659
3660#ifdef DYNAMIC_EXECUTION_PROFILE
3661
Skip Montanarof118cb12001-10-15 20:51:38 +00003662static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003663getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003664{
3665 int i;
3666 PyObject *l = PyList_New(256);
3667 if (l == NULL) return NULL;
3668 for (i = 0; i < 256; i++) {
3669 PyObject *x = PyInt_FromLong(a[i]);
3670 if (x == NULL) {
3671 Py_DECREF(l);
3672 return NULL;
3673 }
3674 PyList_SetItem(l, i, x);
3675 }
3676 for (i = 0; i < 256; i++)
3677 a[i] = 0;
3678 return l;
3679}
3680
3681PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003682_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003683{
3684#ifndef DXPAIRS
3685 return getarray(dxp);
3686#else
3687 int i;
3688 PyObject *l = PyList_New(257);
3689 if (l == NULL) return NULL;
3690 for (i = 0; i < 257; i++) {
3691 PyObject *x = getarray(dxpairs[i]);
3692 if (x == NULL) {
3693 Py_DECREF(l);
3694 return NULL;
3695 }
3696 PyList_SetItem(l, i, x);
3697 }
3698 return l;
3699#endif
3700}
3701
3702#endif