blob: b19121ce6d7d68389c74c5d84ade8c316e404ad7 [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);
Jeremy Hylton52820442001-01-03 23:52:36 +000038static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Michael W. Hudson006c7522002-11-08 13:08:46 +000054static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Michael W. Hudsondd32a912002-08-15 14:59:02 +000055 PyFrameObject *, int *, int *);
56
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
58static int assign_slice(PyObject *, PyObject *,
59 PyObject *, PyObject *);
60static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000061static PyObject *import_from(PyObject *, PyObject *);
62static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static PyObject *build_class(PyObject *, PyObject *, PyObject *);
64static int exec_statement(PyFrameObject *,
65 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000066static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
67static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000068static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000069
Paul Prescode68140d2000-08-30 20:25:01 +000070#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000071 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000072#define GLOBAL_NAME_ERROR_MSG \
73 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000074#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000075 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000076#define UNBOUNDFREE_ERROR_MSG \
77 "free variable '%.200s' referenced before assignment" \
78 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000079
Guido van Rossum950361c1997-01-24 13:49:28 +000080/* Dynamic execution profile */
81#ifdef DYNAMIC_EXECUTION_PROFILE
82#ifdef DXPAIRS
83static long dxpairs[257][256];
84#define dxp dxpairs[256]
85#else
86static long dxp[256];
87#endif
88#endif
89
Jeremy Hylton938ace62002-07-17 16:30:39 +000090static PyTypeObject gentype;
Tim Peters5ca576e2001-06-18 22:08:13 +000091
92typedef struct {
93 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000094 /* The gi_ prefix is intended to remind of generator-iterator. */
95
96 PyFrameObject *gi_frame;
97
Tim Peterse77f2e22001-06-26 22:24:51 +000098 /* True if generator is being executed. */
99 int gi_running;
Fred Drake72bc4562002-08-09 18:35:52 +0000100
101 /* List of weak reference. */
102 PyObject *gi_weakreflist;
Tim Peters5ca576e2001-06-18 22:08:13 +0000103} genobject;
104
105static PyObject *
106gen_new(PyFrameObject *f)
107{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000108 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000109 if (gen == NULL) {
110 Py_DECREF(f);
111 return NULL;
112 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000113 gen->gi_frame = f;
114 gen->gi_running = 0;
Fred Drake72bc4562002-08-09 18:35:52 +0000115 gen->gi_weakreflist = NULL;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000116 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000117 return (PyObject *)gen;
118}
119
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000120static int
121gen_traverse(genobject *gen, visitproc visit, void *arg)
122{
123 return visit((PyObject *)gen->gi_frame, arg);
124}
125
Tim Peters5ca576e2001-06-18 22:08:13 +0000126static void
127gen_dealloc(genobject *gen)
128{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000129 _PyObject_GC_UNTRACK(gen);
Fred Drake72bc4562002-08-09 18:35:52 +0000130 if (gen->gi_weakreflist != NULL)
131 PyObject_ClearWeakRefs((PyObject *) gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000133 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000134}
135
136static PyObject *
137gen_iternext(genobject *gen)
138{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000139 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000140 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 PyObject *result;
142
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000143 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000144 PyErr_SetString(PyExc_ValueError,
145 "generator already executing");
146 return NULL;
147 }
Tim Peters8c963692001-06-23 05:26:56 +0000148 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000150
151 /* Generators always return to their most recent caller, not
152 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000153 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000154 assert(f->f_back == NULL);
155 f->f_back = tstate->frame;
156
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000157 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000158 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000159 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000160
161 /* Don't keep the reference to f_back any longer than necessary. It
162 * may keep a chain of frames alive or it could create a reference
163 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000164 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000165 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166
Tim Petersad1a18b2001-06-23 06:19:16 +0000167 /* If the generator just returned (as opposed to yielding), signal
168 * that the generator is exhausted. */
169 if (result == Py_None && f->f_stacktop == NULL) {
170 Py_DECREF(result);
171 result = NULL;
172 }
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000175}
176
177static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000178gen_getiter(PyObject *gen)
179{
180 Py_INCREF(gen);
181 return gen;
182}
183
Guido van Rossum6f799372001-09-20 20:46:19 +0000184static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000185 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
186 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
187 {NULL} /* Sentinel */
188};
Tim Peters5ca576e2001-06-18 22:08:13 +0000189
Tim Peters0c322792002-07-17 16:49:03 +0000190static PyTypeObject gentype = {
Tim Peters5ca576e2001-06-18 22:08:13 +0000191 PyObject_HEAD_INIT(&PyType_Type)
192 0, /* ob_size */
193 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000194 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000195 0, /* tp_itemsize */
196 /* methods */
197 (destructor)gen_dealloc, /* tp_dealloc */
198 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000199 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000200 0, /* tp_setattr */
201 0, /* tp_compare */
202 0, /* tp_repr */
203 0, /* tp_as_number */
204 0, /* tp_as_sequence */
205 0, /* tp_as_mapping */
206 0, /* tp_hash */
207 0, /* tp_call */
208 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000209 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000210 0, /* tp_setattro */
211 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000212 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000214 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000215 0, /* tp_clear */
216 0, /* tp_richcompare */
Fred Drake72bc4562002-08-09 18:35:52 +0000217 offsetof(genobject, gi_weakreflist), /* tp_weaklistoffset */
Tim Peters5ca576e2001-06-18 22:08:13 +0000218 (getiterfunc)gen_getiter, /* tp_iter */
219 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Petersa64295b2002-07-17 00:15:22 +0000220 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 gen_memberlist, /* tp_members */
222 0, /* tp_getset */
223 0, /* tp_base */
224 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225};
226
227
Guido van Rossume59214e1994-08-30 08:01:59 +0000228#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000229
Guido van Rossum2571cc81999-04-07 16:07:23 +0000230#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000231#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000232#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000233#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000234
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235extern int _PyThread_Started; /* Flag for Py_Exit */
236
Guido van Rossum65d5b571998-12-21 19:32:43 +0000237static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000238static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000239
240void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000242{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000244 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000246 interpreter_lock = PyThread_allocate_lock();
247 PyThread_acquire_lock(interpreter_lock, 1);
248 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000250
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000254 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255}
256
257void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000259{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000260 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261}
262
263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000265{
266 if (tstate == NULL)
267 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000269 if (PyThreadState_Swap(tstate) != NULL)
270 Py_FatalError(
271 "PyEval_AcquireThread: non-NULL old thread state");
272}
273
274void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000276{
277 if (tstate == NULL)
278 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
279 if (PyThreadState_Swap(NULL) != tstate)
280 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000283
284/* This function is called from PyOS_AfterFork to ensure that newly
285 created child processes don't hold locks referring to threads which
286 are not running in the child process. (This could also be done using
287 pthread_atfork mechanism, at least for the pthreads implementation.) */
288
289void
290PyEval_ReInitThreads(void)
291{
292 if (!interpreter_lock)
293 return;
294 /*XXX Can't use PyThread_free_lock here because it does too
295 much error-checking. Doing this cleanly would require
296 adding a new function to each thread_*.h. Instead, just
297 create a new lock and waste a little bit of memory */
298 interpreter_lock = PyThread_allocate_lock();
299 PyThread_acquire_lock(interpreter_lock, 1);
300 main_thread = PyThread_get_thread_ident();
301}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302#endif
303
Guido van Rossumff4949e1992-08-05 19:58:53 +0000304/* Functions save_thread and restore_thread are always defined so
305 dynamically loaded modules needn't be compiled separately for use
306 with and without threads: */
307
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000308PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000309PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000311 PyThreadState *tstate = PyThreadState_Swap(NULL);
312 if (tstate == NULL)
313 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000314#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000315 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000318 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319}
320
321void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 if (tstate == NULL)
325 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 }
332#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336
Guido van Rossuma9672091994-09-14 13:31:22 +0000337/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
338 signal handlers or Mac I/O completion routines) can schedule calls
339 to a function to be called synchronously.
340 The synchronous function is called with one void* argument.
341 It should return 0 for success or -1 for failure -- failure should
342 be accompanied by an exception.
343
344 If registry succeeds, the registry function returns 0; if it fails
345 (e.g. due to too many pending calls) it returns -1 (without setting
346 an exception condition).
347
348 Note that because registry may occur from within signal handlers,
349 or other asynchronous events, calling malloc() is unsafe!
350
351#ifdef WITH_THREAD
352 Any thread can schedule pending calls, but only the main thread
353 will execute them.
354#endif
355
356 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
357 There are two possible race conditions:
358 (1) nested asynchronous registry calls;
359 (2) registry calls made while pending calls are being processed.
360 While (1) is very unlikely, (2) is a real possibility.
361 The current code is safe against (2), but not against (1).
362 The safety against (2) is derived from the fact that only one
363 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000364
Guido van Rossuma027efa1997-05-05 20:56:21 +0000365 XXX Darn! With the advent of thread state, we should have an array
366 of pending calls per thread in the thread state! Later...
367*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000368
Guido van Rossuma9672091994-09-14 13:31:22 +0000369#define NPENDINGCALLS 32
370static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000371 int (*func)(void *);
372 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373} pendingcalls[NPENDINGCALLS];
374static volatile int pendingfirst = 0;
375static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
378int
Thomas Wouters334fb892000-07-25 12:56:38 +0000379Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000380{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 int i, j;
383 /* XXX Begin critical section */
384 /* XXX If you want this to be safe against nested
385 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 if (busy)
387 return -1;
388 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389 i = pendinglast;
390 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000391 if (j == pendingfirst) {
392 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000393 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000394 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 pendingcalls[i].func = func;
396 pendingcalls[i].arg = arg;
397 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000398
399 _Py_Ticker = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 /* XXX End critical section */
403 return 0;
404}
405
Guido van Rossum180d7b41994-09-29 09:45:57 +0000406int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000407Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000408{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000409 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000410#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000411 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000412 return 0;
413#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415 return 0;
416 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000417 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418 for (;;) {
419 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000420 int (*func)(void *);
421 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000422 i = pendingfirst;
423 if (i == pendinglast)
424 break; /* Queue empty */
425 func = pendingcalls[i].func;
426 arg = pendingcalls[i].arg;
427 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000428 if (func(arg) < 0) {
429 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000432 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000433 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000434 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000435 return 0;
436}
437
438
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000439/* The interpreter's recursion limit */
440
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000441static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000442
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000443int
444Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000445{
446 return recursion_limit;
447}
448
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000449void
450Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451{
452 recursion_limit = new_limit;
453}
454
Guido van Rossum374a9221991-04-04 10:40:29 +0000455/* Status code for main loop (reason for stack unwind) */
456
457enum why_code {
458 WHY_NOT, /* No error */
459 WHY_EXCEPTION, /* Exception occurred */
460 WHY_RERAISE, /* Exception re-raised by 'finally' */
461 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000462 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000463 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000464 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000465};
466
Tim Petersdbd9ba62000-07-09 03:09:57 +0000467static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000468static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000469
Skip Montanarod581d772002-09-03 20:10:45 +0000470/* for manipulating the thread switch and periodic "stuff" - used to be
471 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000472int _Py_CheckInterval = 100;
473volatile int _Py_Ticker = 100;
Guido van Rossum374a9221991-04-04 10:40:29 +0000474
Guido van Rossumb209a111997-04-29 18:18:01 +0000475PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000476PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000478 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 (PyObject **)NULL, 0,
481 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482 (PyObject **)NULL, 0,
483 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484}
485
486
487/* Interpreter main loop */
488
Tim Peters6d6c1a32001-08-02 04:15:00 +0000489static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000490eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000491{
Guido van Rossum950361c1997-01-24 13:49:28 +0000492#ifdef DXPAIRS
493 int lastopcode = 0;
494#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000495 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000496 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000497 register int opcode=0; /* Current opcode */
498 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000499 register enum why_code why; /* Reason for block stack unwind */
500 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000501 register PyObject *x; /* Result object -- NULL if error */
502 register PyObject *v; /* Temporary objects popped off stack */
503 register PyObject *w;
504 register PyObject *u;
505 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000506 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000507 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000508 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000509 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000510 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000511
512 /* when tracing we set things up so that
513
514 not (instr_lb <= current_bytecode_offset < instr_ub)
515
516 is true when the line being executed has changed. The
517 initial values are such as to make this false the first
518 time it is tested. */
519 int instr_ub = -1, instr_lb = 0;
520
Guido van Rossumd076c731998-10-07 19:42:25 +0000521 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000522 PyObject *names;
523 PyObject *consts;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000524#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000525 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000526#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000527#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000529 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000530#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000531
Neal Norwitza81d2202002-07-14 00:27:26 +0000532/* Tuple access macros */
533
534#ifndef Py_DEBUG
535#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
536#else
537#define GETITEM(v, i) PyTuple_GetItem((v), (i))
538#endif
539
Guido van Rossum374a9221991-04-04 10:40:29 +0000540/* Code access macros */
541
Guido van Rossumd076c731998-10-07 19:42:25 +0000542#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000543#define NEXTOP() (*next_instr++)
544#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000545#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000546#define JUMPBY(x) (next_instr += (x))
547
548/* Stack manipulation macros */
549
550#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
551#define EMPTY() (STACK_LEVEL() == 0)
552#define TOP() (stack_pointer[-1])
553#define BASIC_PUSH(v) (*stack_pointer++ = (v))
554#define BASIC_POP() (*--stack_pointer)
555
Guido van Rossum96a42c81992-01-12 02:29:51 +0000556#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000557#define PUSH(v) { (void)(BASIC_PUSH(v), \
558 lltrace && prtrace(TOP(), "push")); \
559 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000560#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000561#else
562#define PUSH(v) BASIC_PUSH(v)
563#define POP() BASIC_POP()
564#endif
565
Guido van Rossum681d79a1995-07-18 14:51:37 +0000566/* Local variable macros */
567
568#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000569
570/* The SETLOCAL() macro must not DECREF the local variable in-place and
571 then store the new value; it must copy the old value to a temporary
572 value, then store the new value, and then DECREF the temporary value.
573 This is because it is possible that during the DECREF the frame is
574 accessed by other code (e.g. a __del__ method or gc.collect()) and the
575 variable would be pointing to already-freed memory. */
576#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
577 GETLOCAL(i) = value; \
578 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000579
Guido van Rossuma027efa1997-05-05 20:56:21 +0000580/* Start of code */
581
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 if (f == NULL)
583 return NULL;
584
Guido van Rossum8861b741996-07-30 16:49:37 +0000585#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000586 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000587 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000588 return NULL;
589 }
590#endif
591
Tim Peters5ca576e2001-06-18 22:08:13 +0000592 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000593 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000594 --tstate->recursion_depth;
595 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000596 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000597 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000598 return NULL;
599 }
600
Tim Peters5ca576e2001-06-18 22:08:13 +0000601 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000602
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000603 if (tstate->use_tracing) {
604 if (tstate->c_tracefunc != NULL) {
605 /* tstate->c_tracefunc, if defined, is a
606 function that will be called on *every* entry
607 to a code block. Its return value, if not
608 None, is a function that will be called at
609 the start of each executed line of code.
610 (Actually, the function must return itself
611 in order to continue tracing.) The trace
612 functions are called with three arguments:
613 a pointer to the current frame, a string
614 indicating why the function is called, and
615 an argument which depends on the situation.
616 The global trace function is also called
617 whenever an exception is detected. */
618 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
619 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000620 /* Trace function raised an error */
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000621 --tstate->recursion_depth;
622 tstate->frame = f->f_back;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000623 return NULL;
624 }
625 }
626 if (tstate->c_profilefunc != NULL) {
627 /* Similar for c_profilefunc, except it needn't
628 return itself and isn't called for "line" events */
629 if (call_trace(tstate->c_profilefunc,
630 tstate->c_profileobj,
631 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000632 /* Profile function raised an error */
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000633 --tstate->recursion_depth;
634 tstate->frame = f->f_back;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000635 return NULL;
636 }
637 }
638 }
639
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000640 co = f->f_code;
641 names = co->co_names;
642 consts = co->co_consts;
643 fastlocals = f->f_localsplus;
644 freevars = f->f_localsplus + f->f_nlocals;
645 _PyCode_GETCODEPTR(co, &first_instr);
646 /* An explanation is in order for the next line.
647
648 f->f_lasti now refers to the index of the last instruction
649 executed. You might think this was obvious from the name, but
650 this wasn't always true before 2.3! PyFrame_New now sets
651 f->f_lasti to -1 (i.e. the index *before* the first instruction)
652 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
653 does work. Promise. */
654 next_instr = first_instr + f->f_lasti + 1;
655 stack_pointer = f->f_stacktop;
656 assert(stack_pointer != NULL);
657 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
658
Tim Peters5ca576e2001-06-18 22:08:13 +0000659#ifdef LLTRACE
660 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
661#endif
662#if defined(Py_DEBUG) || defined(LLTRACE)
663 filename = PyString_AsString(co->co_filename);
664#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000665
Guido van Rossum374a9221991-04-04 10:40:29 +0000666 why = WHY_NOT;
667 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000668 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000669 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000670
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 for (;;) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000672 assert(stack_pointer >= f->f_valuestack); /* else underflow */
673 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
674
Guido van Rossuma027efa1997-05-05 20:56:21 +0000675 /* Do periodic things. Doing this every time through
676 the loop would add too much overhead, so we do it
677 only every Nth instruction. We also do it if
678 ``things_to_do'' is set, i.e. when an asynchronous
679 event needs attention (e.g. a signal handler or
680 async I/O handler); see Py_AddPendingCall() and
681 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000682
Skip Montanarod581d772002-09-03 20:10:45 +0000683 if (--_Py_Ticker < 0) {
684 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000685 tstate->tick_counter++;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000686 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000687 if (Py_MakePendingCalls() < 0) {
688 why = WHY_EXCEPTION;
689 goto on_error;
690 }
691 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000692#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000693 /* If we have true signals, the signal handler
694 will call Py_AddPendingCall() so we don't
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000695 have to call PyErr_CheckSignals(). On the
696 Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000697 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 goto on_error;
700 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000701#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000702
Guido van Rossume59214e1994-08-30 08:01:59 +0000703#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000704 if (interpreter_lock) {
705 /* Give another thread a chance */
706
Guido van Rossum25ce5661997-08-02 03:10:38 +0000707 if (PyThreadState_Swap(NULL) != tstate)
708 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000709 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000710
711 /* Other threads may run now */
712
Guido van Rossum65d5b571998-12-21 19:32:43 +0000713 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000714 if (PyThreadState_Swap(tstate) != NULL)
715 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000716 }
717#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000719
Neil Schemenauer63543862002-02-17 19:10:14 +0000720 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000721 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000723 /* line-by-line tracing support */
724
725 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
726 /* see maybe_call_line_trace
727 for expository comments */
728 f->f_stacktop = stack_pointer;
Michael W. Hudson006c7522002-11-08 13:08:46 +0000729
730 if (maybe_call_line_trace(tstate->c_tracefunc,
731 tstate->c_traceobj,
732 f, &instr_lb, &instr_ub)) {
733 /* trace function raised an exception */
734 why = WHY_EXCEPTION;
735 goto on_error;
736 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000737 /* Reload possibly changed frame fields */
738 JUMPTO(f->f_lasti);
739 stack_pointer = f->f_stacktop;
740 assert(stack_pointer != NULL);
741 f->f_stacktop = NULL;
742 }
743
744 /* Extract opcode and argument */
745
Guido van Rossum374a9221991-04-04 10:40:29 +0000746 opcode = NEXTOP();
747 if (HAS_ARG(opcode))
748 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000749 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000750#ifdef DYNAMIC_EXECUTION_PROFILE
751#ifdef DXPAIRS
752 dxpairs[lastopcode][opcode]++;
753 lastopcode = opcode;
754#endif
755 dxp[opcode]++;
756#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000757
Guido van Rossum96a42c81992-01-12 02:29:51 +0000758#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000760
Guido van Rossum96a42c81992-01-12 02:29:51 +0000761 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 if (HAS_ARG(opcode)) {
763 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000764 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 }
766 else {
767 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000768 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000769 }
770 }
771#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000772
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000774
Guido van Rossum374a9221991-04-04 10:40:29 +0000775 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000776
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 /* BEWARE!
778 It is essential that any operation that fails sets either
779 x to NULL, err to nonzero, or why to anything but WHY_NOT,
780 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000781
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000783
Neil Schemenauer63543862002-02-17 19:10:14 +0000784 case LOAD_FAST:
785 x = GETLOCAL(oparg);
786 if (x != NULL) {
787 Py_INCREF(x);
788 PUSH(x);
789 goto fast_next_opcode;
790 }
791 format_exc_check_arg(PyExc_UnboundLocalError,
792 UNBOUNDLOCAL_ERROR_MSG,
793 PyTuple_GetItem(co->co_varnames, oparg));
794 break;
795
796 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000797 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000798 Py_INCREF(x);
799 PUSH(x);
800 goto fast_next_opcode;
801
802 case STORE_FAST:
803 v = POP();
804 SETLOCAL(oparg, v);
805 goto fast_next_opcode;
806
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 case POP_TOP:
808 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000809 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000810 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000811
Guido van Rossum374a9221991-04-04 10:40:29 +0000812 case ROT_TWO:
813 v = POP();
814 w = POP();
815 PUSH(v);
816 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000817 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000818
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 case ROT_THREE:
820 v = POP();
821 w = POP();
822 x = POP();
823 PUSH(v);
824 PUSH(x);
825 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000826 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000827
Thomas Wouters434d0822000-08-24 20:11:32 +0000828 case ROT_FOUR:
829 u = POP();
830 v = POP();
831 w = POP();
832 x = POP();
833 PUSH(u);
834 PUSH(x);
835 PUSH(w);
836 PUSH(v);
837 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000838
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 case DUP_TOP:
840 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000841 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000843 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000844
Thomas Wouters434d0822000-08-24 20:11:32 +0000845 case DUP_TOPX:
846 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000847 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000848 x = TOP();
849 Py_INCREF(x);
850 PUSH(x);
851 continue;
852 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000853 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000854 Py_INCREF(x);
855 w = TOP();
856 Py_INCREF(w);
857 PUSH(x);
858 PUSH(w);
859 PUSH(x);
860 continue;
861 case 3:
862 x = POP();
863 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000864 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000865 Py_INCREF(w);
866 v = TOP();
867 Py_INCREF(v);
868 PUSH(w);
869 PUSH(x);
870 PUSH(v);
871 PUSH(w);
872 PUSH(x);
873 continue;
874 case 4:
875 x = POP();
876 Py_INCREF(x);
877 w = POP();
878 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000879 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000880 Py_INCREF(v);
881 u = TOP();
882 Py_INCREF(u);
883 PUSH(v);
884 PUSH(w);
885 PUSH(x);
886 PUSH(u);
887 PUSH(v);
888 PUSH(w);
889 PUSH(x);
890 continue;
891 case 5:
892 x = POP();
893 Py_INCREF(x);
894 w = POP();
895 Py_INCREF(w);
896 v = POP();
897 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000898 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000899 Py_INCREF(u);
900 t = TOP();
901 Py_INCREF(t);
902 PUSH(u);
903 PUSH(v);
904 PUSH(w);
905 PUSH(x);
906 PUSH(t);
907 PUSH(u);
908 PUSH(v);
909 PUSH(w);
910 PUSH(x);
911 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000912 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000913 Py_FatalError("invalid argument to DUP_TOPX"
914 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000915 }
Tim Peters35ba6892000-10-11 07:04:49 +0000916 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000917
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 case UNARY_POSITIVE:
919 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000920 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000921 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000923 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000925
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 case UNARY_NEGATIVE:
927 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000928 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000929 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000931 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000933
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 case UNARY_NOT:
935 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000936 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000937 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000938 if (err == 0) {
939 Py_INCREF(Py_True);
940 PUSH(Py_True);
941 continue;
942 }
943 else if (err > 0) {
944 Py_INCREF(Py_False);
945 PUSH(Py_False);
946 err = 0;
947 continue;
948 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000950
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 case UNARY_CONVERT:
952 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000953 x = PyObject_Repr(v);
954 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000956 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000958
Guido van Rossum7928cd71991-10-24 14:59:31 +0000959 case UNARY_INVERT:
960 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000961 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000963 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000964 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000965 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000966
Guido van Rossum50564e81996-01-12 01:13:16 +0000967 case BINARY_POWER:
968 w = POP();
969 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000970 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000971 Py_DECREF(v);
972 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000973 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000974 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000975 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000976
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 case BINARY_MULTIPLY:
978 w = POP();
979 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000980 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000981 Py_DECREF(v);
982 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000984 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000986
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000988 if (!_Py_QnewFlag) {
989 w = POP();
990 v = POP();
991 x = PyNumber_Divide(v, w);
992 Py_DECREF(v);
993 Py_DECREF(w);
994 PUSH(x);
995 if (x != NULL) continue;
996 break;
997 }
998 /* -Qnew is in effect: fall through to
999 BINARY_TRUE_DIVIDE */
1000 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 w = POP();
1002 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +00001003 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_DECREF(v);
1005 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001007 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001009
Guido van Rossum4668b002001-08-08 05:00:18 +00001010 case BINARY_FLOOR_DIVIDE:
1011 w = POP();
1012 v = POP();
1013 x = PyNumber_FloorDivide(v, w);
1014 Py_DECREF(v);
1015 Py_DECREF(w);
1016 PUSH(x);
1017 if (x != NULL) continue;
1018 break;
1019
Guido van Rossum374a9221991-04-04 10:40:29 +00001020 case BINARY_MODULO:
1021 w = POP();
1022 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001023 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 Py_DECREF(v);
1025 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001027 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001029
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 case BINARY_ADD:
1031 w = POP();
1032 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001033 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001034 /* INLINE: int + int */
1035 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001036 a = PyInt_AS_LONG(v);
1037 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001038 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001039 if ((i^a) < 0 && (i^b) < 0)
1040 goto slow_add;
1041 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001042 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001043 else {
1044 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001045 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001046 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001047 Py_DECREF(v);
1048 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001050 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001052
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 case BINARY_SUBTRACT:
1054 w = POP();
1055 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001056 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001057 /* INLINE: int - int */
1058 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001059 a = PyInt_AS_LONG(v);
1060 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001061 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001062 if ((i^a) < 0 && (i^~b) < 0)
1063 goto slow_sub;
1064 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001065 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001066 else {
1067 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001068 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001069 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001070 Py_DECREF(v);
1071 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001073 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001074 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001075
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 case BINARY_SUBSCR:
1077 w = POP();
1078 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001079 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001080 /* INLINE: list[int] */
1081 long i = PyInt_AsLong(w);
1082 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001083 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001084 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001085 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001086 PyErr_SetString(PyExc_IndexError,
1087 "list index out of range");
1088 x = NULL;
1089 }
1090 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001091 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001092 Py_INCREF(x);
1093 }
1094 }
1095 else
1096 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001097 Py_DECREF(v);
1098 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001100 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001101 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001102
Guido van Rossum7928cd71991-10-24 14:59:31 +00001103 case BINARY_LSHIFT:
1104 w = POP();
1105 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001106 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001107 Py_DECREF(v);
1108 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001109 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001110 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001111 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001112
Guido van Rossum7928cd71991-10-24 14:59:31 +00001113 case BINARY_RSHIFT:
1114 w = POP();
1115 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001116 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001117 Py_DECREF(v);
1118 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001119 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001120 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001121 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001122
Guido van Rossum7928cd71991-10-24 14:59:31 +00001123 case BINARY_AND:
1124 w = POP();
1125 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001126 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001127 Py_DECREF(v);
1128 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001129 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001130 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001131 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001132
Guido van Rossum7928cd71991-10-24 14:59:31 +00001133 case BINARY_XOR:
1134 w = POP();
1135 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001136 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001137 Py_DECREF(v);
1138 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001139 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001140 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001141 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001142
Guido van Rossum7928cd71991-10-24 14:59:31 +00001143 case BINARY_OR:
1144 w = POP();
1145 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001146 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001147 Py_DECREF(v);
1148 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001149 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001150 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001151 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001152
1153 case INPLACE_POWER:
1154 w = POP();
1155 v = POP();
1156 x = PyNumber_InPlacePower(v, w, Py_None);
1157 Py_DECREF(v);
1158 Py_DECREF(w);
1159 PUSH(x);
1160 if (x != NULL) continue;
1161 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001162
Thomas Wouters434d0822000-08-24 20:11:32 +00001163 case INPLACE_MULTIPLY:
1164 w = POP();
1165 v = POP();
1166 x = PyNumber_InPlaceMultiply(v, w);
1167 Py_DECREF(v);
1168 Py_DECREF(w);
1169 PUSH(x);
1170 if (x != NULL) continue;
1171 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001172
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001174 if (!_Py_QnewFlag) {
1175 w = POP();
1176 v = POP();
1177 x = PyNumber_InPlaceDivide(v, w);
1178 Py_DECREF(v);
1179 Py_DECREF(w);
1180 PUSH(x);
1181 if (x != NULL) continue;
1182 break;
1183 }
1184 /* -Qnew is in effect: fall through to
1185 INPLACE_TRUE_DIVIDE */
1186 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001187 w = POP();
1188 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001189 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001190 Py_DECREF(v);
1191 Py_DECREF(w);
1192 PUSH(x);
1193 if (x != NULL) continue;
1194 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001195
Guido van Rossum4668b002001-08-08 05:00:18 +00001196 case INPLACE_FLOOR_DIVIDE:
1197 w = POP();
1198 v = POP();
1199 x = PyNumber_InPlaceFloorDivide(v, w);
1200 Py_DECREF(v);
1201 Py_DECREF(w);
1202 PUSH(x);
1203 if (x != NULL) continue;
1204 break;
1205
Thomas Wouters434d0822000-08-24 20:11:32 +00001206 case INPLACE_MODULO:
1207 w = POP();
1208 v = POP();
1209 x = PyNumber_InPlaceRemainder(v, w);
1210 Py_DECREF(v);
1211 Py_DECREF(w);
1212 PUSH(x);
1213 if (x != NULL) continue;
1214 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001215
Thomas Wouters434d0822000-08-24 20:11:32 +00001216 case INPLACE_ADD:
1217 w = POP();
1218 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001219 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001220 /* INLINE: int + int */
1221 register long a, b, i;
1222 a = PyInt_AS_LONG(v);
1223 b = PyInt_AS_LONG(w);
1224 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001225 if ((i^a) < 0 && (i^b) < 0)
1226 goto slow_iadd;
1227 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001228 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001229 else {
1230 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001231 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001232 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001233 Py_DECREF(v);
1234 Py_DECREF(w);
1235 PUSH(x);
1236 if (x != NULL) continue;
1237 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001238
Thomas Wouters434d0822000-08-24 20:11:32 +00001239 case INPLACE_SUBTRACT:
1240 w = POP();
1241 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001242 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001243 /* INLINE: int - int */
1244 register long a, b, i;
1245 a = PyInt_AS_LONG(v);
1246 b = PyInt_AS_LONG(w);
1247 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001248 if ((i^a) < 0 && (i^~b) < 0)
1249 goto slow_isub;
1250 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001251 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001252 else {
1253 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001254 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001255 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001256 Py_DECREF(v);
1257 Py_DECREF(w);
1258 PUSH(x);
1259 if (x != NULL) continue;
1260 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001261
Thomas Wouters434d0822000-08-24 20:11:32 +00001262 case INPLACE_LSHIFT:
1263 w = POP();
1264 v = POP();
1265 x = PyNumber_InPlaceLshift(v, w);
1266 Py_DECREF(v);
1267 Py_DECREF(w);
1268 PUSH(x);
1269 if (x != NULL) continue;
1270 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001271
Thomas Wouters434d0822000-08-24 20:11:32 +00001272 case INPLACE_RSHIFT:
1273 w = POP();
1274 v = POP();
1275 x = PyNumber_InPlaceRshift(v, w);
1276 Py_DECREF(v);
1277 Py_DECREF(w);
1278 PUSH(x);
1279 if (x != NULL) continue;
1280 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001281
Thomas Wouters434d0822000-08-24 20:11:32 +00001282 case INPLACE_AND:
1283 w = POP();
1284 v = POP();
1285 x = PyNumber_InPlaceAnd(v, w);
1286 Py_DECREF(v);
1287 Py_DECREF(w);
1288 PUSH(x);
1289 if (x != NULL) continue;
1290 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001291
Thomas Wouters434d0822000-08-24 20:11:32 +00001292 case INPLACE_XOR:
1293 w = POP();
1294 v = POP();
1295 x = PyNumber_InPlaceXor(v, w);
1296 Py_DECREF(v);
1297 Py_DECREF(w);
1298 PUSH(x);
1299 if (x != NULL) continue;
1300 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001301
Thomas Wouters434d0822000-08-24 20:11:32 +00001302 case INPLACE_OR:
1303 w = POP();
1304 v = POP();
1305 x = PyNumber_InPlaceOr(v, w);
1306 Py_DECREF(v);
1307 Py_DECREF(w);
1308 PUSH(x);
1309 if (x != NULL) continue;
1310 break;
1311
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 case SLICE+0:
1313 case SLICE+1:
1314 case SLICE+2:
1315 case SLICE+3:
1316 if ((opcode-SLICE) & 2)
1317 w = POP();
1318 else
1319 w = NULL;
1320 if ((opcode-SLICE) & 1)
1321 v = POP();
1322 else
1323 v = NULL;
1324 u = POP();
1325 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001326 Py_DECREF(u);
1327 Py_XDECREF(v);
1328 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001330 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001332
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 case STORE_SLICE+0:
1334 case STORE_SLICE+1:
1335 case STORE_SLICE+2:
1336 case STORE_SLICE+3:
1337 if ((opcode-STORE_SLICE) & 2)
1338 w = POP();
1339 else
1340 w = NULL;
1341 if ((opcode-STORE_SLICE) & 1)
1342 v = POP();
1343 else
1344 v = NULL;
1345 u = POP();
1346 t = POP();
1347 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001348 Py_DECREF(t);
1349 Py_DECREF(u);
1350 Py_XDECREF(v);
1351 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001352 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001354
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 case DELETE_SLICE+0:
1356 case DELETE_SLICE+1:
1357 case DELETE_SLICE+2:
1358 case DELETE_SLICE+3:
1359 if ((opcode-DELETE_SLICE) & 2)
1360 w = POP();
1361 else
1362 w = NULL;
1363 if ((opcode-DELETE_SLICE) & 1)
1364 v = POP();
1365 else
1366 v = NULL;
1367 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001368 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 Py_DECREF(u);
1371 Py_XDECREF(v);
1372 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001373 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001375
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 case STORE_SUBSCR:
1377 w = POP();
1378 v = POP();
1379 u = POP();
1380 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001381 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 Py_DECREF(u);
1383 Py_DECREF(v);
1384 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001385 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001387
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 case DELETE_SUBSCR:
1389 w = POP();
1390 v = POP();
1391 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001392 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001393 Py_DECREF(v);
1394 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001395 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001397
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 case PRINT_EXPR:
1399 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001400 w = PySys_GetObject("displayhook");
1401 if (w == NULL) {
1402 PyErr_SetString(PyExc_RuntimeError,
1403 "lost sys.displayhook");
1404 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001405 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001406 }
1407 if (err == 0) {
1408 x = Py_BuildValue("(O)", v);
1409 if (x == NULL)
1410 err = -1;
1411 }
1412 if (err == 0) {
1413 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001414 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001415 if (w == NULL)
1416 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001419 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001421
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001422 case PRINT_ITEM_TO:
1423 w = stream = POP();
1424 /* fall through to PRINT_ITEM */
1425
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 case PRINT_ITEM:
1427 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001428 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001429 w = PySys_GetObject("stdout");
1430 if (w == NULL) {
1431 PyErr_SetString(PyExc_RuntimeError,
1432 "lost sys.stdout");
1433 err = -1;
1434 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001435 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001436 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001437 err = PyFile_WriteString(" ", w);
1438 if (err == 0)
1439 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001440 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001441 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001442 if (PyString_Check(v)) {
1443 char *s = PyString_AS_STRING(v);
1444 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001445 if (len == 0 ||
1446 !isspace(Py_CHARMASK(s[len-1])) ||
1447 s[len-1] == ' ')
1448 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001449 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001450#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001451 else if (PyUnicode_Check(v)) {
1452 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1453 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001454 if (len == 0 ||
1455 !Py_UNICODE_ISSPACE(s[len-1]) ||
1456 s[len-1] == ' ')
1457 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001458 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001459#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001460 else
1461 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001463 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001464 Py_XDECREF(stream);
1465 stream = NULL;
1466 if (err == 0)
1467 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001469
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001470 case PRINT_NEWLINE_TO:
1471 w = stream = POP();
1472 /* fall through to PRINT_NEWLINE */
1473
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001475 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001476 w = PySys_GetObject("stdout");
1477 if (w == NULL)
1478 PyErr_SetString(PyExc_RuntimeError,
1479 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001480 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001481 if (w != NULL) {
1482 err = PyFile_WriteString("\n", w);
1483 if (err == 0)
1484 PyFile_SoftSpace(w, 0);
1485 }
1486 Py_XDECREF(stream);
1487 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001489
Thomas Wouters434d0822000-08-24 20:11:32 +00001490
1491#ifdef CASE_TOO_BIG
1492 default: switch (opcode) {
1493#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 case BREAK_LOOP:
1495 why = WHY_BREAK;
1496 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001497
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001498 case CONTINUE_LOOP:
1499 retval = PyInt_FromLong(oparg);
1500 why = WHY_CONTINUE;
1501 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001502
Guido van Rossumf10570b1995-07-07 22:53:21 +00001503 case RAISE_VARARGS:
1504 u = v = w = NULL;
1505 switch (oparg) {
1506 case 3:
1507 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001508 /* Fallthrough */
1509 case 2:
1510 v = POP(); /* value */
1511 /* Fallthrough */
1512 case 1:
1513 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001514 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001515 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001516 break;
1517 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001518 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001519 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001520 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001521 break;
1522 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001524
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001526 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001527 PyErr_SetString(PyExc_SystemError,
1528 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001529 break;
1530 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001532 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001534
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 case RETURN_VALUE:
1536 retval = POP();
1537 why = WHY_RETURN;
1538 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001539
Tim Peters5ca576e2001-06-18 22:08:13 +00001540 case YIELD_VALUE:
1541 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001542 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001543 why = WHY_YIELD;
1544 break;
1545
1546
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001547 case EXEC_STMT:
1548 w = POP();
1549 v = POP();
1550 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001551 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 Py_DECREF(u);
1553 Py_DECREF(v);
1554 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001555 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001556
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 case POP_BLOCK:
1558 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 while (STACK_LEVEL() > b->b_level) {
1561 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 }
1564 }
1565 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001566
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 case END_FINALLY:
1568 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 if (PyInt_Check(v)) {
1570 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001571 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001572 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001573 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 retval = POP();
1575 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001578 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001581 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 else if (v != Py_None) {
1584 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 "'finally' pops bad exception");
1586 why = WHY_EXCEPTION;
1587 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001590
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001592 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001594 w = POP();
1595 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001597 Py_DECREF(u);
1598 Py_DECREF(v);
1599 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001601
Guido van Rossum374a9221991-04-04 10:40:29 +00001602 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001603 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001606 PyErr_Format(PyExc_SystemError,
1607 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001608 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001609 break;
1610 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 err = PyDict_SetItem(x, w, v);
1612 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001613 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001614
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001616 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001617 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001618 PyErr_Format(PyExc_SystemError,
1619 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001620 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 break;
1622 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001623 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001624 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001625 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001626 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001627
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001628 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001630 if (PyTuple_Check(v)) {
1631 if (PyTuple_Size(v) != oparg) {
1632 PyErr_SetString(PyExc_ValueError,
1633 "unpack tuple of wrong size");
1634 why = WHY_EXCEPTION;
1635 }
1636 else {
1637 for (; --oparg >= 0; ) {
1638 w = PyTuple_GET_ITEM(v, oparg);
1639 Py_INCREF(w);
1640 PUSH(w);
1641 }
1642 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001644 else if (PyList_Check(v)) {
1645 if (PyList_Size(v) != oparg) {
1646 PyErr_SetString(PyExc_ValueError,
1647 "unpack list of wrong size");
1648 why = WHY_EXCEPTION;
1649 }
1650 else {
1651 for (; --oparg >= 0; ) {
1652 w = PyList_GET_ITEM(v, oparg);
1653 Py_INCREF(w);
1654 PUSH(w);
1655 }
1656 }
1657 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001658 else if (unpack_iterable(v, oparg,
1659 stack_pointer + oparg))
1660 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001661 else {
1662 if (PyErr_ExceptionMatches(PyExc_TypeError))
1663 PyErr_SetString(PyExc_TypeError,
1664 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001665 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001666 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001669
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001671 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 v = POP();
1673 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1675 Py_DECREF(v);
1676 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001678
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001680 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001682 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1683 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001686
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001687 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001688 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001689 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001690 err = PyDict_SetItem(f->f_globals, w, v);
1691 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001692 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001693
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001694 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001695 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001697 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001698 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001699 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001700
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001702 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001703 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001704 PyErr_Format(PyExc_SystemError,
1705 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001706 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001707 break;
1708 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001709 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001711 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001715 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001716 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001717 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 break;
1719 }
1720 }
1721 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 PUSH(x);
1724 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001725
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001727 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001728 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001729 /* Inline the PyDict_GetItem() calls.
1730 WARNING: this is an extreme speed hack.
1731 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001732 long hash = ((PyStringObject *)w)->ob_shash;
1733 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001734 PyDictObject *d;
1735 d = (PyDictObject *)(f->f_globals);
1736 x = d->ma_lookup(d, w, hash)->me_value;
1737 if (x != NULL) {
1738 Py_INCREF(x);
1739 PUSH(x);
1740 continue;
1741 }
1742 d = (PyDictObject *)(f->f_builtins);
1743 x = d->ma_lookup(d, w, hash)->me_value;
1744 if (x != NULL) {
1745 Py_INCREF(x);
1746 PUSH(x);
1747 continue;
1748 }
1749 goto load_global_error;
1750 }
1751 }
1752 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001755 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001757 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001758 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001759 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001760 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 break;
1762 }
1763 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001764 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 PUSH(x);
1766 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001767
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001768 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001769 x = GETLOCAL(oparg);
1770 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001771 format_exc_check_arg(
1772 PyExc_UnboundLocalError,
1773 UNBOUNDLOCAL_ERROR_MSG,
1774 PyTuple_GetItem(co->co_varnames, oparg)
1775 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001776 break;
1777 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001778 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001779 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001780
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001781 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001782 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001783 Py_INCREF(x);
1784 PUSH(x);
1785 break;
1786
1787 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001788 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001789 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001790 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001791 err = -1;
1792 /* Don't stomp existing exception */
1793 if (PyErr_Occurred())
1794 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001795 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001796 v = PyTuple_GetItem(co->co_cellvars,
1797 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001798 format_exc_check_arg(
1799 PyExc_UnboundLocalError,
1800 UNBOUNDLOCAL_ERROR_MSG,
1801 v);
1802 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001803 v = PyTuple_GetItem(
1804 co->co_freevars,
1805 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001806 format_exc_check_arg(
1807 PyExc_NameError,
1808 UNBOUNDFREE_ERROR_MSG,
1809 v);
1810 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001811 break;
1812 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001813 PUSH(w);
1814 break;
1815
1816 case STORE_DEREF:
1817 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001818 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001819 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001820 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001821 continue;
1822
Guido van Rossum374a9221991-04-04 10:40:29 +00001823 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 if (x != NULL) {
1826 for (; --oparg >= 0;) {
1827 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 }
1830 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001831 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 }
1833 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001834
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 if (x != NULL) {
1838 for (; --oparg >= 0;) {
1839 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001840 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 }
1842 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001843 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 }
1845 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001846
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001848 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001850 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001852
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001854 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 x = PyObject_GetAttr(v, w);
1857 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001859 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001860 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001861
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 case COMPARE_OP:
1863 w = POP();
1864 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001865 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001866 /* INLINE: cmp(int, int) */
1867 register long a, b;
1868 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001869 a = PyInt_AS_LONG(v);
1870 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001871 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001872 case PyCmp_LT: res = a < b; break;
1873 case PyCmp_LE: res = a <= b; break;
1874 case PyCmp_EQ: res = a == b; break;
1875 case PyCmp_NE: res = a != b; break;
1876 case PyCmp_GT: res = a > b; break;
1877 case PyCmp_GE: res = a >= b; break;
1878 case PyCmp_IS: res = v == w; break;
1879 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001880 default: goto slow_compare;
1881 }
1882 x = res ? Py_True : Py_False;
1883 Py_INCREF(x);
1884 }
1885 else {
1886 slow_compare:
1887 x = cmp_outcome(oparg, v, w);
1888 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001889 Py_DECREF(v);
1890 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001891 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001892 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001893 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001894
Guido van Rossum374a9221991-04-04 10:40:29 +00001895 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001896 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001897 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001898 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001899 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001900 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001901 break;
1902 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001903 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001904 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001905 w,
1906 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001907 f->f_locals == NULL ?
1908 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001909 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001910 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001911 if (w == NULL) {
1912 x = NULL;
1913 break;
1914 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001915 x = PyEval_CallObject(x, w);
1916 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001917 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001918 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001919 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001920
Thomas Wouters52152252000-08-17 22:55:00 +00001921 case IMPORT_STAR:
1922 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001923 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001924 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001925 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001926 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001927 break;
1928 }
Thomas Wouters52152252000-08-17 22:55:00 +00001929 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001930 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001931 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001932 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001934
Thomas Wouters52152252000-08-17 22:55:00 +00001935 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001936 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001937 v = TOP();
1938 x = import_from(v, w);
1939 PUSH(x);
1940 if (x != NULL) continue;
1941 break;
1942
Guido van Rossum374a9221991-04-04 10:40:29 +00001943 case JUMP_FORWARD:
1944 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001945 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001946
Guido van Rossum374a9221991-04-04 10:40:29 +00001947 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001948 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001949 if (err > 0)
1950 err = 0;
1951 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001952 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001953 else
1954 break;
1955 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001956
Guido van Rossum374a9221991-04-04 10:40:29 +00001957 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001958 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001959 if (err > 0) {
1960 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001961 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001962 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001963 else if (err == 0)
1964 ;
1965 else
1966 break;
1967 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001968
Guido van Rossum374a9221991-04-04 10:40:29 +00001969 case JUMP_ABSOLUTE:
1970 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001971 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001972
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001973 case GET_ITER:
1974 /* before: [obj]; after [getiter(obj)] */
1975 v = POP();
1976 x = PyObject_GetIter(v);
1977 Py_DECREF(v);
1978 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001979 PUSH(x);
1980 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001981 }
1982 break;
1983
1984 case FOR_ITER:
1985 /* before: [iter]; after: [iter, iter()] *or* [] */
1986 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001987 x = PyIter_Next(v);
1988 if (x != NULL) {
1989 PUSH(x);
1990 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001991 }
Tim Petersf4848da2001-05-05 00:14:56 +00001992 if (!PyErr_Occurred()) {
1993 /* iterator ended normally */
1994 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001995 Py_DECREF(v);
1996 JUMPBY(oparg);
1997 continue;
1998 }
1999 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002000
Guido van Rossum374a9221991-04-04 10:40:29 +00002001 case SETUP_LOOP:
2002 case SETUP_EXCEPT:
2003 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00002004 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002005 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002006 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002007
Guido van Rossumf10570b1995-07-07 22:53:21 +00002008 case CALL_FUNCTION:
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002009 x = call_function(&stack_pointer, oparg);
2010 PUSH(x);
2011 if (x != NULL)
2012 continue;
2013 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002014
Jeremy Hylton76901512000-03-28 23:49:17 +00002015 case CALL_FUNCTION_VAR:
2016 case CALL_FUNCTION_KW:
2017 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002018 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002019 int na = oparg & 0xff;
2020 int nk = (oparg>>8) & 0xff;
2021 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002022 int n = na + 2 * nk;
2023 PyObject **pfunc, *func;
2024 if (flags & CALL_FLAG_VAR)
2025 n++;
2026 if (flags & CALL_FLAG_KW)
2027 n++;
2028 pfunc = stack_pointer - n - 1;
2029 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002030
Guido van Rossumac7be682001-01-17 15:42:30 +00002031 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002032 && PyMethod_GET_SELF(func) != NULL) {
2033 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002034 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002035 func = PyMethod_GET_FUNCTION(func);
2036 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002037 Py_DECREF(*pfunc);
2038 *pfunc = self;
2039 na++;
2040 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002041 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002042 Py_INCREF(func);
2043 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002044 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002045
Jeremy Hylton76901512000-03-28 23:49:17 +00002046 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002047 w = POP();
2048 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002049 }
2050 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002051 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002052 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002053 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002054 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002055
Guido van Rossum681d79a1995-07-18 14:51:37 +00002056 case MAKE_FUNCTION:
2057 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 x = PyFunction_New(v, f->f_globals);
2059 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 /* XXX Maybe this should be a separate opcode? */
2061 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002063 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002065 x = NULL;
2066 break;
2067 }
2068 while (--oparg >= 0) {
2069 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002071 }
2072 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 }
2075 PUSH(x);
2076 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002077
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002078 case MAKE_CLOSURE:
2079 {
2080 int nfree;
2081 v = POP(); /* code object */
2082 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002083 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002084 Py_DECREF(v);
2085 /* XXX Maybe this should be a separate opcode? */
2086 if (x != NULL && nfree > 0) {
2087 v = PyTuple_New(nfree);
2088 if (v == NULL) {
2089 Py_DECREF(x);
2090 x = NULL;
2091 break;
2092 }
2093 while (--nfree >= 0) {
2094 w = POP();
2095 PyTuple_SET_ITEM(v, nfree, w);
2096 }
2097 err = PyFunction_SetClosure(x, v);
2098 Py_DECREF(v);
2099 }
2100 if (x != NULL && oparg > 0) {
2101 v = PyTuple_New(oparg);
2102 if (v == NULL) {
2103 Py_DECREF(x);
2104 x = NULL;
2105 break;
2106 }
2107 while (--oparg >= 0) {
2108 w = POP();
2109 PyTuple_SET_ITEM(v, oparg, w);
2110 }
2111 err = PyFunction_SetDefaults(x, v);
2112 Py_DECREF(v);
2113 }
2114 PUSH(x);
2115 break;
2116 }
2117
Guido van Rossum8861b741996-07-30 16:49:37 +00002118 case BUILD_SLICE:
2119 if (oparg == 3)
2120 w = POP();
2121 else
2122 w = NULL;
2123 v = POP();
2124 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002125 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 Py_DECREF(u);
2127 Py_DECREF(v);
2128 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002129 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002130 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002131 break;
2132
Fred Drakeef8ace32000-08-24 00:32:09 +00002133 case EXTENDED_ARG:
2134 opcode = NEXTOP();
2135 oparg = oparg<<16 | NEXTARG();
2136 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002137
Guido van Rossum374a9221991-04-04 10:40:29 +00002138 default:
2139 fprintf(stderr,
2140 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002141 PyCode_Addr2Line(f->f_code, f->f_lasti),
2142 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 why = WHY_EXCEPTION;
2145 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002146
2147#ifdef CASE_TOO_BIG
2148 }
2149#endif
2150
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 } /* switch */
2152
2153 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002154
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002156
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002158 if (err == 0 && x != NULL) {
2159#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002160 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002162 fprintf(stderr,
2163 "XXX undetected error\n");
2164 else
2165#endif
2166 continue; /* Normal, fast path */
2167 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 err = 0;
2171 }
2172
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002174
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002177 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002178 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 why = WHY_EXCEPTION;
2180 }
2181 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002182#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002184 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002186 fprintf(stderr,
2187 "XXX undetected error (why=%d)\n",
2188 why);
2189 why = WHY_EXCEPTION;
2190 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 }
2192#endif
2193
2194 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002195
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002198
Fred Drake8f51f542001-10-04 14:48:42 +00002199 if (tstate->c_tracefunc != NULL)
2200 call_exc_trace(tstate->c_tracefunc,
2201 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002202 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002203
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 if (why == WHY_RERAISE)
2207 why = WHY_EXCEPTION;
2208
2209 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002210
Tim Peters5ca576e2001-06-18 22:08:13 +00002211 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002213
2214 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2215 /* For a continue inside a try block,
2216 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002217 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2218 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002219 why = WHY_NOT;
2220 JUMPTO(PyInt_AS_LONG(retval));
2221 Py_DECREF(retval);
2222 break;
2223 }
2224
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 while (STACK_LEVEL() > b->b_level) {
2226 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002227 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 }
2229 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2230 why = WHY_NOT;
2231 JUMPTO(b->b_handler);
2232 break;
2233 }
2234 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002235 (b->b_type == SETUP_EXCEPT &&
2236 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002237 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002238 PyObject *exc, *val, *tb;
2239 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002240 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 val = Py_None;
2242 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002243 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002244 /* Make the raw exception data
2245 available to the handler,
2246 so a program can emulate the
2247 Python main loop. Don't do
2248 this for 'finally'. */
2249 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002250 PyErr_NormalizeException(
2251 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002252 set_exc_info(tstate,
2253 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002254 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002255 if (tb == NULL) {
2256 Py_INCREF(Py_None);
2257 PUSH(Py_None);
2258 } else
2259 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 PUSH(val);
2261 PUSH(exc);
2262 }
2263 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002264 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002265 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002266 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002267 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002268 PUSH(v);
2269 }
2270 why = WHY_NOT;
2271 JUMPTO(b->b_handler);
2272 break;
2273 }
2274 } /* unwind stack */
2275
2276 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002277
Guido van Rossum374a9221991-04-04 10:40:29 +00002278 if (why != WHY_NOT)
2279 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002280
Guido van Rossum374a9221991-04-04 10:40:29 +00002281 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002282
Guido van Rossum35974fb2001-12-06 21:28:18 +00002283 if (why != WHY_YIELD) {
2284 /* Pop remaining stack entries -- but when yielding */
2285 while (!EMPTY()) {
2286 v = POP();
2287 Py_XDECREF(v);
2288 }
2289 }
2290
Tim Peters5ca576e2001-06-18 22:08:13 +00002291 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002292 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002293
Fred Drake9e3ad782001-07-03 23:39:52 +00002294 if (tstate->use_tracing) {
2295 if (tstate->c_tracefunc
2296 && (why == WHY_RETURN || why == WHY_YIELD)) {
2297 if (call_trace(tstate->c_tracefunc,
2298 tstate->c_traceobj, f,
2299 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002300 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002301 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002302 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002303 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002304 }
Fred Drake8f51f542001-10-04 14:48:42 +00002305 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002306 if (why == WHY_EXCEPTION)
2307 call_trace_protected(tstate->c_profilefunc,
2308 tstate->c_profileobj, f,
2309 PyTrace_RETURN);
2310 else if (call_trace(tstate->c_profilefunc,
2311 tstate->c_profileobj, f,
2312 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002313 Py_XDECREF(retval);
2314 retval = NULL;
2315 why = WHY_EXCEPTION;
2316 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002317 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002318 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002319
Guido van Rossuma027efa1997-05-05 20:56:21 +00002320 reset_exc_info(tstate);
2321
Tim Peters5ca576e2001-06-18 22:08:13 +00002322 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002323 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002324 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002325
Guido van Rossum96a42c81992-01-12 02:29:51 +00002326 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002327}
2328
Tim Peters6d6c1a32001-08-02 04:15:00 +00002329PyObject *
2330PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002331 PyObject **args, int argcount, PyObject **kws, int kwcount,
2332 PyObject **defs, int defcount, PyObject *closure)
2333{
2334 register PyFrameObject *f;
2335 register PyObject *retval = NULL;
2336 register PyObject **fastlocals, **freevars;
2337 PyThreadState *tstate = PyThreadState_GET();
2338 PyObject *x, *u;
2339
2340 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002341 PyErr_SetString(PyExc_SystemError,
2342 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002343 return NULL;
2344 }
2345
2346 f = PyFrame_New(tstate, /*back*/
2347 co, /*code*/
2348 globals, locals);
2349 if (f == NULL)
2350 return NULL;
2351
2352 fastlocals = f->f_localsplus;
2353 freevars = f->f_localsplus + f->f_nlocals;
2354
2355 if (co->co_argcount > 0 ||
2356 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2357 int i;
2358 int n = argcount;
2359 PyObject *kwdict = NULL;
2360 if (co->co_flags & CO_VARKEYWORDS) {
2361 kwdict = PyDict_New();
2362 if (kwdict == NULL)
2363 goto fail;
2364 i = co->co_argcount;
2365 if (co->co_flags & CO_VARARGS)
2366 i++;
2367 SETLOCAL(i, kwdict);
2368 }
2369 if (argcount > co->co_argcount) {
2370 if (!(co->co_flags & CO_VARARGS)) {
2371 PyErr_Format(PyExc_TypeError,
2372 "%.200s() takes %s %d "
2373 "%sargument%s (%d given)",
2374 PyString_AsString(co->co_name),
2375 defcount ? "at most" : "exactly",
2376 co->co_argcount,
2377 kwcount ? "non-keyword " : "",
2378 co->co_argcount == 1 ? "" : "s",
2379 argcount);
2380 goto fail;
2381 }
2382 n = co->co_argcount;
2383 }
2384 for (i = 0; i < n; i++) {
2385 x = args[i];
2386 Py_INCREF(x);
2387 SETLOCAL(i, x);
2388 }
2389 if (co->co_flags & CO_VARARGS) {
2390 u = PyTuple_New(argcount - n);
2391 if (u == NULL)
2392 goto fail;
2393 SETLOCAL(co->co_argcount, u);
2394 for (i = n; i < argcount; i++) {
2395 x = args[i];
2396 Py_INCREF(x);
2397 PyTuple_SET_ITEM(u, i-n, x);
2398 }
2399 }
2400 for (i = 0; i < kwcount; i++) {
2401 PyObject *keyword = kws[2*i];
2402 PyObject *value = kws[2*i + 1];
2403 int j;
2404 if (keyword == NULL || !PyString_Check(keyword)) {
2405 PyErr_Format(PyExc_TypeError,
2406 "%.200s() keywords must be strings",
2407 PyString_AsString(co->co_name));
2408 goto fail;
2409 }
2410 /* XXX slow -- speed up using dictionary? */
2411 for (j = 0; j < co->co_argcount; j++) {
2412 PyObject *nm = PyTuple_GET_ITEM(
2413 co->co_varnames, j);
2414 int cmp = PyObject_RichCompareBool(
2415 keyword, nm, Py_EQ);
2416 if (cmp > 0)
2417 break;
2418 else if (cmp < 0)
2419 goto fail;
2420 }
2421 /* Check errors from Compare */
2422 if (PyErr_Occurred())
2423 goto fail;
2424 if (j >= co->co_argcount) {
2425 if (kwdict == NULL) {
2426 PyErr_Format(PyExc_TypeError,
2427 "%.200s() got an unexpected "
2428 "keyword argument '%.400s'",
2429 PyString_AsString(co->co_name),
2430 PyString_AsString(keyword));
2431 goto fail;
2432 }
2433 PyDict_SetItem(kwdict, keyword, value);
2434 }
2435 else {
2436 if (GETLOCAL(j) != NULL) {
2437 PyErr_Format(PyExc_TypeError,
2438 "%.200s() got multiple "
2439 "values for keyword "
2440 "argument '%.400s'",
2441 PyString_AsString(co->co_name),
2442 PyString_AsString(keyword));
2443 goto fail;
2444 }
2445 Py_INCREF(value);
2446 SETLOCAL(j, value);
2447 }
2448 }
2449 if (argcount < co->co_argcount) {
2450 int m = co->co_argcount - defcount;
2451 for (i = argcount; i < m; i++) {
2452 if (GETLOCAL(i) == NULL) {
2453 PyErr_Format(PyExc_TypeError,
2454 "%.200s() takes %s %d "
2455 "%sargument%s (%d given)",
2456 PyString_AsString(co->co_name),
2457 ((co->co_flags & CO_VARARGS) ||
2458 defcount) ? "at least"
2459 : "exactly",
2460 m, kwcount ? "non-keyword " : "",
2461 m == 1 ? "" : "s", i);
2462 goto fail;
2463 }
2464 }
2465 if (n > m)
2466 i = n - m;
2467 else
2468 i = 0;
2469 for (; i < defcount; i++) {
2470 if (GETLOCAL(m+i) == NULL) {
2471 PyObject *def = defs[i];
2472 Py_INCREF(def);
2473 SETLOCAL(m+i, def);
2474 }
2475 }
2476 }
2477 }
2478 else {
2479 if (argcount > 0 || kwcount > 0) {
2480 PyErr_Format(PyExc_TypeError,
2481 "%.200s() takes no arguments (%d given)",
2482 PyString_AsString(co->co_name),
2483 argcount + kwcount);
2484 goto fail;
2485 }
2486 }
2487 /* Allocate and initialize storage for cell vars, and copy free
2488 vars into frame. This isn't too efficient right now. */
2489 if (f->f_ncells) {
2490 int i = 0, j = 0, nargs, found;
2491 char *cellname, *argname;
2492 PyObject *c;
2493
2494 nargs = co->co_argcount;
2495 if (co->co_flags & CO_VARARGS)
2496 nargs++;
2497 if (co->co_flags & CO_VARKEYWORDS)
2498 nargs++;
2499
2500 /* Check for cells that shadow args */
2501 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2502 cellname = PyString_AS_STRING(
2503 PyTuple_GET_ITEM(co->co_cellvars, i));
2504 found = 0;
2505 while (j < nargs) {
2506 argname = PyString_AS_STRING(
2507 PyTuple_GET_ITEM(co->co_varnames, j));
2508 if (strcmp(cellname, argname) == 0) {
2509 c = PyCell_New(GETLOCAL(j));
2510 if (c == NULL)
2511 goto fail;
2512 GETLOCAL(f->f_nlocals + i) = c;
2513 found = 1;
2514 break;
2515 }
2516 j++;
2517 }
2518 if (found == 0) {
2519 c = PyCell_New(NULL);
2520 if (c == NULL)
2521 goto fail;
2522 SETLOCAL(f->f_nlocals + i, c);
2523 }
2524 }
2525 /* Initialize any that are left */
2526 while (i < f->f_ncells) {
2527 c = PyCell_New(NULL);
2528 if (c == NULL)
2529 goto fail;
2530 SETLOCAL(f->f_nlocals + i, c);
2531 i++;
2532 }
2533 }
2534 if (f->f_nfreevars) {
2535 int i;
2536 for (i = 0; i < f->f_nfreevars; ++i) {
2537 PyObject *o = PyTuple_GET_ITEM(closure, i);
2538 Py_INCREF(o);
2539 freevars[f->f_ncells + i] = o;
2540 }
2541 }
2542
Tim Peters5ca576e2001-06-18 22:08:13 +00002543 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002544 /* Don't need to keep the reference to f_back, it will be set
2545 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002546 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002547 f->f_back = NULL;
2548
2549 /* Create a new generator that owns the ready to run frame
2550 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002551 return gen_new(f);
2552 }
2553
2554 retval = eval_frame(f);
2555
2556 fail: /* Jump here from prelude on failure */
2557
Tim Petersb13680b2001-11-27 23:29:29 +00002558 /* decref'ing the frame can cause __del__ methods to get invoked,
2559 which can call back into Python. While we're done with the
2560 current Python frame (f), the associated C stack is still in use,
2561 so recursion_depth must be boosted for the duration.
2562 */
2563 assert(tstate != NULL);
2564 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002565 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002566 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002567 return retval;
2568}
2569
2570
Guido van Rossuma027efa1997-05-05 20:56:21 +00002571static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002572set_exc_info(PyThreadState *tstate,
2573 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002574{
2575 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002576 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002577
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578 frame = tstate->frame;
2579 if (frame->f_exc_type == NULL) {
2580 /* This frame didn't catch an exception before */
2581 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002582 if (tstate->exc_type == NULL) {
2583 Py_INCREF(Py_None);
2584 tstate->exc_type = Py_None;
2585 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002586 tmp_type = frame->f_exc_type;
2587 tmp_value = frame->f_exc_value;
2588 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002589 Py_XINCREF(tstate->exc_type);
2590 Py_XINCREF(tstate->exc_value);
2591 Py_XINCREF(tstate->exc_traceback);
2592 frame->f_exc_type = tstate->exc_type;
2593 frame->f_exc_value = tstate->exc_value;
2594 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002595 Py_XDECREF(tmp_type);
2596 Py_XDECREF(tmp_value);
2597 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002598 }
2599 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002600 tmp_type = tstate->exc_type;
2601 tmp_value = tstate->exc_value;
2602 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002603 Py_XINCREF(type);
2604 Py_XINCREF(value);
2605 Py_XINCREF(tb);
2606 tstate->exc_type = type;
2607 tstate->exc_value = value;
2608 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002609 Py_XDECREF(tmp_type);
2610 Py_XDECREF(tmp_value);
2611 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002612 /* For b/w compatibility */
2613 PySys_SetObject("exc_type", type);
2614 PySys_SetObject("exc_value", value);
2615 PySys_SetObject("exc_traceback", tb);
2616}
2617
2618static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002619reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002620{
2621 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002622 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002623 frame = tstate->frame;
2624 if (frame->f_exc_type != NULL) {
2625 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002626 tmp_type = tstate->exc_type;
2627 tmp_value = tstate->exc_value;
2628 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002629 Py_XINCREF(frame->f_exc_type);
2630 Py_XINCREF(frame->f_exc_value);
2631 Py_XINCREF(frame->f_exc_traceback);
2632 tstate->exc_type = frame->f_exc_type;
2633 tstate->exc_value = frame->f_exc_value;
2634 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002635 Py_XDECREF(tmp_type);
2636 Py_XDECREF(tmp_value);
2637 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002638 /* For b/w compatibility */
2639 PySys_SetObject("exc_type", frame->f_exc_type);
2640 PySys_SetObject("exc_value", frame->f_exc_value);
2641 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2642 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002643 tmp_type = frame->f_exc_type;
2644 tmp_value = frame->f_exc_value;
2645 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002646 frame->f_exc_type = NULL;
2647 frame->f_exc_value = NULL;
2648 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002649 Py_XDECREF(tmp_type);
2650 Py_XDECREF(tmp_value);
2651 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002652}
2653
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002654/* Logic for the raise statement (too complicated for inlining).
2655 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002656static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002657do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002658{
Guido van Rossumd295f121998-04-09 21:39:57 +00002659 if (type == NULL) {
2660 /* Reraise */
2661 PyThreadState *tstate = PyThreadState_Get();
2662 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2663 value = tstate->exc_value;
2664 tb = tstate->exc_traceback;
2665 Py_XINCREF(type);
2666 Py_XINCREF(value);
2667 Py_XINCREF(tb);
2668 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002669
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002670 /* We support the following forms of raise:
2671 raise <class>, <classinstance>
2672 raise <class>, <argument tuple>
2673 raise <class>, None
2674 raise <class>, <argument>
2675 raise <classinstance>, None
2676 raise <string>, <object>
2677 raise <string>, None
2678
2679 An omitted second argument is the same as None.
2680
2681 In addition, raise <tuple>, <anything> is the same as
2682 raising the tuple's first item (and it better have one!);
2683 this rule is applied recursively.
2684
2685 Finally, an optional third argument can be supplied, which
2686 gives the traceback to be substituted (useful when
2687 re-raising an exception after examining it). */
2688
2689 /* First, check the traceback argument, replacing None with
2690 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 if (tb == Py_None) {
2692 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 tb = NULL;
2694 }
2695 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002697 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002698 goto raise_error;
2699 }
2700
2701 /* Next, replace a missing value with None */
2702 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 value = Py_None;
2704 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002705 }
2706
2707 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2709 PyObject *tmp = type;
2710 type = PyTuple_GET_ITEM(type, 0);
2711 Py_INCREF(type);
2712 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 }
2714
Tim Petersafb2c802002-04-18 18:06:20 +00002715 if (PyString_CheckExact(type))
2716 /* Raising builtin string is deprecated but still allowed --
2717 * do nothing. Raising an instance of a new-style str
2718 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002719 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002720
2721 else if (PyClass_Check(type))
2722 PyErr_NormalizeException(&type, &value, &tb);
2723
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002725 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 if (value != Py_None) {
2727 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002728 "instance exception may not have a separate value");
2729 goto raise_error;
2730 }
2731 else {
2732 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002733 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002734 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2736 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002737 }
2738 }
2739 else {
2740 /* Not something you can raise. You get an exception
2741 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002742 PyErr_Format(PyExc_TypeError,
2743 "exceptions must be strings, classes, or "
2744 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002745 goto raise_error;
2746 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002748 if (tb == NULL)
2749 return WHY_EXCEPTION;
2750 else
2751 return WHY_RERAISE;
2752 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002753 Py_XDECREF(value);
2754 Py_XDECREF(type);
2755 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002756 return WHY_EXCEPTION;
2757}
2758
Tim Petersd6d010b2001-06-21 02:49:55 +00002759/* Iterate v argcnt times and store the results on the stack (via decreasing
2760 sp). Return 1 for success, 0 if error. */
2761
Barry Warsawe42b18f1997-08-25 22:13:04 +00002762static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002763unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002764{
Tim Petersd6d010b2001-06-21 02:49:55 +00002765 int i = 0;
2766 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002767 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002768
Tim Petersd6d010b2001-06-21 02:49:55 +00002769 assert(v != NULL);
2770
2771 it = PyObject_GetIter(v);
2772 if (it == NULL)
2773 goto Error;
2774
2775 for (; i < argcnt; i++) {
2776 w = PyIter_Next(it);
2777 if (w == NULL) {
2778 /* Iterator done, via error or exhaustion. */
2779 if (!PyErr_Occurred()) {
2780 PyErr_Format(PyExc_ValueError,
2781 "need more than %d value%s to unpack",
2782 i, i == 1 ? "" : "s");
2783 }
2784 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002785 }
2786 *--sp = w;
2787 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002788
2789 /* We better have exhausted the iterator now. */
2790 w = PyIter_Next(it);
2791 if (w == NULL) {
2792 if (PyErr_Occurred())
2793 goto Error;
2794 Py_DECREF(it);
2795 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002796 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002797 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002798 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002799 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002800Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002801 for (; i > 0; i--, sp++)
2802 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002803 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002804 return 0;
2805}
2806
2807
Guido van Rossum96a42c81992-01-12 02:29:51 +00002808#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002809static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002810prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002812 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002813 if (PyObject_Print(v, stdout, 0) != 0)
2814 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002815 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002816 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002818#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002820static void
Fred Drake5755ce62001-06-27 19:19:46 +00002821call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822{
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002824 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002826 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 value = Py_None;
2828 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002829 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002830 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002831 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002833 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002834 }
Fred Drake5755ce62001-06-27 19:19:46 +00002835 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002836 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002837 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002839 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 Py_XDECREF(type);
2841 Py_XDECREF(value);
2842 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002843 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002844}
2845
Fred Drake4ec5d562001-10-04 19:26:43 +00002846static void
2847call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2848 int what)
2849{
2850 PyObject *type, *value, *traceback;
2851 int err;
2852 PyErr_Fetch(&type, &value, &traceback);
2853 err = call_trace(func, obj, frame, what, NULL);
2854 if (err == 0)
2855 PyErr_Restore(type, value, traceback);
2856 else {
2857 Py_XDECREF(type);
2858 Py_XDECREF(value);
2859 Py_XDECREF(traceback);
2860 }
2861}
2862
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002863static int
Fred Drake5755ce62001-06-27 19:19:46 +00002864call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2865 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002866{
Fred Drake5755ce62001-06-27 19:19:46 +00002867 register PyThreadState *tstate = frame->f_tstate;
2868 int result;
2869 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002870 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002871 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002872 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002873 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002874 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2875 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002876 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002877 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002878}
2879
Michael W. Hudson006c7522002-11-08 13:08:46 +00002880static int
Michael W. Hudson019a78e2002-11-08 12:53:11 +00002881maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002882 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2883{
2884 /* The theory of SET_LINENO-less tracing.
2885
2886 In a nutshell, we use the co_lnotab field of the code object
2887 to tell when execution has moved onto a different line.
2888
2889 As mentioned above, the basic idea is so set things up so
2890 that
2891
2892 *instr_lb <= frame->f_lasti < *instr_ub
2893
2894 is true so long as execution does not change lines.
2895
2896 This is all fairly simple. Digging the information out of
2897 co_lnotab takes some work, but is conceptually clear.
2898
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002899 Somewhat harder to explain is why we don't *always* call the
2900 line trace function when the above test fails.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002901
2902 Consider this code:
2903
2904 1: def f(a):
2905 2: if a:
2906 3: print 1
2907 4: else:
2908 5: print 2
2909
2910 which compiles to this:
2911
2912 2 0 LOAD_FAST 0 (a)
2913 3 JUMP_IF_FALSE 9 (to 15)
2914 6 POP_TOP
2915
2916 3 7 LOAD_CONST 1 (1)
2917 10 PRINT_ITEM
2918 11 PRINT_NEWLINE
2919 12 JUMP_FORWARD 6 (to 21)
2920 >> 15 POP_TOP
2921
2922 5 16 LOAD_CONST 2 (2)
2923 19 PRINT_ITEM
2924 20 PRINT_NEWLINE
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002925 >> 21 LOAD_CONST 0 (None)
2926 24 RETURN_VALUE
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002927
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002928 If 'a' is false, execution will jump to instruction at offset
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002929 15 and the co_lnotab will claim that execution has moved to
2930 line 3. This is at best misleading. In this case we could
2931 associate the POP_TOP with line 4, but that doesn't make
2932 sense in all cases (I think).
2933
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002934 What we do is only call the line trace function if the co_lnotab
2935 indicates we have jumped to the *start* of a line, i.e. if the
2936 current instruction offset matches the offset given for the
2937 start of a line by the co_lnotab.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002938
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002939 This also takes care of the situation where 'a' is true.
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002940 Execution will jump from instruction offset 12 to offset 21.
2941 Then the co_lnotab would imply that execution has moved to line
2942 5, which is again misleading.
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002943
2944 Why do we set f_lineno when tracing? Well, consider the code
2945 above when 'a' is true. If stepping through this with 'n' in
2946 pdb, you would stop at line 1 with a "call" type event, then
2947 line events on lines 2 and 3, then a "return" type event -- but
2948 you would be shown line 5 during this event. This is a change
2949 from the behaviour in 2.2 and before, and I've found it
2950 confusing in practice. By setting and using f_lineno when
2951 tracing, one can report a line number different from that
2952 suggested by f_lasti on this one occasion where it's desirable.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002953 */
2954
Michael W. Hudson006c7522002-11-08 13:08:46 +00002955 int result = 0;
2956
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002957 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002958 PyCodeObject* co = frame->f_code;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002959 int size, addr, line;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002960 unsigned char* p;
2961
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002962 size = PyString_GET_SIZE(co->co_lnotab) / 2;
2963 p = (unsigned char*)PyString_AS_STRING(co->co_lnotab);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002964
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002965 addr = 0;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002966 line = co->co_firstlineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002967
2968 /* possible optimization: if f->f_lasti == instr_ub
2969 (likely to be a common case) then we already know
2970 instr_lb -- if we stored the matching value of p
2971 somwhere we could skip the first while loop. */
2972
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002973 /* see comments in compile.c for the description of
2974 co_lnotab. A point to remember: increments to p
2975 should come in pairs -- although we don't care about
2976 the line increments here, treating them as byte
2977 increments gets confusing, to say the least. */
2978
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002979 while (size > 0) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002980 if (addr + *p > frame->f_lasti)
2981 break;
2982 addr += *p++;
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002983 if (*p) *instr_lb = addr;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002984 line += *p++;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002985 --size;
2986 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002987
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002988 if (addr == frame->f_lasti) {
2989 frame->f_lineno = line;
Michael W. Hudson006c7522002-11-08 13:08:46 +00002990 result = call_trace(func, obj, frame,
2991 PyTrace_LINE, Py_None);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002992 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002993
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002994 if (size > 0) {
2995 while (--size >= 0) {
2996 addr += *p++;
2997 if (*p++)
2998 break;
2999 }
3000 *instr_ub = addr;
3001 }
3002 else {
3003 *instr_ub = INT_MAX;
3004 }
3005 }
Michael W. Hudson006c7522002-11-08 13:08:46 +00003006
3007 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003008}
3009
Fred Drake5755ce62001-06-27 19:19:46 +00003010void
3011PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003012{
Fred Drake5755ce62001-06-27 19:19:46 +00003013 PyThreadState *tstate = PyThreadState_Get();
3014 PyObject *temp = tstate->c_profileobj;
3015 Py_XINCREF(arg);
3016 tstate->c_profilefunc = NULL;
3017 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003018 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003019 Py_XDECREF(temp);
3020 tstate->c_profilefunc = func;
3021 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003022 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003023}
3024
3025void
3026PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3027{
3028 PyThreadState *tstate = PyThreadState_Get();
3029 PyObject *temp = tstate->c_traceobj;
3030 Py_XINCREF(arg);
3031 tstate->c_tracefunc = NULL;
3032 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003033 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003034 Py_XDECREF(temp);
3035 tstate->c_tracefunc = func;
3036 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003037 tstate->use_tracing = ((func != NULL)
3038 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003039}
3040
Guido van Rossumb209a111997-04-29 18:18:01 +00003041PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003042PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003043{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003044 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003045 if (current_frame == NULL)
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003046 return PyThreadState_Get()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003047 else
3048 return current_frame->f_builtins;
3049}
3050
Guido van Rossumb209a111997-04-29 18:18:01 +00003051PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003052PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003053{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003054 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003055 if (current_frame == NULL)
3056 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003057 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003058 return current_frame->f_locals;
3059}
3060
Guido van Rossumb209a111997-04-29 18:18:01 +00003061PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003062PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003063{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003064 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003065 if (current_frame == NULL)
3066 return NULL;
3067 else
3068 return current_frame->f_globals;
3069}
3070
Guido van Rossumb209a111997-04-29 18:18:01 +00003071PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003072PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003073{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003074 PyThreadState *tstate = PyThreadState_Get();
3075 return _PyThreadState_GetFrame((PyObject *)tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003076}
3077
Guido van Rossum6135a871995-01-09 17:53:26 +00003078int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003079PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003080{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003081 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003082 return current_frame == NULL ? 0 : current_frame->f_restricted;
3083}
3084
Guido van Rossumbe270261997-05-22 22:26:18 +00003085int
Tim Peters5ba58662001-07-16 02:29:45 +00003086PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003087{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003088 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Tim Peters5ba58662001-07-16 02:29:45 +00003089 int result = 0;
3090
3091 if (current_frame != NULL) {
3092 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003093 const int compilerflags = codeflags & PyCF_MASK;
3094 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003095 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003096 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003097 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003098#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003099 if (codeflags & CO_GENERATOR_ALLOWED) {
3100 result = 1;
3101 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3102 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003103#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003104 }
3105 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003106}
3107
3108int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003109Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110{
Guido van Rossumb209a111997-04-29 18:18:01 +00003111 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003112 if (f == NULL)
3113 return 0;
3114 if (!PyFile_SoftSpace(f, 0))
3115 return 0;
3116 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117}
3118
Guido van Rossum3f5da241990-12-20 15:06:42 +00003119
Guido van Rossum681d79a1995-07-18 14:51:37 +00003120/* External interface to call any callable object.
3121 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003122
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003123#undef PyEval_CallObject
3124/* for backward compatibility: export this interface */
3125
Guido van Rossumb209a111997-04-29 18:18:01 +00003126PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003127PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003128{
Guido van Rossumb209a111997-04-29 18:18:01 +00003129 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003130}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003131#define PyEval_CallObject(func,arg) \
3132 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003133
Guido van Rossumb209a111997-04-29 18:18:01 +00003134PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003135PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003136{
Jeremy Hylton52820442001-01-03 23:52:36 +00003137 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003138
3139 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003140 arg = PyTuple_New(0);
3141 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003142 PyErr_SetString(PyExc_TypeError,
3143 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003144 return NULL;
3145 }
3146 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003147 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003148
Guido van Rossumb209a111997-04-29 18:18:01 +00003149 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003150 PyErr_SetString(PyExc_TypeError,
3151 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003152 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003153 return NULL;
3154 }
3155
Tim Peters6d6c1a32001-08-02 04:15:00 +00003156 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003157 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003158 return result;
3159}
3160
Tim Peters6d6c1a32001-08-02 04:15:00 +00003161char *
3162PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003163{
3164 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003165 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003166 else if (PyFunction_Check(func))
3167 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3168 else if (PyCFunction_Check(func))
3169 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3170 else if (PyClass_Check(func))
3171 return PyString_AsString(((PyClassObject*)func)->cl_name);
3172 else if (PyInstance_Check(func)) {
3173 return PyString_AsString(
3174 ((PyInstanceObject*)func)->in_class->cl_name);
3175 } else {
3176 return func->ob_type->tp_name;
3177 }
3178}
3179
Tim Peters6d6c1a32001-08-02 04:15:00 +00003180char *
3181PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003182{
3183 if (PyMethod_Check(func))
3184 return "()";
3185 else if (PyFunction_Check(func))
3186 return "()";
3187 else if (PyCFunction_Check(func))
3188 return "()";
3189 else if (PyClass_Check(func))
3190 return " constructor";
3191 else if (PyInstance_Check(func)) {
3192 return " instance";
3193 } else {
3194 return " object";
3195 }
3196}
3197
Jeremy Hylton52820442001-01-03 23:52:36 +00003198#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3199
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003200static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003201err_args(PyObject *func, int flags, int nargs)
3202{
3203 if (flags & METH_NOARGS)
3204 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003205 "%.200s() takes no arguments (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003206 ((PyCFunctionObject *)func)->m_ml->ml_name,
3207 nargs);
3208 else
3209 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003210 "%.200s() takes exactly one argument (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003211 ((PyCFunctionObject *)func)->m_ml->ml_name,
3212 nargs);
3213}
3214
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003215static PyObject *
3216call_function(PyObject ***pp_stack, int oparg)
3217{
3218 int na = oparg & 0xff;
3219 int nk = (oparg>>8) & 0xff;
3220 int n = na + 2 * nk;
3221 PyObject **pfunc = (*pp_stack) - n - 1;
3222 PyObject *func = *pfunc;
3223 PyObject *x, *w;
3224
3225 /* Always dispatch PyCFunction first, because
3226 these are presumed to be the most frequent
3227 callable object.
3228 */
3229 if (PyCFunction_Check(func) && nk == 0) {
3230 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003231 if (flags & (METH_NOARGS | METH_O)) {
3232 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3233 PyObject *self = PyCFunction_GET_SELF(func);
3234 if (flags & METH_NOARGS && na == 0)
3235 x = (*meth)(self, NULL);
3236 else if (flags & METH_O && na == 1) {
3237 PyObject *arg = EXT_POP(*pp_stack);
3238 x = (*meth)(self, arg);
3239 Py_DECREF(arg);
3240 }
3241 else {
3242 err_args(func, flags, na);
3243 x = NULL;
3244 }
3245 }
3246 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003247 PyObject *callargs;
3248 callargs = load_args(pp_stack, na);
3249 x = PyCFunction_Call(func, callargs, NULL);
3250 Py_XDECREF(callargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003251 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003252 } else {
3253 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3254 /* optimize access to bound methods */
3255 PyObject *self = PyMethod_GET_SELF(func);
3256 Py_INCREF(self);
3257 func = PyMethod_GET_FUNCTION(func);
3258 Py_INCREF(func);
3259 Py_DECREF(*pfunc);
3260 *pfunc = self;
3261 na++;
3262 n++;
3263 } else
3264 Py_INCREF(func);
3265 if (PyFunction_Check(func))
3266 x = fast_function(func, pp_stack, n, na, nk);
3267 else
3268 x = do_call(func, pp_stack, na, nk);
3269 Py_DECREF(func);
3270 }
3271
3272 while ((*pp_stack) > pfunc) {
3273 w = EXT_POP(*pp_stack);
3274 Py_DECREF(w);
3275 }
3276 return x;
3277}
3278
Jeremy Hylton192690e2002-08-16 18:36:11 +00003279/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003280 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton52820442001-01-03 23:52:36 +00003281*/
3282
3283static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003284fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003285{
3286 PyObject *co = PyFunction_GET_CODE(func);
3287 PyObject *globals = PyFunction_GET_GLOBALS(func);
3288 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003289 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003290 PyObject **d = NULL;
3291 int nd = 0;
3292
3293 if (argdefs != NULL) {
3294 d = &PyTuple_GET_ITEM(argdefs, 0);
3295 nd = ((PyTupleObject *)argdefs)->ob_size;
3296 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003297 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003298 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003299 (*pp_stack)-2*nk, nk, d, nd,
3300 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003301}
3302
3303static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003304update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3305 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003306{
3307 PyObject *kwdict = NULL;
3308 if (orig_kwdict == NULL)
3309 kwdict = PyDict_New();
3310 else {
3311 kwdict = PyDict_Copy(orig_kwdict);
3312 Py_DECREF(orig_kwdict);
3313 }
3314 if (kwdict == NULL)
3315 return NULL;
3316 while (--nk >= 0) {
3317 int err;
3318 PyObject *value = EXT_POP(*pp_stack);
3319 PyObject *key = EXT_POP(*pp_stack);
3320 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003321 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003322 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003323 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003324 PyEval_GetFuncName(func),
3325 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003326 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003327 Py_DECREF(key);
3328 Py_DECREF(value);
3329 Py_DECREF(kwdict);
3330 return NULL;
3331 }
3332 err = PyDict_SetItem(kwdict, key, value);
3333 Py_DECREF(key);
3334 Py_DECREF(value);
3335 if (err) {
3336 Py_DECREF(kwdict);
3337 return NULL;
3338 }
3339 }
3340 return kwdict;
3341}
3342
3343static PyObject *
3344update_star_args(int nstack, int nstar, PyObject *stararg,
3345 PyObject ***pp_stack)
3346{
3347 PyObject *callargs, *w;
3348
3349 callargs = PyTuple_New(nstack + nstar);
3350 if (callargs == NULL) {
3351 return NULL;
3352 }
3353 if (nstar) {
3354 int i;
3355 for (i = 0; i < nstar; i++) {
3356 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3357 Py_INCREF(a);
3358 PyTuple_SET_ITEM(callargs, nstack + i, a);
3359 }
3360 }
3361 while (--nstack >= 0) {
3362 w = EXT_POP(*pp_stack);
3363 PyTuple_SET_ITEM(callargs, nstack, w);
3364 }
3365 return callargs;
3366}
3367
3368static PyObject *
3369load_args(PyObject ***pp_stack, int na)
3370{
3371 PyObject *args = PyTuple_New(na);
3372 PyObject *w;
3373
3374 if (args == NULL)
3375 return NULL;
3376 while (--na >= 0) {
3377 w = EXT_POP(*pp_stack);
3378 PyTuple_SET_ITEM(args, na, w);
3379 }
3380 return args;
3381}
3382
3383static PyObject *
3384do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3385{
3386 PyObject *callargs = NULL;
3387 PyObject *kwdict = NULL;
3388 PyObject *result = NULL;
3389
3390 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003391 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003392 if (kwdict == NULL)
3393 goto call_fail;
3394 }
3395 callargs = load_args(pp_stack, na);
3396 if (callargs == NULL)
3397 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003398 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003399 call_fail:
3400 Py_XDECREF(callargs);
3401 Py_XDECREF(kwdict);
3402 return result;
3403}
3404
3405static PyObject *
3406ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3407{
3408 int nstar = 0;
3409 PyObject *callargs = NULL;
3410 PyObject *stararg = NULL;
3411 PyObject *kwdict = NULL;
3412 PyObject *result = NULL;
3413
3414 if (flags & CALL_FLAG_KW) {
3415 kwdict = EXT_POP(*pp_stack);
3416 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003417 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003418 "%s%s argument after ** "
3419 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003420 PyEval_GetFuncName(func),
3421 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003422 goto ext_call_fail;
3423 }
3424 }
3425 if (flags & CALL_FLAG_VAR) {
3426 stararg = EXT_POP(*pp_stack);
3427 if (!PyTuple_Check(stararg)) {
3428 PyObject *t = NULL;
3429 t = PySequence_Tuple(stararg);
3430 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003431 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3432 PyErr_Format(PyExc_TypeError,
3433 "%s%s argument after * "
3434 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003435 PyEval_GetFuncName(func),
3436 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003437 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003438 goto ext_call_fail;
3439 }
3440 Py_DECREF(stararg);
3441 stararg = t;
3442 }
3443 nstar = PyTuple_GET_SIZE(stararg);
3444 }
3445 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003446 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003447 if (kwdict == NULL)
3448 goto ext_call_fail;
3449 }
3450 callargs = update_star_args(na, nstar, stararg, pp_stack);
3451 if (callargs == NULL)
3452 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003453 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003454 ext_call_fail:
3455 Py_XDECREF(callargs);
3456 Py_XDECREF(kwdict);
3457 Py_XDECREF(stararg);
3458 return result;
3459}
3460
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003461#define SLICE_ERROR_MSG \
3462 "standard sequence type does not support step size other than one"
3463
Tim Peterscb479e72001-12-16 19:11:44 +00003464/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3465 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3466 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3467*/
Tim Petersb5196382001-12-16 19:44:20 +00003468/* Note: If v is NULL, return success without storing into *pi. This
3469 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3470 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003471*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003472int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003473_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474{
Tim Petersb5196382001-12-16 19:44:20 +00003475 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003476 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003477 if (PyInt_Check(v)) {
3478 x = PyInt_AsLong(v);
3479 } else if (PyLong_Check(v)) {
3480 x = PyLong_AsLong(v);
3481 if (x==-1 && PyErr_Occurred()) {
3482 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003483 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003484
Guido van Rossumac7be682001-01-17 15:42:30 +00003485 if (!PyErr_ExceptionMatches(
3486 PyExc_OverflowError)) {
3487 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003488 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003489 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003490 }
3491
Guido van Rossumac7be682001-01-17 15:42:30 +00003492 /* Clear the OverflowError */
3493 PyErr_Clear();
3494
3495 /* It's an overflow error, so we need to
3496 check the sign of the long integer,
3497 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003498 the error. */
3499
3500 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003501 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003502 if (long_zero == NULL)
3503 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003504
3505 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003506 cmp = PyObject_RichCompareBool(v, long_zero,
3507 Py_GT);
3508 Py_DECREF(long_zero);
3509 if (cmp < 0)
3510 return 0;
3511 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003512 x = INT_MAX;
3513 else
3514 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003515 }
3516 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003517 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003518 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003519 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003521 /* Truncate -- very long indices are truncated anyway */
3522 if (x > INT_MAX)
3523 x = INT_MAX;
3524 else if (x < -INT_MAX)
Michael W. Hudsoncbd6fb92002-11-06 15:17:32 +00003525 x = -INT_MAX;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003526 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003528 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529}
3530
Guido van Rossum50d756e2001-08-18 17:43:36 +00003531#undef ISINT
3532#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3533
Guido van Rossumb209a111997-04-29 18:18:01 +00003534static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003535apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003536{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003537 PyTypeObject *tp = u->ob_type;
3538 PySequenceMethods *sq = tp->tp_as_sequence;
3539
3540 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3541 int ilow = 0, ihigh = INT_MAX;
3542 if (!_PyEval_SliceIndex(v, &ilow))
3543 return NULL;
3544 if (!_PyEval_SliceIndex(w, &ihigh))
3545 return NULL;
3546 return PySequence_GetSlice(u, ilow, ihigh);
3547 }
3548 else {
3549 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003550 if (slice != NULL) {
3551 PyObject *res = PyObject_GetItem(u, slice);
3552 Py_DECREF(slice);
3553 return res;
3554 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003555 else
3556 return NULL;
3557 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003559
3560static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003561assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3562 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003563{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003564 PyTypeObject *tp = u->ob_type;
3565 PySequenceMethods *sq = tp->tp_as_sequence;
3566
3567 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3568 int ilow = 0, ihigh = INT_MAX;
3569 if (!_PyEval_SliceIndex(v, &ilow))
3570 return -1;
3571 if (!_PyEval_SliceIndex(w, &ihigh))
3572 return -1;
3573 if (x == NULL)
3574 return PySequence_DelSlice(u, ilow, ihigh);
3575 else
3576 return PySequence_SetSlice(u, ilow, ihigh, x);
3577 }
3578 else {
3579 PyObject *slice = PySlice_New(v, w, NULL);
3580 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003581 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003582 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003583 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003584 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003585 res = PyObject_DelItem(u, slice);
3586 Py_DECREF(slice);
3587 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003588 }
3589 else
3590 return -1;
3591 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003592}
3593
Guido van Rossumb209a111997-04-29 18:18:01 +00003594static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003595cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596{
Guido van Rossumac7be682001-01-17 15:42:30 +00003597 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003598 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003599 case PyCmp_IS:
3600 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003601 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003602 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003603 res = !res;
3604 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003605 case PyCmp_IN:
3606 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003607 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003608 if (res < 0)
3609 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003610 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003611 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003612 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003613 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003614 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003615 break;
3616 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003617 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003618 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003619 v = res ? Py_True : Py_False;
3620 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003621 return v;
3622}
3623
Thomas Wouters52152252000-08-17 22:55:00 +00003624static PyObject *
3625import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003626{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003627 PyObject *x;
3628
3629 x = PyObject_GetAttr(v, name);
3630 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003631 PyErr_Format(PyExc_ImportError,
3632 "cannot import name %.230s",
3633 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003634 }
Thomas Wouters52152252000-08-17 22:55:00 +00003635 return x;
3636}
Guido van Rossumac7be682001-01-17 15:42:30 +00003637
Thomas Wouters52152252000-08-17 22:55:00 +00003638static int
3639import_all_from(PyObject *locals, PyObject *v)
3640{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003641 PyObject *all = PyObject_GetAttrString(v, "__all__");
3642 PyObject *dict, *name, *value;
3643 int skip_leading_underscores = 0;
3644 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003645
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003646 if (all == NULL) {
3647 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3648 return -1; /* Unexpected error */
3649 PyErr_Clear();
3650 dict = PyObject_GetAttrString(v, "__dict__");
3651 if (dict == NULL) {
3652 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3653 return -1;
3654 PyErr_SetString(PyExc_ImportError,
3655 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003656 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003657 }
3658 all = PyMapping_Keys(dict);
3659 Py_DECREF(dict);
3660 if (all == NULL)
3661 return -1;
3662 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003663 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003664
3665 for (pos = 0, err = 0; ; pos++) {
3666 name = PySequence_GetItem(all, pos);
3667 if (name == NULL) {
3668 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3669 err = -1;
3670 else
3671 PyErr_Clear();
3672 break;
3673 }
3674 if (skip_leading_underscores &&
3675 PyString_Check(name) &&
3676 PyString_AS_STRING(name)[0] == '_')
3677 {
3678 Py_DECREF(name);
3679 continue;
3680 }
3681 value = PyObject_GetAttr(v, name);
3682 if (value == NULL)
3683 err = -1;
3684 else
3685 err = PyDict_SetItem(locals, name, value);
3686 Py_DECREF(name);
3687 Py_XDECREF(value);
3688 if (err != 0)
3689 break;
3690 }
3691 Py_DECREF(all);
3692 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003693}
3694
Guido van Rossumb209a111997-04-29 18:18:01 +00003695static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003696build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003697{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003698 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003699
3700 if (PyDict_Check(methods))
3701 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003702 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003703 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003704 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3705 base = PyTuple_GET_ITEM(bases, 0);
3706 metaclass = PyObject_GetAttrString(base, "__class__");
3707 if (metaclass == NULL) {
3708 PyErr_Clear();
3709 metaclass = (PyObject *)base->ob_type;
3710 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003711 }
3712 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003713 else {
3714 PyObject *g = PyEval_GetGlobals();
3715 if (g != NULL && PyDict_Check(g))
3716 metaclass = PyDict_GetItemString(g, "__metaclass__");
3717 if (metaclass == NULL)
3718 metaclass = (PyObject *) &PyClass_Type;
3719 Py_INCREF(metaclass);
3720 }
3721 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3722 Py_DECREF(metaclass);
3723 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003724}
3725
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003726static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003727exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3728 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003729{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003730 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003731 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003732 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003733
Guido van Rossumb209a111997-04-29 18:18:01 +00003734 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3735 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003736 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003737 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003738 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003739 locals = PyTuple_GetItem(prog, 2);
3740 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003741 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003742 if (globals == Py_None) {
3743 globals = PyEval_GetGlobals();
3744 if (locals == Py_None) {
3745 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003746 plain = 1;
3747 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003748 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003749 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003750 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003751 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003752 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003753 !PyCode_Check(prog) &&
3754 !PyFile_Check(prog)) {
3755 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003756 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003757 return -1;
3758 }
Fred Drake661ea262000-10-24 19:57:45 +00003759 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003760 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003761 "exec: arg 2 must be a dictionary or None");
3762 return -1;
3763 }
3764 if (!PyDict_Check(locals)) {
3765 PyErr_SetString(PyExc_TypeError,
3766 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003767 return -1;
3768 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003769 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003770 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003771 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003772 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3773 PyErr_SetString(PyExc_TypeError,
3774 "code object passed to exec may not contain free variables");
3775 return -1;
3776 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003777 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003778 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003779 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003780 FILE *fp = PyFile_AsFile(prog);
3781 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003782 PyCompilerFlags cf;
3783 cf.cf_flags = 0;
3784 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003785 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3786 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003787 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003788 v = PyRun_File(fp, name, Py_file_input, globals,
3789 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003790 }
3791 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003792 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003793 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003794 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003795 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003796 cf.cf_flags = 0;
3797 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003798 v = PyRun_StringFlags(str, Py_file_input, globals,
3799 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003800 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003801 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003802 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003803 if (plain)
3804 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003805 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003806 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003807 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003808 return 0;
3809}
Guido van Rossum24c13741995-02-14 09:42:43 +00003810
Guido van Rossumac7be682001-01-17 15:42:30 +00003811static void
Paul Prescode68140d2000-08-30 20:25:01 +00003812format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3813{
3814 char *obj_str;
3815
3816 if (!obj)
3817 return;
3818
3819 obj_str = PyString_AsString(obj);
3820 if (!obj_str)
3821 return;
3822
3823 PyErr_Format(exc, format_str, obj_str);
3824}
Guido van Rossum950361c1997-01-24 13:49:28 +00003825
3826#ifdef DYNAMIC_EXECUTION_PROFILE
3827
Skip Montanarof118cb12001-10-15 20:51:38 +00003828static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003829getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003830{
3831 int i;
3832 PyObject *l = PyList_New(256);
3833 if (l == NULL) return NULL;
3834 for (i = 0; i < 256; i++) {
3835 PyObject *x = PyInt_FromLong(a[i]);
3836 if (x == NULL) {
3837 Py_DECREF(l);
3838 return NULL;
3839 }
3840 PyList_SetItem(l, i, x);
3841 }
3842 for (i = 0; i < 256; i++)
3843 a[i] = 0;
3844 return l;
3845}
3846
3847PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003848_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003849{
3850#ifndef DXPAIRS
3851 return getarray(dxp);
3852#else
3853 int i;
3854 PyObject *l = PyList_New(257);
3855 if (l == NULL) return NULL;
3856 for (i = 0; i < 257; i++) {
3857 PyObject *x = getarray(dxpairs[i]);
3858 if (x == NULL) {
3859 Py_DECREF(l);
3860 return NULL;
3861 }
3862 PyList_SetItem(l, i, x);
3863 }
3864 return l;
3865#endif
3866}
3867
3868#endif