blob: 54114fc9ccb8f362ca739c714057fcabbf8e7388 [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 Hyltone8c04322002-08-16 17:47:26 +000036static PyObject *call_function(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +000037static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
38static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
39static PyObject *do_call(PyObject *, PyObject ***, int, int);
40static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000041static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000042static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000043static PyObject *load_args(PyObject ***, int);
44#define CALL_FLAG_VAR 1
45#define CALL_FLAG_KW 2
46
Guido van Rossum0a066c01992-03-27 17:29:15 +000047#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000048static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000049#endif
Fred Drake5755ce62001-06-27 19:19:46 +000050static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
51 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000052static void call_trace_protected(Py_tracefunc, PyObject *,
53 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000054static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000055static void maybe_call_line_trace(int, Py_tracefunc, PyObject *,
56 PyFrameObject *, int *, int *);
57
Tim Petersdbd9ba62000-07-09 03:09:57 +000058static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
59static int assign_slice(PyObject *, PyObject *,
60 PyObject *, PyObject *);
61static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000062static PyObject *import_from(PyObject *, PyObject *);
63static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static PyObject *build_class(PyObject *, PyObject *, PyObject *);
65static int exec_statement(PyFrameObject *,
66 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000067static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
68static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000069static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000070
Paul Prescode68140d2000-08-30 20:25:01 +000071#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000072 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000073#define GLOBAL_NAME_ERROR_MSG \
74 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000075#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000076 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000077#define UNBOUNDFREE_ERROR_MSG \
78 "free variable '%.200s' referenced before assignment" \
79 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000080
Guido van Rossum950361c1997-01-24 13:49:28 +000081/* Dynamic execution profile */
82#ifdef DYNAMIC_EXECUTION_PROFILE
83#ifdef DXPAIRS
84static long dxpairs[257][256];
85#define dxp dxpairs[256]
86#else
87static long dxp[256];
88#endif
89#endif
90
Jeremy Hylton938ace62002-07-17 16:30:39 +000091static PyTypeObject gentype;
Tim Peters5ca576e2001-06-18 22:08:13 +000092
93typedef struct {
94 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000095 /* The gi_ prefix is intended to remind of generator-iterator. */
96
97 PyFrameObject *gi_frame;
98
Tim Peterse77f2e22001-06-26 22:24:51 +000099 /* True if generator is being executed. */
100 int gi_running;
Fred Drake72bc4562002-08-09 18:35:52 +0000101
102 /* List of weak reference. */
103 PyObject *gi_weakreflist;
Tim Peters5ca576e2001-06-18 22:08:13 +0000104} genobject;
105
106static PyObject *
107gen_new(PyFrameObject *f)
108{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000109 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000110 if (gen == NULL) {
111 Py_DECREF(f);
112 return NULL;
113 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000114 gen->gi_frame = f;
115 gen->gi_running = 0;
Fred Drake72bc4562002-08-09 18:35:52 +0000116 gen->gi_weakreflist = NULL;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000117 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000118 return (PyObject *)gen;
119}
120
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000121static int
122gen_traverse(genobject *gen, visitproc visit, void *arg)
123{
124 return visit((PyObject *)gen->gi_frame, arg);
125}
126
Tim Peters5ca576e2001-06-18 22:08:13 +0000127static void
128gen_dealloc(genobject *gen)
129{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000130 _PyObject_GC_UNTRACK(gen);
Fred Drake72bc4562002-08-09 18:35:52 +0000131 if (gen->gi_weakreflist != NULL)
132 PyObject_ClearWeakRefs((PyObject *) gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000133 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000134 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000135}
136
137static PyObject *
138gen_iternext(genobject *gen)
139{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000140 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000141 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000142 PyObject *result;
143
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000144 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000145 PyErr_SetString(PyExc_ValueError,
146 "generator already executing");
147 return NULL;
148 }
Tim Peters8c963692001-06-23 05:26:56 +0000149 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000151
152 /* Generators always return to their most recent caller, not
153 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000154 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000155 assert(f->f_back == NULL);
156 f->f_back = tstate->frame;
157
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000158 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000159 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000160 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000161
162 /* Don't keep the reference to f_back any longer than necessary. It
163 * may keep a chain of frames alive or it could create a reference
164 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000165 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000166 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000167
Tim Petersad1a18b2001-06-23 06:19:16 +0000168 /* If the generator just returned (as opposed to yielding), signal
169 * that the generator is exhausted. */
170 if (result == Py_None && f->f_stacktop == NULL) {
171 Py_DECREF(result);
172 result = NULL;
173 }
174
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000175 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000176}
177
178static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000179gen_getiter(PyObject *gen)
180{
181 Py_INCREF(gen);
182 return gen;
183}
184
Guido van Rossum6f799372001-09-20 20:46:19 +0000185static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000186 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
187 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
188 {NULL} /* Sentinel */
189};
Tim Peters5ca576e2001-06-18 22:08:13 +0000190
Tim Peters0c322792002-07-17 16:49:03 +0000191static PyTypeObject gentype = {
Tim Peters5ca576e2001-06-18 22:08:13 +0000192 PyObject_HEAD_INIT(&PyType_Type)
193 0, /* ob_size */
194 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000195 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000196 0, /* tp_itemsize */
197 /* methods */
198 (destructor)gen_dealloc, /* tp_dealloc */
199 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000200 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000201 0, /* tp_setattr */
202 0, /* tp_compare */
203 0, /* tp_repr */
204 0, /* tp_as_number */
205 0, /* tp_as_sequence */
206 0, /* tp_as_mapping */
207 0, /* tp_hash */
208 0, /* tp_call */
209 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000210 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000211 0, /* tp_setattro */
212 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000213 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000214 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000215 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000216 0, /* tp_clear */
217 0, /* tp_richcompare */
Fred Drake72bc4562002-08-09 18:35:52 +0000218 offsetof(genobject, gi_weakreflist), /* tp_weaklistoffset */
Tim Peters5ca576e2001-06-18 22:08:13 +0000219 (getiterfunc)gen_getiter, /* tp_iter */
220 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Petersa64295b2002-07-17 00:15:22 +0000221 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222 gen_memberlist, /* tp_members */
223 0, /* tp_getset */
224 0, /* tp_base */
225 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000226};
227
228
Guido van Rossume59214e1994-08-30 08:01:59 +0000229#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000230
Guido van Rossum2571cc81999-04-07 16:07:23 +0000231#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000232#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000233#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000234#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000235
Guido van Rossuma027efa1997-05-05 20:56:21 +0000236extern int _PyThread_Started; /* Flag for Py_Exit */
237
Guido van Rossum65d5b571998-12-21 19:32:43 +0000238static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000239static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000240
241void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000242PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000245 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000247 interpreter_lock = PyThread_allocate_lock();
248 PyThread_acquire_lock(interpreter_lock, 1);
249 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000250}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000251
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000252void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000254{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000255 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000256}
257
258void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000259PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000260{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000261 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000262}
263
264void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000266{
267 if (tstate == NULL)
268 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000269 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000270 if (PyThreadState_Swap(tstate) != NULL)
271 Py_FatalError(
272 "PyEval_AcquireThread: non-NULL old thread state");
273}
274
275void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000276PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000277{
278 if (tstate == NULL)
279 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
280 if (PyThreadState_Swap(NULL) != tstate)
281 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000282 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000283}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000284
285/* This function is called from PyOS_AfterFork to ensure that newly
286 created child processes don't hold locks referring to threads which
287 are not running in the child process. (This could also be done using
288 pthread_atfork mechanism, at least for the pthreads implementation.) */
289
290void
291PyEval_ReInitThreads(void)
292{
293 if (!interpreter_lock)
294 return;
295 /*XXX Can't use PyThread_free_lock here because it does too
296 much error-checking. Doing this cleanly would require
297 adding a new function to each thread_*.h. Instead, just
298 create a new lock and waste a little bit of memory */
299 interpreter_lock = PyThread_allocate_lock();
300 PyThread_acquire_lock(interpreter_lock, 1);
301 main_thread = PyThread_get_thread_ident();
302}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303#endif
304
Guido van Rossumff4949e1992-08-05 19:58:53 +0000305/* Functions save_thread and restore_thread are always defined so
306 dynamically loaded modules needn't be compiled separately for use
307 with and without threads: */
308
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000309PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000310PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000312 PyThreadState *tstate = PyThreadState_Swap(NULL);
313 if (tstate == NULL)
314 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000315#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000316 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000317 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000318#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000319 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000320}
321
322void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000323PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000324{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000325 if (tstate == NULL)
326 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000327#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000328 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000329 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000330 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332 }
333#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000334 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335}
336
337
Guido van Rossuma9672091994-09-14 13:31:22 +0000338/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
339 signal handlers or Mac I/O completion routines) can schedule calls
340 to a function to be called synchronously.
341 The synchronous function is called with one void* argument.
342 It should return 0 for success or -1 for failure -- failure should
343 be accompanied by an exception.
344
345 If registry succeeds, the registry function returns 0; if it fails
346 (e.g. due to too many pending calls) it returns -1 (without setting
347 an exception condition).
348
349 Note that because registry may occur from within signal handlers,
350 or other asynchronous events, calling malloc() is unsafe!
351
352#ifdef WITH_THREAD
353 Any thread can schedule pending calls, but only the main thread
354 will execute them.
355#endif
356
357 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
358 There are two possible race conditions:
359 (1) nested asynchronous registry calls;
360 (2) registry calls made while pending calls are being processed.
361 While (1) is very unlikely, (2) is a real possibility.
362 The current code is safe against (2), but not against (1).
363 The safety against (2) is derived from the fact that only one
364 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000365
Guido van Rossuma027efa1997-05-05 20:56:21 +0000366 XXX Darn! With the advent of thread state, we should have an array
367 of pending calls per thread in the thread state! Later...
368*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000369
Guido van Rossuma9672091994-09-14 13:31:22 +0000370#define NPENDINGCALLS 32
371static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000372 int (*func)(void *);
373 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000374} pendingcalls[NPENDINGCALLS];
375static volatile int pendingfirst = 0;
376static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000377static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000378
379int
Thomas Wouters334fb892000-07-25 12:56:38 +0000380Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000381{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000382 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000383 int i, j;
384 /* XXX Begin critical section */
385 /* XXX If you want this to be safe against nested
386 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000387 if (busy)
388 return -1;
389 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390 i = pendinglast;
391 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000392 if (j == pendingfirst) {
393 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000394 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000395 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000396 pendingcalls[i].func = func;
397 pendingcalls[i].arg = arg;
398 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000399 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000400 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000401 /* XXX End critical section */
402 return 0;
403}
404
Guido van Rossum180d7b41994-09-29 09:45:57 +0000405int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000406Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000407{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000408 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000409#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000410 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 return 0;
412#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000413 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414 return 0;
415 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000416 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000417 for (;;) {
418 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000419 int (*func)(void *);
420 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000421 i = pendingfirst;
422 if (i == pendinglast)
423 break; /* Queue empty */
424 func = pendingcalls[i].func;
425 arg = pendingcalls[i].arg;
426 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000427 if (func(arg) < 0) {
428 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000429 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000430 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000431 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000432 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000433 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000434 return 0;
435}
436
437
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000438/* The interpreter's recursion limit */
439
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000440static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000441
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000442int
443Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000444{
445 return recursion_limit;
446}
447
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000448void
449Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000450{
451 recursion_limit = new_limit;
452}
453
Guido van Rossum374a9221991-04-04 10:40:29 +0000454/* Status code for main loop (reason for stack unwind) */
455
456enum why_code {
457 WHY_NOT, /* No error */
458 WHY_EXCEPTION, /* Exception occurred */
459 WHY_RERAISE, /* Exception re-raised by 'finally' */
460 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000461 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000462 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000463 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000464};
465
Tim Petersdbd9ba62000-07-09 03:09:57 +0000466static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000467static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000468
Guido van Rossum374a9221991-04-04 10:40:29 +0000469
Guido van Rossumb209a111997-04-29 18:18:01 +0000470PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000471PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000472{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 (PyObject **)NULL, 0,
476 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000477 (PyObject **)NULL, 0,
478 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479}
480
481
482/* Interpreter main loop */
483
Tim Peters6d6c1a32001-08-02 04:15:00 +0000484static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000485eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000486{
Guido van Rossum950361c1997-01-24 13:49:28 +0000487#ifdef DXPAIRS
488 int lastopcode = 0;
489#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000490 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000491 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000492 register int opcode=0; /* Current opcode */
493 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000494 register enum why_code why; /* Reason for block stack unwind */
495 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000496 register PyObject *x; /* Result object -- NULL if error */
497 register PyObject *v; /* Temporary objects popped off stack */
498 register PyObject *w;
499 register PyObject *u;
500 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000501 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000502 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000503 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000504 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000505 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000506
507 /* when tracing we set things up so that
508
509 not (instr_lb <= current_bytecode_offset < instr_ub)
510
511 is true when the line being executed has changed. The
512 initial values are such as to make this false the first
513 time it is tested. */
514 int instr_ub = -1, instr_lb = 0;
515
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000517 PyObject *names;
518 PyObject *consts;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000519#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000520 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000521#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000522#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000524 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000525#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000526
Neal Norwitza81d2202002-07-14 00:27:26 +0000527/* Tuple access macros */
528
529#ifndef Py_DEBUG
530#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
531#else
532#define GETITEM(v, i) PyTuple_GetItem((v), (i))
533#endif
534
Guido van Rossum374a9221991-04-04 10:40:29 +0000535/* Code access macros */
536
Guido van Rossumd076c731998-10-07 19:42:25 +0000537#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000538#define NEXTOP() (*next_instr++)
539#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000540#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000541#define JUMPBY(x) (next_instr += (x))
542
543/* Stack manipulation macros */
544
545#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
546#define EMPTY() (STACK_LEVEL() == 0)
547#define TOP() (stack_pointer[-1])
548#define BASIC_PUSH(v) (*stack_pointer++ = (v))
549#define BASIC_POP() (*--stack_pointer)
550
Guido van Rossum96a42c81992-01-12 02:29:51 +0000551#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000552#define PUSH(v) { (void)(BASIC_PUSH(v), \
553 lltrace && prtrace(TOP(), "push")); \
554 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000555#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000556#else
557#define PUSH(v) BASIC_PUSH(v)
558#define POP() BASIC_POP()
559#endif
560
Guido van Rossum681d79a1995-07-18 14:51:37 +0000561/* Local variable macros */
562
563#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000564
565/* The SETLOCAL() macro must not DECREF the local variable in-place and
566 then store the new value; it must copy the old value to a temporary
567 value, then store the new value, and then DECREF the temporary value.
568 This is because it is possible that during the DECREF the frame is
569 accessed by other code (e.g. a __del__ method or gc.collect()) and the
570 variable would be pointing to already-freed memory. */
571#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
572 GETLOCAL(i) = value; \
573 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000574
Guido van Rossuma027efa1997-05-05 20:56:21 +0000575/* Start of code */
576
Tim Peters5ca576e2001-06-18 22:08:13 +0000577 if (f == NULL)
578 return NULL;
579
Guido van Rossum8861b741996-07-30 16:49:37 +0000580#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000581 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000582 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000583 return NULL;
584 }
585#endif
586
Tim Peters5ca576e2001-06-18 22:08:13 +0000587 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000588 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000589 --tstate->recursion_depth;
590 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000591 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000593 return NULL;
594 }
595
Tim Peters5ca576e2001-06-18 22:08:13 +0000596 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000597 co = f->f_code;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000598 names = co->co_names;
599 consts = co->co_consts;
Tim Peters5ca576e2001-06-18 22:08:13 +0000600 fastlocals = f->f_localsplus;
601 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000602 _PyCode_GETCODEPTR(co, &first_instr);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000603 if (f->f_lasti < 0) {
604 next_instr = first_instr;
605 }
606 else {
607 next_instr = first_instr + f->f_lasti;
608 }
Tim Peters8c963692001-06-23 05:26:56 +0000609 stack_pointer = f->f_stacktop;
610 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000611 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000612
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000613 if (tstate->use_tracing) {
614 if (tstate->c_tracefunc != NULL) {
615 /* tstate->c_tracefunc, if defined, is a
616 function that will be called on *every* entry
617 to a code block. Its return value, if not
618 None, is a function that will be called at
619 the start of each executed line of code.
620 (Actually, the function must return itself
621 in order to continue tracing.) The trace
622 functions are called with three arguments:
623 a pointer to the current frame, a string
624 indicating why the function is called, and
625 an argument which depends on the situation.
626 The global trace function is also called
627 whenever an exception is detected. */
628 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
629 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000630 /* Trace function raised an error */
631 return NULL;
632 }
633 }
634 if (tstate->c_profilefunc != NULL) {
635 /* Similar for c_profilefunc, except it needn't
636 return itself and isn't called for "line" events */
637 if (call_trace(tstate->c_profilefunc,
638 tstate->c_profileobj,
639 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000640 /* Profile function raised an error */
641 return NULL;
642 }
643 }
644 }
645
Tim Peters5ca576e2001-06-18 22:08:13 +0000646#ifdef LLTRACE
647 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
648#endif
649#if defined(Py_DEBUG) || defined(LLTRACE)
650 filename = PyString_AsString(co->co_filename);
651#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000652
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 why = WHY_NOT;
654 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000655 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000656 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000657
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 for (;;) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000659 assert(stack_pointer >= f->f_valuestack); /* else underflow */
660 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
661
Guido van Rossuma027efa1997-05-05 20:56:21 +0000662 /* Do periodic things. Doing this every time through
663 the loop would add too much overhead, so we do it
664 only every Nth instruction. We also do it if
665 ``things_to_do'' is set, i.e. when an asynchronous
666 event needs attention (e.g. a signal handler or
667 async I/O handler); see Py_AddPendingCall() and
668 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000669
Guido van Rossuma027efa1997-05-05 20:56:21 +0000670 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000671 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000672 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000673 if (Py_MakePendingCalls() < 0) {
674 why = WHY_EXCEPTION;
675 goto on_error;
676 }
677 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000678#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000679 /* If we have true signals, the signal handler
680 will call Py_AddPendingCall() so we don't
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000681 have to call PyErr_CheckSignals(). On the
682 Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000683 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 goto on_error;
686 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000687#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000688
Guido van Rossume59214e1994-08-30 08:01:59 +0000689#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000690 if (interpreter_lock) {
691 /* Give another thread a chance */
692
Guido van Rossum25ce5661997-08-02 03:10:38 +0000693 if (PyThreadState_Swap(NULL) != tstate)
694 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000695 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000696
697 /* Other threads may run now */
698
Guido van Rossum65d5b571998-12-21 19:32:43 +0000699 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000700 if (PyThreadState_Swap(tstate) != NULL)
701 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000702 }
703#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705
Neil Schemenauer63543862002-02-17 19:10:14 +0000706 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000708
Guido van Rossum99bec951992-09-03 20:29:45 +0000709 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000710
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 opcode = NEXTOP();
712 if (HAS_ARG(opcode))
713 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000714 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000715#ifdef DYNAMIC_EXECUTION_PROFILE
716#ifdef DXPAIRS
717 dxpairs[lastopcode][opcode]++;
718 lastopcode = opcode;
719#endif
720 dxp[opcode]++;
721#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000722
Guido van Rossum96a42c81992-01-12 02:29:51 +0000723#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000725
Guido van Rossum96a42c81992-01-12 02:29:51 +0000726 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 if (HAS_ARG(opcode)) {
728 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000729 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 }
731 else {
732 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000733 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 }
735 }
736#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000737
738 /* line-by-line tracing support */
739
740 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
741 /* see maybe_call_line_trace
742 for expository comments */
743 maybe_call_line_trace(opcode,
744 tstate->c_tracefunc,
745 tstate->c_traceobj,
746 f, &instr_lb, &instr_ub);
747 }
748
Guido van Rossum374a9221991-04-04 10:40:29 +0000749 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000750
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000752
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 /* BEWARE!
754 It is essential that any operation that fails sets either
755 x to NULL, err to nonzero, or why to anything but WHY_NOT,
756 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000757
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000759
Neil Schemenauer63543862002-02-17 19:10:14 +0000760 case LOAD_FAST:
761 x = GETLOCAL(oparg);
762 if (x != NULL) {
763 Py_INCREF(x);
764 PUSH(x);
765 goto fast_next_opcode;
766 }
767 format_exc_check_arg(PyExc_UnboundLocalError,
768 UNBOUNDLOCAL_ERROR_MSG,
769 PyTuple_GetItem(co->co_varnames, oparg));
770 break;
771
772 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000773 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000774 Py_INCREF(x);
775 PUSH(x);
776 goto fast_next_opcode;
777
778 case STORE_FAST:
779 v = POP();
780 SETLOCAL(oparg, v);
781 goto fast_next_opcode;
782
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 case POP_TOP:
784 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000785 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000786 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000787
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 case ROT_TWO:
789 v = POP();
790 w = POP();
791 PUSH(v);
792 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000793 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000794
Guido van Rossum374a9221991-04-04 10:40:29 +0000795 case ROT_THREE:
796 v = POP();
797 w = POP();
798 x = POP();
799 PUSH(v);
800 PUSH(x);
801 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000802 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000803
Thomas Wouters434d0822000-08-24 20:11:32 +0000804 case ROT_FOUR:
805 u = POP();
806 v = POP();
807 w = POP();
808 x = POP();
809 PUSH(u);
810 PUSH(x);
811 PUSH(w);
812 PUSH(v);
813 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000814
Guido van Rossum374a9221991-04-04 10:40:29 +0000815 case DUP_TOP:
816 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000817 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000819 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000820
Thomas Wouters434d0822000-08-24 20:11:32 +0000821 case DUP_TOPX:
822 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000823 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000824 x = TOP();
825 Py_INCREF(x);
826 PUSH(x);
827 continue;
828 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000829 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000830 Py_INCREF(x);
831 w = TOP();
832 Py_INCREF(w);
833 PUSH(x);
834 PUSH(w);
835 PUSH(x);
836 continue;
837 case 3:
838 x = POP();
839 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000840 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000841 Py_INCREF(w);
842 v = TOP();
843 Py_INCREF(v);
844 PUSH(w);
845 PUSH(x);
846 PUSH(v);
847 PUSH(w);
848 PUSH(x);
849 continue;
850 case 4:
851 x = POP();
852 Py_INCREF(x);
853 w = POP();
854 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000855 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000856 Py_INCREF(v);
857 u = TOP();
858 Py_INCREF(u);
859 PUSH(v);
860 PUSH(w);
861 PUSH(x);
862 PUSH(u);
863 PUSH(v);
864 PUSH(w);
865 PUSH(x);
866 continue;
867 case 5:
868 x = POP();
869 Py_INCREF(x);
870 w = POP();
871 Py_INCREF(w);
872 v = POP();
873 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000874 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000875 Py_INCREF(u);
876 t = TOP();
877 Py_INCREF(t);
878 PUSH(u);
879 PUSH(v);
880 PUSH(w);
881 PUSH(x);
882 PUSH(t);
883 PUSH(u);
884 PUSH(v);
885 PUSH(w);
886 PUSH(x);
887 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000888 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000889 Py_FatalError("invalid argument to DUP_TOPX"
890 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000891 }
Tim Peters35ba6892000-10-11 07:04:49 +0000892 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000893
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 case UNARY_POSITIVE:
895 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000896 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000899 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000901
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 case UNARY_NEGATIVE:
903 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000904 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000905 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000907 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000909
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 case UNARY_NOT:
911 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000912 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000913 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000914 if (err == 0) {
915 Py_INCREF(Py_True);
916 PUSH(Py_True);
917 continue;
918 }
919 else if (err > 0) {
920 Py_INCREF(Py_False);
921 PUSH(Py_False);
922 err = 0;
923 continue;
924 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000926
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 case UNARY_CONVERT:
928 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000929 x = PyObject_Repr(v);
930 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000932 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000934
Guido van Rossum7928cd71991-10-24 14:59:31 +0000935 case UNARY_INVERT:
936 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000937 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000938 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000939 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000940 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000941 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000942
Guido van Rossum50564e81996-01-12 01:13:16 +0000943 case BINARY_POWER:
944 w = POP();
945 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000946 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000947 Py_DECREF(v);
948 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000949 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000950 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000951 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000952
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 case BINARY_MULTIPLY:
954 w = POP();
955 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000956 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000957 Py_DECREF(v);
958 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000960 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000962
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000964 if (!_Py_QnewFlag) {
965 w = POP();
966 v = POP();
967 x = PyNumber_Divide(v, w);
968 Py_DECREF(v);
969 Py_DECREF(w);
970 PUSH(x);
971 if (x != NULL) continue;
972 break;
973 }
974 /* -Qnew is in effect: fall through to
975 BINARY_TRUE_DIVIDE */
976 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 w = POP();
978 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000979 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000980 Py_DECREF(v);
981 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000983 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000984 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000985
Guido van Rossum4668b002001-08-08 05:00:18 +0000986 case BINARY_FLOOR_DIVIDE:
987 w = POP();
988 v = POP();
989 x = PyNumber_FloorDivide(v, w);
990 Py_DECREF(v);
991 Py_DECREF(w);
992 PUSH(x);
993 if (x != NULL) continue;
994 break;
995
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 case BINARY_MODULO:
997 w = POP();
998 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000999 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001000 Py_DECREF(v);
1001 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001002 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001003 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001004 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001005
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 case BINARY_ADD:
1007 w = POP();
1008 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001009 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001010 /* INLINE: int + int */
1011 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001012 a = PyInt_AS_LONG(v);
1013 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001014 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001015 if ((i^a) < 0 && (i^b) < 0)
1016 goto slow_add;
1017 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001018 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001019 else {
1020 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001021 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001022 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001023 Py_DECREF(v);
1024 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001026 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001028
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 case BINARY_SUBTRACT:
1030 w = POP();
1031 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001032 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001033 /* INLINE: int - int */
1034 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001035 a = PyInt_AS_LONG(v);
1036 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001037 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001038 if ((i^a) < 0 && (i^~b) < 0)
1039 goto slow_sub;
1040 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001041 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001042 else {
1043 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001044 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001045 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001046 Py_DECREF(v);
1047 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001049 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001051
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 case BINARY_SUBSCR:
1053 w = POP();
1054 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001055 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001056 /* INLINE: list[int] */
1057 long i = PyInt_AsLong(w);
1058 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001059 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001060 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001061 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001062 PyErr_SetString(PyExc_IndexError,
1063 "list index out of range");
1064 x = NULL;
1065 }
1066 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001067 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001068 Py_INCREF(x);
1069 }
1070 }
1071 else
1072 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001073 Py_DECREF(v);
1074 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001076 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001078
Guido van Rossum7928cd71991-10-24 14:59:31 +00001079 case BINARY_LSHIFT:
1080 w = POP();
1081 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001082 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001083 Py_DECREF(v);
1084 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001085 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001086 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001087 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001088
Guido van Rossum7928cd71991-10-24 14:59:31 +00001089 case BINARY_RSHIFT:
1090 w = POP();
1091 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001092 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001093 Py_DECREF(v);
1094 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001096 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001097 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001098
Guido van Rossum7928cd71991-10-24 14:59:31 +00001099 case BINARY_AND:
1100 w = POP();
1101 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001102 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001103 Py_DECREF(v);
1104 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001105 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001106 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001107 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001108
Guido van Rossum7928cd71991-10-24 14:59:31 +00001109 case BINARY_XOR:
1110 w = POP();
1111 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001112 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001113 Py_DECREF(v);
1114 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001115 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001116 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001117 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001118
Guido van Rossum7928cd71991-10-24 14:59:31 +00001119 case BINARY_OR:
1120 w = POP();
1121 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001122 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001123 Py_DECREF(v);
1124 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001125 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001126 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001127 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001128
1129 case INPLACE_POWER:
1130 w = POP();
1131 v = POP();
1132 x = PyNumber_InPlacePower(v, w, Py_None);
1133 Py_DECREF(v);
1134 Py_DECREF(w);
1135 PUSH(x);
1136 if (x != NULL) continue;
1137 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001138
Thomas Wouters434d0822000-08-24 20:11:32 +00001139 case INPLACE_MULTIPLY:
1140 w = POP();
1141 v = POP();
1142 x = PyNumber_InPlaceMultiply(v, w);
1143 Py_DECREF(v);
1144 Py_DECREF(w);
1145 PUSH(x);
1146 if (x != NULL) continue;
1147 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001148
Thomas Wouters434d0822000-08-24 20:11:32 +00001149 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001150 if (!_Py_QnewFlag) {
1151 w = POP();
1152 v = POP();
1153 x = PyNumber_InPlaceDivide(v, w);
1154 Py_DECREF(v);
1155 Py_DECREF(w);
1156 PUSH(x);
1157 if (x != NULL) continue;
1158 break;
1159 }
1160 /* -Qnew is in effect: fall through to
1161 INPLACE_TRUE_DIVIDE */
1162 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001163 w = POP();
1164 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001165 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001166 Py_DECREF(v);
1167 Py_DECREF(w);
1168 PUSH(x);
1169 if (x != NULL) continue;
1170 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001171
Guido van Rossum4668b002001-08-08 05:00:18 +00001172 case INPLACE_FLOOR_DIVIDE:
1173 w = POP();
1174 v = POP();
1175 x = PyNumber_InPlaceFloorDivide(v, w);
1176 Py_DECREF(v);
1177 Py_DECREF(w);
1178 PUSH(x);
1179 if (x != NULL) continue;
1180 break;
1181
Thomas Wouters434d0822000-08-24 20:11:32 +00001182 case INPLACE_MODULO:
1183 w = POP();
1184 v = POP();
1185 x = PyNumber_InPlaceRemainder(v, w);
1186 Py_DECREF(v);
1187 Py_DECREF(w);
1188 PUSH(x);
1189 if (x != NULL) continue;
1190 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001191
Thomas Wouters434d0822000-08-24 20:11:32 +00001192 case INPLACE_ADD:
1193 w = POP();
1194 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001195 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001196 /* INLINE: int + int */
1197 register long a, b, i;
1198 a = PyInt_AS_LONG(v);
1199 b = PyInt_AS_LONG(w);
1200 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001201 if ((i^a) < 0 && (i^b) < 0)
1202 goto slow_iadd;
1203 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001204 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001205 else {
1206 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001207 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001208 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001209 Py_DECREF(v);
1210 Py_DECREF(w);
1211 PUSH(x);
1212 if (x != NULL) continue;
1213 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001214
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 case INPLACE_SUBTRACT:
1216 w = POP();
1217 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001218 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001219 /* INLINE: int - int */
1220 register long a, b, i;
1221 a = PyInt_AS_LONG(v);
1222 b = PyInt_AS_LONG(w);
1223 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001224 if ((i^a) < 0 && (i^~b) < 0)
1225 goto slow_isub;
1226 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001227 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001228 else {
1229 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001230 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001231 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001232 Py_DECREF(v);
1233 Py_DECREF(w);
1234 PUSH(x);
1235 if (x != NULL) continue;
1236 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001237
Thomas Wouters434d0822000-08-24 20:11:32 +00001238 case INPLACE_LSHIFT:
1239 w = POP();
1240 v = POP();
1241 x = PyNumber_InPlaceLshift(v, w);
1242 Py_DECREF(v);
1243 Py_DECREF(w);
1244 PUSH(x);
1245 if (x != NULL) continue;
1246 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001247
Thomas Wouters434d0822000-08-24 20:11:32 +00001248 case INPLACE_RSHIFT:
1249 w = POP();
1250 v = POP();
1251 x = PyNumber_InPlaceRshift(v, w);
1252 Py_DECREF(v);
1253 Py_DECREF(w);
1254 PUSH(x);
1255 if (x != NULL) continue;
1256 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001257
Thomas Wouters434d0822000-08-24 20:11:32 +00001258 case INPLACE_AND:
1259 w = POP();
1260 v = POP();
1261 x = PyNumber_InPlaceAnd(v, w);
1262 Py_DECREF(v);
1263 Py_DECREF(w);
1264 PUSH(x);
1265 if (x != NULL) continue;
1266 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001267
Thomas Wouters434d0822000-08-24 20:11:32 +00001268 case INPLACE_XOR:
1269 w = POP();
1270 v = POP();
1271 x = PyNumber_InPlaceXor(v, w);
1272 Py_DECREF(v);
1273 Py_DECREF(w);
1274 PUSH(x);
1275 if (x != NULL) continue;
1276 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001277
Thomas Wouters434d0822000-08-24 20:11:32 +00001278 case INPLACE_OR:
1279 w = POP();
1280 v = POP();
1281 x = PyNumber_InPlaceOr(v, w);
1282 Py_DECREF(v);
1283 Py_DECREF(w);
1284 PUSH(x);
1285 if (x != NULL) continue;
1286 break;
1287
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 case SLICE+0:
1289 case SLICE+1:
1290 case SLICE+2:
1291 case SLICE+3:
1292 if ((opcode-SLICE) & 2)
1293 w = POP();
1294 else
1295 w = NULL;
1296 if ((opcode-SLICE) & 1)
1297 v = POP();
1298 else
1299 v = NULL;
1300 u = POP();
1301 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001302 Py_DECREF(u);
1303 Py_XDECREF(v);
1304 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001306 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001308
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 case STORE_SLICE+0:
1310 case STORE_SLICE+1:
1311 case STORE_SLICE+2:
1312 case STORE_SLICE+3:
1313 if ((opcode-STORE_SLICE) & 2)
1314 w = POP();
1315 else
1316 w = NULL;
1317 if ((opcode-STORE_SLICE) & 1)
1318 v = POP();
1319 else
1320 v = NULL;
1321 u = POP();
1322 t = POP();
1323 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001324 Py_DECREF(t);
1325 Py_DECREF(u);
1326 Py_XDECREF(v);
1327 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001328 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001330
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 case DELETE_SLICE+0:
1332 case DELETE_SLICE+1:
1333 case DELETE_SLICE+2:
1334 case DELETE_SLICE+3:
1335 if ((opcode-DELETE_SLICE) & 2)
1336 w = POP();
1337 else
1338 w = NULL;
1339 if ((opcode-DELETE_SLICE) & 1)
1340 v = POP();
1341 else
1342 v = NULL;
1343 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001344 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 Py_DECREF(u);
1347 Py_XDECREF(v);
1348 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001349 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001351
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 case STORE_SUBSCR:
1353 w = POP();
1354 v = POP();
1355 u = POP();
1356 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001357 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 Py_DECREF(u);
1359 Py_DECREF(v);
1360 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001361 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001363
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 case DELETE_SUBSCR:
1365 w = POP();
1366 v = POP();
1367 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001368 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001369 Py_DECREF(v);
1370 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001371 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001373
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 case PRINT_EXPR:
1375 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001376 w = PySys_GetObject("displayhook");
1377 if (w == NULL) {
1378 PyErr_SetString(PyExc_RuntimeError,
1379 "lost sys.displayhook");
1380 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001381 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001382 }
1383 if (err == 0) {
1384 x = Py_BuildValue("(O)", v);
1385 if (x == NULL)
1386 err = -1;
1387 }
1388 if (err == 0) {
1389 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001390 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001391 if (w == NULL)
1392 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001394 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001395 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001397
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001398 case PRINT_ITEM_TO:
1399 w = stream = POP();
1400 /* fall through to PRINT_ITEM */
1401
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 case PRINT_ITEM:
1403 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001404 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001405 w = PySys_GetObject("stdout");
1406 if (w == NULL) {
1407 PyErr_SetString(PyExc_RuntimeError,
1408 "lost sys.stdout");
1409 err = -1;
1410 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001411 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001412 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001413 err = PyFile_WriteString(" ", w);
1414 if (err == 0)
1415 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001416 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001417 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001418 if (PyString_Check(v)) {
1419 char *s = PyString_AS_STRING(v);
1420 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001421 if (len == 0 ||
1422 !isspace(Py_CHARMASK(s[len-1])) ||
1423 s[len-1] == ' ')
1424 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001425 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001426#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001427 else if (PyUnicode_Check(v)) {
1428 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1429 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001430 if (len == 0 ||
1431 !Py_UNICODE_ISSPACE(s[len-1]) ||
1432 s[len-1] == ' ')
1433 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001434 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001435#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001436 else
1437 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001440 Py_XDECREF(stream);
1441 stream = NULL;
1442 if (err == 0)
1443 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001445
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001446 case PRINT_NEWLINE_TO:
1447 w = stream = POP();
1448 /* fall through to PRINT_NEWLINE */
1449
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001451 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001452 w = PySys_GetObject("stdout");
1453 if (w == NULL)
1454 PyErr_SetString(PyExc_RuntimeError,
1455 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001456 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001457 if (w != NULL) {
1458 err = PyFile_WriteString("\n", w);
1459 if (err == 0)
1460 PyFile_SoftSpace(w, 0);
1461 }
1462 Py_XDECREF(stream);
1463 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001465
Thomas Wouters434d0822000-08-24 20:11:32 +00001466
1467#ifdef CASE_TOO_BIG
1468 default: switch (opcode) {
1469#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 case BREAK_LOOP:
1471 why = WHY_BREAK;
1472 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001473
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001474 case CONTINUE_LOOP:
1475 retval = PyInt_FromLong(oparg);
1476 why = WHY_CONTINUE;
1477 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001478
Guido van Rossumf10570b1995-07-07 22:53:21 +00001479 case RAISE_VARARGS:
1480 u = v = w = NULL;
1481 switch (oparg) {
1482 case 3:
1483 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001484 /* Fallthrough */
1485 case 2:
1486 v = POP(); /* value */
1487 /* Fallthrough */
1488 case 1:
1489 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001490 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001491 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001492 break;
1493 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001495 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001496 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001497 break;
1498 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001500
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001502 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001503 PyErr_SetString(PyExc_SystemError,
1504 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001505 break;
1506 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001508 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001510
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 case RETURN_VALUE:
1512 retval = POP();
1513 why = WHY_RETURN;
1514 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001515
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001516 case RETURN_NONE:
1517 retval = Py_None;
1518 Py_INCREF(retval);
1519 why = WHY_RETURN;
1520 break;
1521
Tim Peters5ca576e2001-06-18 22:08:13 +00001522 case YIELD_VALUE:
1523 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001524 f->f_stacktop = stack_pointer;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001525 /* abuse the lasti field: here it points to
1526 the *next* instruction */
Tim Peters5ca576e2001-06-18 22:08:13 +00001527 f->f_lasti = INSTR_OFFSET();
1528 why = WHY_YIELD;
1529 break;
1530
1531
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001532 case EXEC_STMT:
1533 w = POP();
1534 v = POP();
1535 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001536 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 Py_DECREF(u);
1538 Py_DECREF(v);
1539 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001540 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001541
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 case POP_BLOCK:
1543 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 while (STACK_LEVEL() > b->b_level) {
1546 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 }
1549 }
1550 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001551
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 case END_FINALLY:
1553 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 if (PyInt_Check(v)) {
1555 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001556 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001557 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001558 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 retval = POP();
1560 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001561 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001563 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001566 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 else if (v != Py_None) {
1569 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 "'finally' pops bad exception");
1571 why = WHY_EXCEPTION;
1572 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001575
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001577 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001579 w = POP();
1580 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 Py_DECREF(u);
1583 Py_DECREF(v);
1584 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001586
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001588 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001590 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001591 PyErr_Format(PyExc_SystemError,
1592 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001593 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001594 break;
1595 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 err = PyDict_SetItem(x, w, v);
1597 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001599
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001601 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001602 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001603 PyErr_Format(PyExc_SystemError,
1604 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001605 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 break;
1607 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001608 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001609 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001610 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001611 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001612
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001613 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001614 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001615 if (PyTuple_Check(v)) {
1616 if (PyTuple_Size(v) != oparg) {
1617 PyErr_SetString(PyExc_ValueError,
1618 "unpack tuple of wrong size");
1619 why = WHY_EXCEPTION;
1620 }
1621 else {
1622 for (; --oparg >= 0; ) {
1623 w = PyTuple_GET_ITEM(v, oparg);
1624 Py_INCREF(w);
1625 PUSH(w);
1626 }
1627 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001629 else if (PyList_Check(v)) {
1630 if (PyList_Size(v) != oparg) {
1631 PyErr_SetString(PyExc_ValueError,
1632 "unpack list of wrong size");
1633 why = WHY_EXCEPTION;
1634 }
1635 else {
1636 for (; --oparg >= 0; ) {
1637 w = PyList_GET_ITEM(v, oparg);
1638 Py_INCREF(w);
1639 PUSH(w);
1640 }
1641 }
1642 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001643 else if (unpack_iterable(v, oparg,
1644 stack_pointer + oparg))
1645 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001646 else {
1647 if (PyErr_ExceptionMatches(PyExc_TypeError))
1648 PyErr_SetString(PyExc_TypeError,
1649 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001650 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001651 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001652 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001654
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001656 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 v = POP();
1658 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001659 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1660 Py_DECREF(v);
1661 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001663
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001665 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001666 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001667 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1668 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001671
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001672 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001673 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001674 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 err = PyDict_SetItem(f->f_globals, w, v);
1676 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001677 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001678
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001679 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001680 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001682 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001683 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001684 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001685
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001687 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001688 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001689 PyErr_Format(PyExc_SystemError,
1690 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001691 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001692 break;
1693 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001694 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001700 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001701 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001702 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 break;
1704 }
1705 }
1706 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001707 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 PUSH(x);
1709 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001710
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001712 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001715 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001717 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001718 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001719 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 break;
1721 }
1722 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 PUSH(x);
1725 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001726
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001727 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001728 x = GETLOCAL(oparg);
1729 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001730 format_exc_check_arg(
1731 PyExc_UnboundLocalError,
1732 UNBOUNDLOCAL_ERROR_MSG,
1733 PyTuple_GetItem(co->co_varnames, oparg)
1734 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001735 break;
1736 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001737 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001738 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001739
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001740 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001741 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001742 Py_INCREF(x);
1743 PUSH(x);
1744 break;
1745
1746 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001747 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001748 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001749 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001750 err = -1;
1751 /* Don't stomp existing exception */
1752 if (PyErr_Occurred())
1753 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001754 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001755 v = PyTuple_GetItem(co->co_cellvars,
1756 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001757 format_exc_check_arg(
1758 PyExc_UnboundLocalError,
1759 UNBOUNDLOCAL_ERROR_MSG,
1760 v);
1761 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001762 v = PyTuple_GetItem(
1763 co->co_freevars,
1764 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001765 format_exc_check_arg(
1766 PyExc_NameError,
1767 UNBOUNDFREE_ERROR_MSG,
1768 v);
1769 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001770 break;
1771 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001772 PUSH(w);
1773 break;
1774
1775 case STORE_DEREF:
1776 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001777 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001778 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001779 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001780 continue;
1781
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001783 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 if (x != NULL) {
1785 for (; --oparg >= 0;) {
1786 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001787 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 }
1789 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001790 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 }
1792 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001793
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001795 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 if (x != NULL) {
1797 for (; --oparg >= 0;) {
1798 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001799 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 }
1801 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001802 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 }
1804 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001807 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001809 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001811
Guido van Rossum374a9221991-04-04 10:40:29 +00001812 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001813 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001814 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 x = PyObject_GetAttr(v, w);
1816 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001817 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001818 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001820
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 case COMPARE_OP:
1822 w = POP();
1823 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001824 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001825 /* INLINE: cmp(int, int) */
1826 register long a, b;
1827 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001828 a = PyInt_AS_LONG(v);
1829 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001830 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001831 case PyCmp_LT: res = a < b; break;
1832 case PyCmp_LE: res = a <= b; break;
1833 case PyCmp_EQ: res = a == b; break;
1834 case PyCmp_NE: res = a != b; break;
1835 case PyCmp_GT: res = a > b; break;
1836 case PyCmp_GE: res = a >= b; break;
1837 case PyCmp_IS: res = v == w; break;
1838 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001839 default: goto slow_compare;
1840 }
1841 x = res ? Py_True : Py_False;
1842 Py_INCREF(x);
1843 }
1844 else {
1845 slow_compare:
1846 x = cmp_outcome(oparg, v, w);
1847 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001848 Py_DECREF(v);
1849 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001851 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001853
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001855 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001857 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001858 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001859 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001860 break;
1861 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001862 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001864 w,
1865 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001866 f->f_locals == NULL ?
1867 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001868 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001869 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001870 if (w == NULL) {
1871 x = NULL;
1872 break;
1873 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 x = PyEval_CallObject(x, w);
1875 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001876 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001877 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001878 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001879
Thomas Wouters52152252000-08-17 22:55:00 +00001880 case IMPORT_STAR:
1881 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001882 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001883 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001884 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001885 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001886 break;
1887 }
Thomas Wouters52152252000-08-17 22:55:00 +00001888 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001889 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001890 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001891 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001892 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001893
Thomas Wouters52152252000-08-17 22:55:00 +00001894 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001895 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001896 v = TOP();
1897 x = import_from(v, w);
1898 PUSH(x);
1899 if (x != NULL) continue;
1900 break;
1901
Guido van Rossum374a9221991-04-04 10:40:29 +00001902 case JUMP_FORWARD:
1903 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001904 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001905
Guido van Rossum374a9221991-04-04 10:40:29 +00001906 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001907 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001908 if (err > 0)
1909 err = 0;
1910 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001911 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001912 else
1913 break;
1914 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001915
Guido van Rossum374a9221991-04-04 10:40:29 +00001916 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001917 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001918 if (err > 0) {
1919 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001920 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001921 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001922 else if (err == 0)
1923 ;
1924 else
1925 break;
1926 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001927
Guido van Rossum374a9221991-04-04 10:40:29 +00001928 case JUMP_ABSOLUTE:
1929 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001930 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001931
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001932 case GET_ITER:
1933 /* before: [obj]; after [getiter(obj)] */
1934 v = POP();
1935 x = PyObject_GetIter(v);
1936 Py_DECREF(v);
1937 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001938 PUSH(x);
1939 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001940 }
1941 break;
1942
1943 case FOR_ITER:
1944 /* before: [iter]; after: [iter, iter()] *or* [] */
1945 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001946 x = PyIter_Next(v);
1947 if (x != NULL) {
1948 PUSH(x);
1949 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001950 }
Tim Petersf4848da2001-05-05 00:14:56 +00001951 if (!PyErr_Occurred()) {
1952 /* iterator ended normally */
1953 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001954 Py_DECREF(v);
1955 JUMPBY(oparg);
1956 continue;
1957 }
1958 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001959
Guido van Rossum374a9221991-04-04 10:40:29 +00001960 case SETUP_LOOP:
1961 case SETUP_EXCEPT:
1962 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001963 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001964 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001965 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001966
Guido van Rossumf10570b1995-07-07 22:53:21 +00001967 case CALL_FUNCTION:
Jeremy Hyltone8c04322002-08-16 17:47:26 +00001968 x = call_function(&stack_pointer, oparg);
1969 PUSH(x);
1970 if (x != NULL)
1971 continue;
1972 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001973
Jeremy Hylton76901512000-03-28 23:49:17 +00001974 case CALL_FUNCTION_VAR:
1975 case CALL_FUNCTION_KW:
1976 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001977 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001978 int na = oparg & 0xff;
1979 int nk = (oparg>>8) & 0xff;
1980 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001981 int n = na + 2 * nk;
1982 PyObject **pfunc, *func;
1983 if (flags & CALL_FLAG_VAR)
1984 n++;
1985 if (flags & CALL_FLAG_KW)
1986 n++;
1987 pfunc = stack_pointer - n - 1;
1988 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00001989
Guido van Rossumac7be682001-01-17 15:42:30 +00001990 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001991 && PyMethod_GET_SELF(func) != NULL) {
1992 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001993 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001994 func = PyMethod_GET_FUNCTION(func);
1995 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001996 Py_DECREF(*pfunc);
1997 *pfunc = self;
1998 na++;
1999 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002000 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002001 Py_INCREF(func);
2002 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002003 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002004
Jeremy Hylton76901512000-03-28 23:49:17 +00002005 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002006 w = POP();
2007 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002008 }
2009 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002010 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002012 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002013 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002014
Guido van Rossum681d79a1995-07-18 14:51:37 +00002015 case MAKE_FUNCTION:
2016 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 x = PyFunction_New(v, f->f_globals);
2018 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002019 /* XXX Maybe this should be a separate opcode? */
2020 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002022 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002024 x = NULL;
2025 break;
2026 }
2027 while (--oparg >= 0) {
2028 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002029 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002030 }
2031 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002032 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002033 }
2034 PUSH(x);
2035 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002036
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002037 case MAKE_CLOSURE:
2038 {
2039 int nfree;
2040 v = POP(); /* code object */
2041 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002042 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002043 Py_DECREF(v);
2044 /* XXX Maybe this should be a separate opcode? */
2045 if (x != NULL && nfree > 0) {
2046 v = PyTuple_New(nfree);
2047 if (v == NULL) {
2048 Py_DECREF(x);
2049 x = NULL;
2050 break;
2051 }
2052 while (--nfree >= 0) {
2053 w = POP();
2054 PyTuple_SET_ITEM(v, nfree, w);
2055 }
2056 err = PyFunction_SetClosure(x, v);
2057 Py_DECREF(v);
2058 }
2059 if (x != NULL && oparg > 0) {
2060 v = PyTuple_New(oparg);
2061 if (v == NULL) {
2062 Py_DECREF(x);
2063 x = NULL;
2064 break;
2065 }
2066 while (--oparg >= 0) {
2067 w = POP();
2068 PyTuple_SET_ITEM(v, oparg, w);
2069 }
2070 err = PyFunction_SetDefaults(x, v);
2071 Py_DECREF(v);
2072 }
2073 PUSH(x);
2074 break;
2075 }
2076
Guido van Rossum8861b741996-07-30 16:49:37 +00002077 case BUILD_SLICE:
2078 if (oparg == 3)
2079 w = POP();
2080 else
2081 w = NULL;
2082 v = POP();
2083 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002084 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002085 Py_DECREF(u);
2086 Py_DECREF(v);
2087 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002088 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002089 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002090 break;
2091
Fred Drakeef8ace32000-08-24 00:32:09 +00002092 case EXTENDED_ARG:
2093 opcode = NEXTOP();
2094 oparg = oparg<<16 | NEXTARG();
2095 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002096
Guido van Rossum374a9221991-04-04 10:40:29 +00002097 default:
2098 fprintf(stderr,
2099 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002100 PyCode_Addr2Line(f->f_code, f->f_lasti),
2101 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 why = WHY_EXCEPTION;
2104 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002105
2106#ifdef CASE_TOO_BIG
2107 }
2108#endif
2109
Guido van Rossum374a9221991-04-04 10:40:29 +00002110 } /* switch */
2111
2112 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002113
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002115
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002117 if (err == 0 && x != NULL) {
2118#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002119 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002121 fprintf(stderr,
2122 "XXX undetected error\n");
2123 else
2124#endif
2125 continue; /* Normal, fast path */
2126 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 err = 0;
2130 }
2131
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002133
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002136 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002137 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002138 why = WHY_EXCEPTION;
2139 }
2140 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002141#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002143 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002145 fprintf(stderr,
2146 "XXX undetected error (why=%d)\n",
2147 why);
2148 why = WHY_EXCEPTION;
2149 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 }
2151#endif
2152
2153 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002154
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002157
Fred Drake8f51f542001-10-04 14:48:42 +00002158 if (tstate->c_tracefunc != NULL)
2159 call_exc_trace(tstate->c_tracefunc,
2160 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002161 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002162
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002164
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 if (why == WHY_RERAISE)
2166 why = WHY_EXCEPTION;
2167
2168 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002169
Tim Peters5ca576e2001-06-18 22:08:13 +00002170 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002172
2173 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2174 /* For a continue inside a try block,
2175 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002176 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2177 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002178 why = WHY_NOT;
2179 JUMPTO(PyInt_AS_LONG(retval));
2180 Py_DECREF(retval);
2181 break;
2182 }
2183
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 while (STACK_LEVEL() > b->b_level) {
2185 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 }
2188 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2189 why = WHY_NOT;
2190 JUMPTO(b->b_handler);
2191 break;
2192 }
2193 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002194 (b->b_type == SETUP_EXCEPT &&
2195 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 PyObject *exc, *val, *tb;
2198 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 val = Py_None;
2201 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 /* Make the raw exception data
2204 available to the handler,
2205 so a program can emulate the
2206 Python main loop. Don't do
2207 this for 'finally'. */
2208 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002209 PyErr_NormalizeException(
2210 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002211 set_exc_info(tstate,
2212 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002214 if (tb == NULL) {
2215 Py_INCREF(Py_None);
2216 PUSH(Py_None);
2217 } else
2218 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002219 PUSH(val);
2220 PUSH(exc);
2221 }
2222 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002223 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002224 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 PUSH(v);
2228 }
2229 why = WHY_NOT;
2230 JUMPTO(b->b_handler);
2231 break;
2232 }
2233 } /* unwind stack */
2234
2235 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002236
Guido van Rossum374a9221991-04-04 10:40:29 +00002237 if (why != WHY_NOT)
2238 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002239
Guido van Rossum374a9221991-04-04 10:40:29 +00002240 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002241
Guido van Rossum35974fb2001-12-06 21:28:18 +00002242 if (why != WHY_YIELD) {
2243 /* Pop remaining stack entries -- but when yielding */
2244 while (!EMPTY()) {
2245 v = POP();
2246 Py_XDECREF(v);
2247 }
2248 }
2249
Tim Peters5ca576e2001-06-18 22:08:13 +00002250 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002251 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002252
Fred Drake9e3ad782001-07-03 23:39:52 +00002253 if (tstate->use_tracing) {
2254 if (tstate->c_tracefunc
2255 && (why == WHY_RETURN || why == WHY_YIELD)) {
2256 if (call_trace(tstate->c_tracefunc,
2257 tstate->c_traceobj, f,
2258 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002260 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002261 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002262 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002263 }
Fred Drake8f51f542001-10-04 14:48:42 +00002264 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002265 if (why == WHY_EXCEPTION)
2266 call_trace_protected(tstate->c_profilefunc,
2267 tstate->c_profileobj, f,
2268 PyTrace_RETURN);
2269 else if (call_trace(tstate->c_profilefunc,
2270 tstate->c_profileobj, f,
2271 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002272 Py_XDECREF(retval);
2273 retval = NULL;
2274 why = WHY_EXCEPTION;
2275 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002276 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002277 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002278
Guido van Rossuma027efa1997-05-05 20:56:21 +00002279 reset_exc_info(tstate);
2280
Tim Peters5ca576e2001-06-18 22:08:13 +00002281 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002282 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002283 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002284
Guido van Rossum96a42c81992-01-12 02:29:51 +00002285 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002286}
2287
Tim Peters6d6c1a32001-08-02 04:15:00 +00002288PyObject *
2289PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002290 PyObject **args, int argcount, PyObject **kws, int kwcount,
2291 PyObject **defs, int defcount, PyObject *closure)
2292{
2293 register PyFrameObject *f;
2294 register PyObject *retval = NULL;
2295 register PyObject **fastlocals, **freevars;
2296 PyThreadState *tstate = PyThreadState_GET();
2297 PyObject *x, *u;
2298
2299 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002300 PyErr_SetString(PyExc_SystemError,
2301 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002302 return NULL;
2303 }
2304
2305 f = PyFrame_New(tstate, /*back*/
2306 co, /*code*/
2307 globals, locals);
2308 if (f == NULL)
2309 return NULL;
2310
2311 fastlocals = f->f_localsplus;
2312 freevars = f->f_localsplus + f->f_nlocals;
2313
2314 if (co->co_argcount > 0 ||
2315 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2316 int i;
2317 int n = argcount;
2318 PyObject *kwdict = NULL;
2319 if (co->co_flags & CO_VARKEYWORDS) {
2320 kwdict = PyDict_New();
2321 if (kwdict == NULL)
2322 goto fail;
2323 i = co->co_argcount;
2324 if (co->co_flags & CO_VARARGS)
2325 i++;
2326 SETLOCAL(i, kwdict);
2327 }
2328 if (argcount > co->co_argcount) {
2329 if (!(co->co_flags & CO_VARARGS)) {
2330 PyErr_Format(PyExc_TypeError,
2331 "%.200s() takes %s %d "
2332 "%sargument%s (%d given)",
2333 PyString_AsString(co->co_name),
2334 defcount ? "at most" : "exactly",
2335 co->co_argcount,
2336 kwcount ? "non-keyword " : "",
2337 co->co_argcount == 1 ? "" : "s",
2338 argcount);
2339 goto fail;
2340 }
2341 n = co->co_argcount;
2342 }
2343 for (i = 0; i < n; i++) {
2344 x = args[i];
2345 Py_INCREF(x);
2346 SETLOCAL(i, x);
2347 }
2348 if (co->co_flags & CO_VARARGS) {
2349 u = PyTuple_New(argcount - n);
2350 if (u == NULL)
2351 goto fail;
2352 SETLOCAL(co->co_argcount, u);
2353 for (i = n; i < argcount; i++) {
2354 x = args[i];
2355 Py_INCREF(x);
2356 PyTuple_SET_ITEM(u, i-n, x);
2357 }
2358 }
2359 for (i = 0; i < kwcount; i++) {
2360 PyObject *keyword = kws[2*i];
2361 PyObject *value = kws[2*i + 1];
2362 int j;
2363 if (keyword == NULL || !PyString_Check(keyword)) {
2364 PyErr_Format(PyExc_TypeError,
2365 "%.200s() keywords must be strings",
2366 PyString_AsString(co->co_name));
2367 goto fail;
2368 }
2369 /* XXX slow -- speed up using dictionary? */
2370 for (j = 0; j < co->co_argcount; j++) {
2371 PyObject *nm = PyTuple_GET_ITEM(
2372 co->co_varnames, j);
2373 int cmp = PyObject_RichCompareBool(
2374 keyword, nm, Py_EQ);
2375 if (cmp > 0)
2376 break;
2377 else if (cmp < 0)
2378 goto fail;
2379 }
2380 /* Check errors from Compare */
2381 if (PyErr_Occurred())
2382 goto fail;
2383 if (j >= co->co_argcount) {
2384 if (kwdict == NULL) {
2385 PyErr_Format(PyExc_TypeError,
2386 "%.200s() got an unexpected "
2387 "keyword argument '%.400s'",
2388 PyString_AsString(co->co_name),
2389 PyString_AsString(keyword));
2390 goto fail;
2391 }
2392 PyDict_SetItem(kwdict, keyword, value);
2393 }
2394 else {
2395 if (GETLOCAL(j) != NULL) {
2396 PyErr_Format(PyExc_TypeError,
2397 "%.200s() got multiple "
2398 "values for keyword "
2399 "argument '%.400s'",
2400 PyString_AsString(co->co_name),
2401 PyString_AsString(keyword));
2402 goto fail;
2403 }
2404 Py_INCREF(value);
2405 SETLOCAL(j, value);
2406 }
2407 }
2408 if (argcount < co->co_argcount) {
2409 int m = co->co_argcount - defcount;
2410 for (i = argcount; i < m; i++) {
2411 if (GETLOCAL(i) == NULL) {
2412 PyErr_Format(PyExc_TypeError,
2413 "%.200s() takes %s %d "
2414 "%sargument%s (%d given)",
2415 PyString_AsString(co->co_name),
2416 ((co->co_flags & CO_VARARGS) ||
2417 defcount) ? "at least"
2418 : "exactly",
2419 m, kwcount ? "non-keyword " : "",
2420 m == 1 ? "" : "s", i);
2421 goto fail;
2422 }
2423 }
2424 if (n > m)
2425 i = n - m;
2426 else
2427 i = 0;
2428 for (; i < defcount; i++) {
2429 if (GETLOCAL(m+i) == NULL) {
2430 PyObject *def = defs[i];
2431 Py_INCREF(def);
2432 SETLOCAL(m+i, def);
2433 }
2434 }
2435 }
2436 }
2437 else {
2438 if (argcount > 0 || kwcount > 0) {
2439 PyErr_Format(PyExc_TypeError,
2440 "%.200s() takes no arguments (%d given)",
2441 PyString_AsString(co->co_name),
2442 argcount + kwcount);
2443 goto fail;
2444 }
2445 }
2446 /* Allocate and initialize storage for cell vars, and copy free
2447 vars into frame. This isn't too efficient right now. */
2448 if (f->f_ncells) {
2449 int i = 0, j = 0, nargs, found;
2450 char *cellname, *argname;
2451 PyObject *c;
2452
2453 nargs = co->co_argcount;
2454 if (co->co_flags & CO_VARARGS)
2455 nargs++;
2456 if (co->co_flags & CO_VARKEYWORDS)
2457 nargs++;
2458
2459 /* Check for cells that shadow args */
2460 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2461 cellname = PyString_AS_STRING(
2462 PyTuple_GET_ITEM(co->co_cellvars, i));
2463 found = 0;
2464 while (j < nargs) {
2465 argname = PyString_AS_STRING(
2466 PyTuple_GET_ITEM(co->co_varnames, j));
2467 if (strcmp(cellname, argname) == 0) {
2468 c = PyCell_New(GETLOCAL(j));
2469 if (c == NULL)
2470 goto fail;
2471 GETLOCAL(f->f_nlocals + i) = c;
2472 found = 1;
2473 break;
2474 }
2475 j++;
2476 }
2477 if (found == 0) {
2478 c = PyCell_New(NULL);
2479 if (c == NULL)
2480 goto fail;
2481 SETLOCAL(f->f_nlocals + i, c);
2482 }
2483 }
2484 /* Initialize any that are left */
2485 while (i < f->f_ncells) {
2486 c = PyCell_New(NULL);
2487 if (c == NULL)
2488 goto fail;
2489 SETLOCAL(f->f_nlocals + i, c);
2490 i++;
2491 }
2492 }
2493 if (f->f_nfreevars) {
2494 int i;
2495 for (i = 0; i < f->f_nfreevars; ++i) {
2496 PyObject *o = PyTuple_GET_ITEM(closure, i);
2497 Py_INCREF(o);
2498 freevars[f->f_ncells + i] = o;
2499 }
2500 }
2501
Tim Peters5ca576e2001-06-18 22:08:13 +00002502 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002503 /* Don't need to keep the reference to f_back, it will be set
2504 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002505 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002506 f->f_back = NULL;
2507
2508 /* Create a new generator that owns the ready to run frame
2509 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002510 return gen_new(f);
2511 }
2512
2513 retval = eval_frame(f);
2514
2515 fail: /* Jump here from prelude on failure */
2516
Tim Petersb13680b2001-11-27 23:29:29 +00002517 /* decref'ing the frame can cause __del__ methods to get invoked,
2518 which can call back into Python. While we're done with the
2519 current Python frame (f), the associated C stack is still in use,
2520 so recursion_depth must be boosted for the duration.
2521 */
2522 assert(tstate != NULL);
2523 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002524 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002525 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002526 return retval;
2527}
2528
2529
Guido van Rossuma027efa1997-05-05 20:56:21 +00002530static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002531set_exc_info(PyThreadState *tstate,
2532 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002533{
2534 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002535 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002536
Guido van Rossuma027efa1997-05-05 20:56:21 +00002537 frame = tstate->frame;
2538 if (frame->f_exc_type == NULL) {
2539 /* This frame didn't catch an exception before */
2540 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002541 if (tstate->exc_type == NULL) {
2542 Py_INCREF(Py_None);
2543 tstate->exc_type = Py_None;
2544 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002545 tmp_type = frame->f_exc_type;
2546 tmp_value = frame->f_exc_value;
2547 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002548 Py_XINCREF(tstate->exc_type);
2549 Py_XINCREF(tstate->exc_value);
2550 Py_XINCREF(tstate->exc_traceback);
2551 frame->f_exc_type = tstate->exc_type;
2552 frame->f_exc_value = tstate->exc_value;
2553 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002554 Py_XDECREF(tmp_type);
2555 Py_XDECREF(tmp_value);
2556 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557 }
2558 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002559 tmp_type = tstate->exc_type;
2560 tmp_value = tstate->exc_value;
2561 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562 Py_XINCREF(type);
2563 Py_XINCREF(value);
2564 Py_XINCREF(tb);
2565 tstate->exc_type = type;
2566 tstate->exc_value = value;
2567 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002568 Py_XDECREF(tmp_type);
2569 Py_XDECREF(tmp_value);
2570 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002571 /* For b/w compatibility */
2572 PySys_SetObject("exc_type", type);
2573 PySys_SetObject("exc_value", value);
2574 PySys_SetObject("exc_traceback", tb);
2575}
2576
2577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002578reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002579{
2580 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002581 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002582 frame = tstate->frame;
2583 if (frame->f_exc_type != NULL) {
2584 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002585 tmp_type = tstate->exc_type;
2586 tmp_value = tstate->exc_value;
2587 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002588 Py_XINCREF(frame->f_exc_type);
2589 Py_XINCREF(frame->f_exc_value);
2590 Py_XINCREF(frame->f_exc_traceback);
2591 tstate->exc_type = frame->f_exc_type;
2592 tstate->exc_value = frame->f_exc_value;
2593 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002594 Py_XDECREF(tmp_type);
2595 Py_XDECREF(tmp_value);
2596 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597 /* For b/w compatibility */
2598 PySys_SetObject("exc_type", frame->f_exc_type);
2599 PySys_SetObject("exc_value", frame->f_exc_value);
2600 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2601 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002602 tmp_type = frame->f_exc_type;
2603 tmp_value = frame->f_exc_value;
2604 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605 frame->f_exc_type = NULL;
2606 frame->f_exc_value = NULL;
2607 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002608 Py_XDECREF(tmp_type);
2609 Py_XDECREF(tmp_value);
2610 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611}
2612
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002613/* Logic for the raise statement (too complicated for inlining).
2614 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002615static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002616do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002617{
Guido van Rossumd295f121998-04-09 21:39:57 +00002618 if (type == NULL) {
2619 /* Reraise */
2620 PyThreadState *tstate = PyThreadState_Get();
2621 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2622 value = tstate->exc_value;
2623 tb = tstate->exc_traceback;
2624 Py_XINCREF(type);
2625 Py_XINCREF(value);
2626 Py_XINCREF(tb);
2627 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002628
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002629 /* We support the following forms of raise:
2630 raise <class>, <classinstance>
2631 raise <class>, <argument tuple>
2632 raise <class>, None
2633 raise <class>, <argument>
2634 raise <classinstance>, None
2635 raise <string>, <object>
2636 raise <string>, None
2637
2638 An omitted second argument is the same as None.
2639
2640 In addition, raise <tuple>, <anything> is the same as
2641 raising the tuple's first item (and it better have one!);
2642 this rule is applied recursively.
2643
2644 Finally, an optional third argument can be supplied, which
2645 gives the traceback to be substituted (useful when
2646 re-raising an exception after examining it). */
2647
2648 /* First, check the traceback argument, replacing None with
2649 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002650 if (tb == Py_None) {
2651 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002652 tb = NULL;
2653 }
2654 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002655 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002656 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002657 goto raise_error;
2658 }
2659
2660 /* Next, replace a missing value with None */
2661 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 value = Py_None;
2663 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002664 }
2665
2666 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2668 PyObject *tmp = type;
2669 type = PyTuple_GET_ITEM(type, 0);
2670 Py_INCREF(type);
2671 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002672 }
2673
Tim Petersafb2c802002-04-18 18:06:20 +00002674 if (PyString_CheckExact(type))
2675 /* Raising builtin string is deprecated but still allowed --
2676 * do nothing. Raising an instance of a new-style str
2677 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002678 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002679
2680 else if (PyClass_Check(type))
2681 PyErr_NormalizeException(&type, &value, &tb);
2682
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002684 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 if (value != Py_None) {
2686 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002687 "instance exception may not have a separate value");
2688 goto raise_error;
2689 }
2690 else {
2691 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2695 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002696 }
2697 }
2698 else {
2699 /* Not something you can raise. You get an exception
2700 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002701 PyErr_Format(PyExc_TypeError,
2702 "exceptions must be strings, classes, or "
2703 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002704 goto raise_error;
2705 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002706 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002707 if (tb == NULL)
2708 return WHY_EXCEPTION;
2709 else
2710 return WHY_RERAISE;
2711 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 Py_XDECREF(value);
2713 Py_XDECREF(type);
2714 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002715 return WHY_EXCEPTION;
2716}
2717
Tim Petersd6d010b2001-06-21 02:49:55 +00002718/* Iterate v argcnt times and store the results on the stack (via decreasing
2719 sp). Return 1 for success, 0 if error. */
2720
Barry Warsawe42b18f1997-08-25 22:13:04 +00002721static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002722unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002723{
Tim Petersd6d010b2001-06-21 02:49:55 +00002724 int i = 0;
2725 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002726 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002727
Tim Petersd6d010b2001-06-21 02:49:55 +00002728 assert(v != NULL);
2729
2730 it = PyObject_GetIter(v);
2731 if (it == NULL)
2732 goto Error;
2733
2734 for (; i < argcnt; i++) {
2735 w = PyIter_Next(it);
2736 if (w == NULL) {
2737 /* Iterator done, via error or exhaustion. */
2738 if (!PyErr_Occurred()) {
2739 PyErr_Format(PyExc_ValueError,
2740 "need more than %d value%s to unpack",
2741 i, i == 1 ? "" : "s");
2742 }
2743 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002744 }
2745 *--sp = w;
2746 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002747
2748 /* We better have exhausted the iterator now. */
2749 w = PyIter_Next(it);
2750 if (w == NULL) {
2751 if (PyErr_Occurred())
2752 goto Error;
2753 Py_DECREF(it);
2754 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002755 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002756 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002757 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002758 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002759Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002760 for (; i > 0; i--, sp++)
2761 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002762 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002763 return 0;
2764}
2765
2766
Guido van Rossum96a42c81992-01-12 02:29:51 +00002767#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002768static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002769prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002771 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002772 if (PyObject_Print(v, stdout, 0) != 0)
2773 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002774 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002775 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002777#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002779static void
Fred Drake5755ce62001-06-27 19:19:46 +00002780call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002781{
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002783 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002784 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002785 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002786 value = Py_None;
2787 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002788 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002790 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002792 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002793 }
Fred Drake5755ce62001-06-27 19:19:46 +00002794 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002795 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002796 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002798 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 Py_XDECREF(type);
2800 Py_XDECREF(value);
2801 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002802 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002803}
2804
Fred Drake4ec5d562001-10-04 19:26:43 +00002805static void
2806call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2807 int what)
2808{
2809 PyObject *type, *value, *traceback;
2810 int err;
2811 PyErr_Fetch(&type, &value, &traceback);
2812 err = call_trace(func, obj, frame, what, NULL);
2813 if (err == 0)
2814 PyErr_Restore(type, value, traceback);
2815 else {
2816 Py_XDECREF(type);
2817 Py_XDECREF(value);
2818 Py_XDECREF(traceback);
2819 }
2820}
2821
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822static int
Fred Drake5755ce62001-06-27 19:19:46 +00002823call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2824 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002825{
Fred Drake5755ce62001-06-27 19:19:46 +00002826 register PyThreadState *tstate = frame->f_tstate;
2827 int result;
2828 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002829 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002830 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002831 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002832 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002833 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2834 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002835 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002836 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002837}
2838
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002839static void
2840maybe_call_line_trace(int opcode, Py_tracefunc func, PyObject *obj,
2841 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2842{
2843 /* The theory of SET_LINENO-less tracing.
2844
2845 In a nutshell, we use the co_lnotab field of the code object
2846 to tell when execution has moved onto a different line.
2847
2848 As mentioned above, the basic idea is so set things up so
2849 that
2850
2851 *instr_lb <= frame->f_lasti < *instr_ub
2852
2853 is true so long as execution does not change lines.
2854
2855 This is all fairly simple. Digging the information out of
2856 co_lnotab takes some work, but is conceptually clear.
2857
2858 Somewhat harder to explain is why we don't call the line
2859 trace function when executing a POP_TOP or RETURN_NONE
2860 opcodes. An example probably serves best.
2861
2862 Consider this code:
2863
2864 1: def f(a):
2865 2: if a:
2866 3: print 1
2867 4: else:
2868 5: print 2
2869
2870 which compiles to this:
2871
2872 2 0 LOAD_FAST 0 (a)
2873 3 JUMP_IF_FALSE 9 (to 15)
2874 6 POP_TOP
2875
2876 3 7 LOAD_CONST 1 (1)
2877 10 PRINT_ITEM
2878 11 PRINT_NEWLINE
2879 12 JUMP_FORWARD 6 (to 21)
2880 >> 15 POP_TOP
2881
2882 5 16 LOAD_CONST 2 (2)
2883 19 PRINT_ITEM
2884 20 PRINT_NEWLINE
2885 >> 21 RETURN_NONE
2886
2887 If a is false, execution will jump to instruction at offset
2888 15 and the co_lnotab will claim that execution has moved to
2889 line 3. This is at best misleading. In this case we could
2890 associate the POP_TOP with line 4, but that doesn't make
2891 sense in all cases (I think).
2892
2893 On the other hand, if a is true, execution will jump from
2894 instruction offset 12 to offset 21. Then the co_lnotab would
2895 imply that execution has moved to line 5, which is again
2896 misleading.
2897
2898 This is why it is important that RETURN_NONE is *only* used
2899 for the "falling off the end of the function" form of
2900 returning None -- using it for code like
2901
2902 1: def f():
2903 2: return
2904
2905 would, once again, lead to misleading tracing behaviour.
2906
2907 It is also worth mentioning that getting tracing behaviour
2908 right is the *entire* motivation for adding the RETURN_NONE
2909 opcode.
2910 */
2911
2912 if (opcode != POP_TOP && opcode != RETURN_NONE &&
2913 (frame->f_lasti < *instr_lb || frame->f_lasti > *instr_ub)) {
2914 PyCodeObject* co = frame->f_code;
2915 int size, addr;
2916 unsigned char* p;
2917
2918 call_trace(func, obj, frame, PyTrace_LINE, Py_None);
2919
2920 size = PyString_Size(co->co_lnotab) / 2;
2921 p = (unsigned char*)PyString_AsString(co->co_lnotab);
2922
2923 /* possible optimization: if f->f_lasti == instr_ub
2924 (likely to be a common case) then we already know
2925 instr_lb -- if we stored the matching value of p
2926 somwhere we could skip the first while loop. */
2927
2928 addr = 0;
2929
2930 /* see comments in compile.c for the description of
2931 co_lnotab. A point to remember: increments to p
2932 should come in pairs -- although we don't care about
2933 the line increments here, treating them as byte
2934 increments gets confusing, to say the least. */
2935
2936 while (size >= 0) {
2937 if (addr + *p > frame->f_lasti)
2938 break;
2939 addr += *p++;
2940 p++;
2941 --size;
2942 }
2943 *instr_lb = addr;
2944 if (size > 0) {
2945 while (--size >= 0) {
2946 addr += *p++;
2947 if (*p++)
2948 break;
2949 }
2950 *instr_ub = addr;
2951 }
2952 else {
2953 *instr_ub = INT_MAX;
2954 }
2955 }
2956}
2957
Fred Drake5755ce62001-06-27 19:19:46 +00002958void
2959PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002960{
Fred Drake5755ce62001-06-27 19:19:46 +00002961 PyThreadState *tstate = PyThreadState_Get();
2962 PyObject *temp = tstate->c_profileobj;
2963 Py_XINCREF(arg);
2964 tstate->c_profilefunc = NULL;
2965 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002966 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002967 Py_XDECREF(temp);
2968 tstate->c_profilefunc = func;
2969 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002970 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002971}
2972
2973void
2974PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2975{
2976 PyThreadState *tstate = PyThreadState_Get();
2977 PyObject *temp = tstate->c_traceobj;
2978 Py_XINCREF(arg);
2979 tstate->c_tracefunc = NULL;
2980 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002981 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002982 Py_XDECREF(temp);
2983 tstate->c_tracefunc = func;
2984 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002985 tstate->use_tracing = ((func != NULL)
2986 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002987}
2988
Guido van Rossumb209a111997-04-29 18:18:01 +00002989PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002990PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002991{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002992 PyThreadState *tstate = PyThreadState_Get();
2993 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002994 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002995 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002996 else
2997 return current_frame->f_builtins;
2998}
2999
Guido van Rossumb209a111997-04-29 18:18:01 +00003000PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003001PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003002{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003003 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00003004 if (current_frame == NULL)
3005 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003006 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003007 return current_frame->f_locals;
3008}
3009
Guido van Rossumb209a111997-04-29 18:18:01 +00003010PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003011PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003012{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003013 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003014 if (current_frame == NULL)
3015 return NULL;
3016 else
3017 return current_frame->f_globals;
3018}
3019
Guido van Rossumb209a111997-04-29 18:18:01 +00003020PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003021PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003022{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003023 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00003024 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00003025}
3026
Guido van Rossum6135a871995-01-09 17:53:26 +00003027int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003028PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003029{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003030 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003031 return current_frame == NULL ? 0 : current_frame->f_restricted;
3032}
3033
Guido van Rossumbe270261997-05-22 22:26:18 +00003034int
Tim Peters5ba58662001-07-16 02:29:45 +00003035PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003036{
3037 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00003038 int result = 0;
3039
3040 if (current_frame != NULL) {
3041 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003042 const int compilerflags = codeflags & PyCF_MASK;
3043 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003044 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003045 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003046 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003047#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003048 if (codeflags & CO_GENERATOR_ALLOWED) {
3049 result = 1;
3050 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3051 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003052#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003053 }
3054 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003055}
3056
3057int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059{
Guido van Rossumb209a111997-04-29 18:18:01 +00003060 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003061 if (f == NULL)
3062 return 0;
3063 if (!PyFile_SoftSpace(f, 0))
3064 return 0;
3065 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066}
3067
Guido van Rossum3f5da241990-12-20 15:06:42 +00003068
Guido van Rossum681d79a1995-07-18 14:51:37 +00003069/* External interface to call any callable object.
3070 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003071
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003072#undef PyEval_CallObject
3073/* for backward compatibility: export this interface */
3074
Guido van Rossumb209a111997-04-29 18:18:01 +00003075PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003076PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003077{
Guido van Rossumb209a111997-04-29 18:18:01 +00003078 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003079}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003080#define PyEval_CallObject(func,arg) \
3081 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003082
Guido van Rossumb209a111997-04-29 18:18:01 +00003083PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003084PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003085{
Jeremy Hylton52820442001-01-03 23:52:36 +00003086 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003087
3088 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003089 arg = PyTuple_New(0);
3090 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003091 PyErr_SetString(PyExc_TypeError,
3092 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003093 return NULL;
3094 }
3095 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003096 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003097
Guido van Rossumb209a111997-04-29 18:18:01 +00003098 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003099 PyErr_SetString(PyExc_TypeError,
3100 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003101 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003102 return NULL;
3103 }
3104
Tim Peters6d6c1a32001-08-02 04:15:00 +00003105 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003106 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003107 return result;
3108}
3109
Tim Peters6d6c1a32001-08-02 04:15:00 +00003110char *
3111PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003112{
3113 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003114 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003115 else if (PyFunction_Check(func))
3116 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3117 else if (PyCFunction_Check(func))
3118 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3119 else if (PyClass_Check(func))
3120 return PyString_AsString(((PyClassObject*)func)->cl_name);
3121 else if (PyInstance_Check(func)) {
3122 return PyString_AsString(
3123 ((PyInstanceObject*)func)->in_class->cl_name);
3124 } else {
3125 return func->ob_type->tp_name;
3126 }
3127}
3128
Tim Peters6d6c1a32001-08-02 04:15:00 +00003129char *
3130PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003131{
3132 if (PyMethod_Check(func))
3133 return "()";
3134 else if (PyFunction_Check(func))
3135 return "()";
3136 else if (PyCFunction_Check(func))
3137 return "()";
3138 else if (PyClass_Check(func))
3139 return " constructor";
3140 else if (PyInstance_Check(func)) {
3141 return " instance";
3142 } else {
3143 return " object";
3144 }
3145}
3146
Jeremy Hylton52820442001-01-03 23:52:36 +00003147#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3148
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003149static PyObject *
3150call_function(PyObject ***pp_stack, int oparg)
3151{
3152 int na = oparg & 0xff;
3153 int nk = (oparg>>8) & 0xff;
3154 int n = na + 2 * nk;
3155 PyObject **pfunc = (*pp_stack) - n - 1;
3156 PyObject *func = *pfunc;
3157 PyObject *x, *w;
3158
3159 /* Always dispatch PyCFunction first, because
3160 these are presumed to be the most frequent
3161 callable object.
3162 */
3163 if (PyCFunction_Check(func) && nk == 0) {
3164 int flags = PyCFunction_GET_FLAGS(func);
3165 if (flags & (METH_VARARGS | METH_KEYWORDS)) {
3166 PyObject *callargs;
3167 callargs = load_args(pp_stack, na);
3168 x = PyCFunction_Call(func, callargs, NULL);
3169 Py_XDECREF(callargs);
3170 } else
3171 x = fast_cfunction(func, pp_stack, na);
3172 } else {
3173 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3174 /* optimize access to bound methods */
3175 PyObject *self = PyMethod_GET_SELF(func);
3176 Py_INCREF(self);
3177 func = PyMethod_GET_FUNCTION(func);
3178 Py_INCREF(func);
3179 Py_DECREF(*pfunc);
3180 *pfunc = self;
3181 na++;
3182 n++;
3183 } else
3184 Py_INCREF(func);
3185 if (PyFunction_Check(func))
3186 x = fast_function(func, pp_stack, n, na, nk);
3187 else
3188 x = do_call(func, pp_stack, na, nk);
3189 Py_DECREF(func);
3190 }
3191
3192 while ((*pp_stack) > pfunc) {
3193 w = EXT_POP(*pp_stack);
3194 Py_DECREF(w);
3195 }
3196 return x;
3197}
3198
Jeremy Hylton52820442001-01-03 23:52:36 +00003199/* The two fast_xxx() functions optimize calls for which no argument
3200 tuple is necessary; the objects are passed directly from the stack.
3201 fast_cfunction() is called for METH_OLDARGS functions.
3202 fast_function() is for functions with no special argument handling.
3203*/
3204
3205static PyObject *
3206fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3207{
3208 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3209 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003210 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003211
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003212 switch (flags) {
3213 case METH_OLDARGS:
3214 if (na == 0)
3215 return (*meth)(self, NULL);
3216 else if (na == 1) {
3217 PyObject *arg = EXT_POP(*pp_stack);
3218 PyObject *result = (*meth)(self, arg);
3219 Py_DECREF(arg);
3220 return result;
3221 } else {
3222 PyObject *args = load_args(pp_stack, na);
3223 PyObject *result = (*meth)(self, args);
3224 Py_DECREF(args);
3225 return result;
3226 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003227 case METH_NOARGS:
3228 if (na == 0)
3229 return (*meth)(self, NULL);
3230 PyErr_Format(PyExc_TypeError,
3231 "%.200s() takes no arguments (%d given)",
3232 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3233 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003234 case METH_O:
3235 if (na == 1) {
3236 PyObject *arg = EXT_POP(*pp_stack);
3237 PyObject *result = (*meth)(self, arg);
3238 Py_DECREF(arg);
3239 return result;
3240 }
3241 PyErr_Format(PyExc_TypeError,
3242 "%.200s() takes exactly one argument (%d given)",
3243 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3244 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003245 default:
3246 fprintf(stderr, "%.200s() flags = %d\n",
3247 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3248 PyErr_BadInternalCall();
3249 return NULL;
3250 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003251}
3252
3253static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003254fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003255{
3256 PyObject *co = PyFunction_GET_CODE(func);
3257 PyObject *globals = PyFunction_GET_GLOBALS(func);
3258 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003259 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003260 PyObject **d = NULL;
3261 int nd = 0;
3262
3263 if (argdefs != NULL) {
3264 d = &PyTuple_GET_ITEM(argdefs, 0);
3265 nd = ((PyTupleObject *)argdefs)->ob_size;
3266 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003267 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003268 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003269 (*pp_stack)-2*nk, nk, d, nd,
3270 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003271}
3272
3273static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003274update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3275 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003276{
3277 PyObject *kwdict = NULL;
3278 if (orig_kwdict == NULL)
3279 kwdict = PyDict_New();
3280 else {
3281 kwdict = PyDict_Copy(orig_kwdict);
3282 Py_DECREF(orig_kwdict);
3283 }
3284 if (kwdict == NULL)
3285 return NULL;
3286 while (--nk >= 0) {
3287 int err;
3288 PyObject *value = EXT_POP(*pp_stack);
3289 PyObject *key = EXT_POP(*pp_stack);
3290 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003291 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003292 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003293 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003294 PyEval_GetFuncName(func),
3295 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003296 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003297 Py_DECREF(key);
3298 Py_DECREF(value);
3299 Py_DECREF(kwdict);
3300 return NULL;
3301 }
3302 err = PyDict_SetItem(kwdict, key, value);
3303 Py_DECREF(key);
3304 Py_DECREF(value);
3305 if (err) {
3306 Py_DECREF(kwdict);
3307 return NULL;
3308 }
3309 }
3310 return kwdict;
3311}
3312
3313static PyObject *
3314update_star_args(int nstack, int nstar, PyObject *stararg,
3315 PyObject ***pp_stack)
3316{
3317 PyObject *callargs, *w;
3318
3319 callargs = PyTuple_New(nstack + nstar);
3320 if (callargs == NULL) {
3321 return NULL;
3322 }
3323 if (nstar) {
3324 int i;
3325 for (i = 0; i < nstar; i++) {
3326 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3327 Py_INCREF(a);
3328 PyTuple_SET_ITEM(callargs, nstack + i, a);
3329 }
3330 }
3331 while (--nstack >= 0) {
3332 w = EXT_POP(*pp_stack);
3333 PyTuple_SET_ITEM(callargs, nstack, w);
3334 }
3335 return callargs;
3336}
3337
3338static PyObject *
3339load_args(PyObject ***pp_stack, int na)
3340{
3341 PyObject *args = PyTuple_New(na);
3342 PyObject *w;
3343
3344 if (args == NULL)
3345 return NULL;
3346 while (--na >= 0) {
3347 w = EXT_POP(*pp_stack);
3348 PyTuple_SET_ITEM(args, na, w);
3349 }
3350 return args;
3351}
3352
3353static PyObject *
3354do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3355{
3356 PyObject *callargs = NULL;
3357 PyObject *kwdict = NULL;
3358 PyObject *result = NULL;
3359
3360 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003361 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003362 if (kwdict == NULL)
3363 goto call_fail;
3364 }
3365 callargs = load_args(pp_stack, na);
3366 if (callargs == NULL)
3367 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003368 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003369 call_fail:
3370 Py_XDECREF(callargs);
3371 Py_XDECREF(kwdict);
3372 return result;
3373}
3374
3375static PyObject *
3376ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3377{
3378 int nstar = 0;
3379 PyObject *callargs = NULL;
3380 PyObject *stararg = NULL;
3381 PyObject *kwdict = NULL;
3382 PyObject *result = NULL;
3383
3384 if (flags & CALL_FLAG_KW) {
3385 kwdict = EXT_POP(*pp_stack);
3386 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003387 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003388 "%s%s argument after ** "
3389 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003390 PyEval_GetFuncName(func),
3391 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003392 goto ext_call_fail;
3393 }
3394 }
3395 if (flags & CALL_FLAG_VAR) {
3396 stararg = EXT_POP(*pp_stack);
3397 if (!PyTuple_Check(stararg)) {
3398 PyObject *t = NULL;
3399 t = PySequence_Tuple(stararg);
3400 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003401 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3402 PyErr_Format(PyExc_TypeError,
3403 "%s%s argument after * "
3404 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003405 PyEval_GetFuncName(func),
3406 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003407 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003408 goto ext_call_fail;
3409 }
3410 Py_DECREF(stararg);
3411 stararg = t;
3412 }
3413 nstar = PyTuple_GET_SIZE(stararg);
3414 }
3415 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003416 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003417 if (kwdict == NULL)
3418 goto ext_call_fail;
3419 }
3420 callargs = update_star_args(na, nstar, stararg, pp_stack);
3421 if (callargs == NULL)
3422 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003423 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003424 ext_call_fail:
3425 Py_XDECREF(callargs);
3426 Py_XDECREF(kwdict);
3427 Py_XDECREF(stararg);
3428 return result;
3429}
3430
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003431#define SLICE_ERROR_MSG \
3432 "standard sequence type does not support step size other than one"
3433
Tim Peterscb479e72001-12-16 19:11:44 +00003434/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3435 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3436 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3437*/
Tim Petersb5196382001-12-16 19:44:20 +00003438/* Note: If v is NULL, return success without storing into *pi. This
3439 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3440 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003441*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003442int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003443_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444{
Tim Petersb5196382001-12-16 19:44:20 +00003445 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003446 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003447 if (PyInt_Check(v)) {
3448 x = PyInt_AsLong(v);
3449 } else if (PyLong_Check(v)) {
3450 x = PyLong_AsLong(v);
3451 if (x==-1 && PyErr_Occurred()) {
3452 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003453 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003454
Guido van Rossumac7be682001-01-17 15:42:30 +00003455 if (!PyErr_ExceptionMatches(
3456 PyExc_OverflowError)) {
3457 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003458 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003459 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003460 }
3461
Guido van Rossumac7be682001-01-17 15:42:30 +00003462 /* Clear the OverflowError */
3463 PyErr_Clear();
3464
3465 /* It's an overflow error, so we need to
3466 check the sign of the long integer,
3467 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003468 the error. */
3469
3470 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003471 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003472 if (long_zero == NULL)
3473 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003474
3475 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003476 cmp = PyObject_RichCompareBool(v, long_zero,
3477 Py_GT);
3478 Py_DECREF(long_zero);
3479 if (cmp < 0)
3480 return 0;
3481 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003482 x = INT_MAX;
3483 else
3484 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003485 }
3486 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003487 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003488 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003489 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003491 /* Truncate -- very long indices are truncated anyway */
3492 if (x > INT_MAX)
3493 x = INT_MAX;
3494 else if (x < -INT_MAX)
3495 x = 0;
3496 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003498 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499}
3500
Guido van Rossum50d756e2001-08-18 17:43:36 +00003501#undef ISINT
3502#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3503
Guido van Rossumb209a111997-04-29 18:18:01 +00003504static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003505apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003507 PyTypeObject *tp = u->ob_type;
3508 PySequenceMethods *sq = tp->tp_as_sequence;
3509
3510 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3511 int ilow = 0, ihigh = INT_MAX;
3512 if (!_PyEval_SliceIndex(v, &ilow))
3513 return NULL;
3514 if (!_PyEval_SliceIndex(w, &ihigh))
3515 return NULL;
3516 return PySequence_GetSlice(u, ilow, ihigh);
3517 }
3518 else {
3519 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003520 if (slice != NULL) {
3521 PyObject *res = PyObject_GetItem(u, slice);
3522 Py_DECREF(slice);
3523 return res;
3524 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003525 else
3526 return NULL;
3527 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003528}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003529
3530static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003531assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3532 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003534 PyTypeObject *tp = u->ob_type;
3535 PySequenceMethods *sq = tp->tp_as_sequence;
3536
3537 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3538 int ilow = 0, ihigh = INT_MAX;
3539 if (!_PyEval_SliceIndex(v, &ilow))
3540 return -1;
3541 if (!_PyEval_SliceIndex(w, &ihigh))
3542 return -1;
3543 if (x == NULL)
3544 return PySequence_DelSlice(u, ilow, ihigh);
3545 else
3546 return PySequence_SetSlice(u, ilow, ihigh, x);
3547 }
3548 else {
3549 PyObject *slice = PySlice_New(v, w, NULL);
3550 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003551 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003552 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003553 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003554 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003555 res = PyObject_DelItem(u, slice);
3556 Py_DECREF(slice);
3557 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003558 }
3559 else
3560 return -1;
3561 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003562}
3563
Guido van Rossumb209a111997-04-29 18:18:01 +00003564static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003565cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566{
Guido van Rossumac7be682001-01-17 15:42:30 +00003567 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003569 case PyCmp_IS:
3570 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003571 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003572 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003573 res = !res;
3574 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003575 case PyCmp_IN:
3576 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003577 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003578 if (res < 0)
3579 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003580 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003581 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003582 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003583 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003584 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585 break;
3586 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003587 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003588 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003589 v = res ? Py_True : Py_False;
3590 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 return v;
3592}
3593
Thomas Wouters52152252000-08-17 22:55:00 +00003594static PyObject *
3595import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003596{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003597 PyObject *x;
3598
3599 x = PyObject_GetAttr(v, name);
3600 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003601 PyErr_Format(PyExc_ImportError,
3602 "cannot import name %.230s",
3603 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003604 }
Thomas Wouters52152252000-08-17 22:55:00 +00003605 return x;
3606}
Guido van Rossumac7be682001-01-17 15:42:30 +00003607
Thomas Wouters52152252000-08-17 22:55:00 +00003608static int
3609import_all_from(PyObject *locals, PyObject *v)
3610{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003611 PyObject *all = PyObject_GetAttrString(v, "__all__");
3612 PyObject *dict, *name, *value;
3613 int skip_leading_underscores = 0;
3614 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003615
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003616 if (all == NULL) {
3617 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3618 return -1; /* Unexpected error */
3619 PyErr_Clear();
3620 dict = PyObject_GetAttrString(v, "__dict__");
3621 if (dict == NULL) {
3622 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3623 return -1;
3624 PyErr_SetString(PyExc_ImportError,
3625 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003626 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003627 }
3628 all = PyMapping_Keys(dict);
3629 Py_DECREF(dict);
3630 if (all == NULL)
3631 return -1;
3632 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003633 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003634
3635 for (pos = 0, err = 0; ; pos++) {
3636 name = PySequence_GetItem(all, pos);
3637 if (name == NULL) {
3638 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3639 err = -1;
3640 else
3641 PyErr_Clear();
3642 break;
3643 }
3644 if (skip_leading_underscores &&
3645 PyString_Check(name) &&
3646 PyString_AS_STRING(name)[0] == '_')
3647 {
3648 Py_DECREF(name);
3649 continue;
3650 }
3651 value = PyObject_GetAttr(v, name);
3652 if (value == NULL)
3653 err = -1;
3654 else
3655 err = PyDict_SetItem(locals, name, value);
3656 Py_DECREF(name);
3657 Py_XDECREF(value);
3658 if (err != 0)
3659 break;
3660 }
3661 Py_DECREF(all);
3662 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003663}
3664
Guido van Rossumb209a111997-04-29 18:18:01 +00003665static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003666build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003667{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003668 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003669
3670 if (PyDict_Check(methods))
3671 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003672 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003673 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003674 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3675 base = PyTuple_GET_ITEM(bases, 0);
3676 metaclass = PyObject_GetAttrString(base, "__class__");
3677 if (metaclass == NULL) {
3678 PyErr_Clear();
3679 metaclass = (PyObject *)base->ob_type;
3680 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003681 }
3682 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003683 else {
3684 PyObject *g = PyEval_GetGlobals();
3685 if (g != NULL && PyDict_Check(g))
3686 metaclass = PyDict_GetItemString(g, "__metaclass__");
3687 if (metaclass == NULL)
3688 metaclass = (PyObject *) &PyClass_Type;
3689 Py_INCREF(metaclass);
3690 }
3691 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3692 Py_DECREF(metaclass);
3693 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003694}
3695
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003696static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003697exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3698 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003699{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003700 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003701 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003702 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003703
Guido van Rossumb209a111997-04-29 18:18:01 +00003704 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3705 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003706 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003707 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003708 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003709 locals = PyTuple_GetItem(prog, 2);
3710 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003711 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003712 if (globals == Py_None) {
3713 globals = PyEval_GetGlobals();
3714 if (locals == Py_None) {
3715 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003716 plain = 1;
3717 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003718 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003719 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003720 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003721 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003722 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003723 !PyCode_Check(prog) &&
3724 !PyFile_Check(prog)) {
3725 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003726 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003727 return -1;
3728 }
Fred Drake661ea262000-10-24 19:57:45 +00003729 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003730 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003731 "exec: arg 2 must be a dictionary or None");
3732 return -1;
3733 }
3734 if (!PyDict_Check(locals)) {
3735 PyErr_SetString(PyExc_TypeError,
3736 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003737 return -1;
3738 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003739 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003740 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003741 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003742 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3743 PyErr_SetString(PyExc_TypeError,
3744 "code object passed to exec may not contain free variables");
3745 return -1;
3746 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003747 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003748 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003749 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003750 FILE *fp = PyFile_AsFile(prog);
3751 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003752 PyCompilerFlags cf;
3753 cf.cf_flags = 0;
3754 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003755 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3756 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003757 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003758 v = PyRun_File(fp, name, Py_file_input, globals,
3759 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003760 }
3761 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003762 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003763 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003764 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003765 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003766 cf.cf_flags = 0;
3767 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003768 v = PyRun_StringFlags(str, Py_file_input, globals,
3769 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003770 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003771 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003772 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003773 if (plain)
3774 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003775 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003776 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003777 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003778 return 0;
3779}
Guido van Rossum24c13741995-02-14 09:42:43 +00003780
Guido van Rossumac7be682001-01-17 15:42:30 +00003781static void
Paul Prescode68140d2000-08-30 20:25:01 +00003782format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3783{
3784 char *obj_str;
3785
3786 if (!obj)
3787 return;
3788
3789 obj_str = PyString_AsString(obj);
3790 if (!obj_str)
3791 return;
3792
3793 PyErr_Format(exc, format_str, obj_str);
3794}
Guido van Rossum950361c1997-01-24 13:49:28 +00003795
3796#ifdef DYNAMIC_EXECUTION_PROFILE
3797
Skip Montanarof118cb12001-10-15 20:51:38 +00003798static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003799getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003800{
3801 int i;
3802 PyObject *l = PyList_New(256);
3803 if (l == NULL) return NULL;
3804 for (i = 0; i < 256; i++) {
3805 PyObject *x = PyInt_FromLong(a[i]);
3806 if (x == NULL) {
3807 Py_DECREF(l);
3808 return NULL;
3809 }
3810 PyList_SetItem(l, i, x);
3811 }
3812 for (i = 0; i < 256; i++)
3813 a[i] = 0;
3814 return l;
3815}
3816
3817PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003818_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003819{
3820#ifndef DXPAIRS
3821 return getarray(dxp);
3822#else
3823 int i;
3824 PyObject *l = PyList_New(257);
3825 if (l == NULL) return NULL;
3826 for (i = 0; i < 257; i++) {
3827 PyObject *x = getarray(dxpairs[i]);
3828 if (x == NULL) {
3829 Py_DECREF(l);
3830 return NULL;
3831 }
3832 PyList_SetItem(l, i, x);
3833 }
3834 return l;
3835#endif
3836}
3837
3838#endif