blob: 362cd0bce706ee96b5ed924777ff58ffc84b0b3c [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. Hudsondd32a912002-08-15 14:59:02 +000054static void maybe_call_line_trace(int, Py_tracefunc, PyObject *,
55 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 co = f->f_code;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000603 names = co->co_names;
604 consts = co->co_consts;
Tim Peters5ca576e2001-06-18 22:08:13 +0000605 fastlocals = f->f_localsplus;
606 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000607 _PyCode_GETCODEPTR(co, &first_instr);
Michael W. Hudson62897c52002-08-20 15:19:14 +0000608 /* An explanation is in order for the next line.
609
610 f->f_lasti now refers to the index of the last instruction
611 executed. You might think this was obvious from the name, but
612 this wasn't always true before 2.3! PyFrame_New now sets
Michael W. Hudsonc230b0e2002-08-20 15:43:16 +0000613 f->f_lasti to -1 (i.e. the index *before* the first instruction)
Michael W. Hudson62897c52002-08-20 15:19:14 +0000614 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
615 does work. Promise. */
616 next_instr = first_instr + f->f_lasti + 1;
Tim Peters8c963692001-06-23 05:26:56 +0000617 stack_pointer = f->f_stacktop;
618 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000619 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000620
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000621 if (tstate->use_tracing) {
622 if (tstate->c_tracefunc != NULL) {
623 /* tstate->c_tracefunc, if defined, is a
624 function that will be called on *every* entry
625 to a code block. Its return value, if not
626 None, is a function that will be called at
627 the start of each executed line of code.
628 (Actually, the function must return itself
629 in order to continue tracing.) The trace
630 functions are called with three arguments:
631 a pointer to the current frame, a string
632 indicating why the function is called, and
633 an argument which depends on the situation.
634 The global trace function is also called
635 whenever an exception is detected. */
636 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
637 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000638 /* Trace function raised an error */
639 return NULL;
640 }
641 }
642 if (tstate->c_profilefunc != NULL) {
643 /* Similar for c_profilefunc, except it needn't
644 return itself and isn't called for "line" events */
645 if (call_trace(tstate->c_profilefunc,
646 tstate->c_profileobj,
647 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000648 /* Profile function raised an error */
649 return NULL;
650 }
651 }
652 }
653
Tim Peters5ca576e2001-06-18 22:08:13 +0000654#ifdef LLTRACE
655 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
656#endif
657#if defined(Py_DEBUG) || defined(LLTRACE)
658 filename = PyString_AsString(co->co_filename);
659#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000660
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 why = WHY_NOT;
662 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000663 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000664 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000665
Guido van Rossum374a9221991-04-04 10:40:29 +0000666 for (;;) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000667 assert(stack_pointer >= f->f_valuestack); /* else underflow */
668 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
669
Guido van Rossuma027efa1997-05-05 20:56:21 +0000670 /* Do periodic things. Doing this every time through
671 the loop would add too much overhead, so we do it
672 only every Nth instruction. We also do it if
673 ``things_to_do'' is set, i.e. when an asynchronous
674 event needs attention (e.g. a signal handler or
675 async I/O handler); see Py_AddPendingCall() and
676 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000677
Skip Montanarod581d772002-09-03 20:10:45 +0000678 if (--_Py_Ticker < 0) {
679 _Py_Ticker = _Py_CheckInterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000680 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000681 if (Py_MakePendingCalls() < 0) {
682 why = WHY_EXCEPTION;
683 goto on_error;
684 }
685 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000686#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000687 /* If we have true signals, the signal handler
688 will call Py_AddPendingCall() so we don't
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000689 have to call PyErr_CheckSignals(). On the
690 Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000691 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000693 goto on_error;
694 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000695#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000696
Guido van Rossume59214e1994-08-30 08:01:59 +0000697#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000698 if (interpreter_lock) {
699 /* Give another thread a chance */
700
Guido van Rossum25ce5661997-08-02 03:10:38 +0000701 if (PyThreadState_Swap(NULL) != tstate)
702 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000703 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000704
705 /* Other threads may run now */
706
Guido van Rossum65d5b571998-12-21 19:32:43 +0000707 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000708 if (PyThreadState_Swap(tstate) != NULL)
709 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000710 }
711#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000713
Neil Schemenauer63543862002-02-17 19:10:14 +0000714 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000716
Guido van Rossum99bec951992-09-03 20:29:45 +0000717 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 opcode = NEXTOP();
720 if (HAS_ARG(opcode))
721 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000722 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000723#ifdef DYNAMIC_EXECUTION_PROFILE
724#ifdef DXPAIRS
725 dxpairs[lastopcode][opcode]++;
726 lastopcode = opcode;
727#endif
728 dxp[opcode]++;
729#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000730
Guido van Rossum96a42c81992-01-12 02:29:51 +0000731#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000733
Guido van Rossum96a42c81992-01-12 02:29:51 +0000734 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 if (HAS_ARG(opcode)) {
736 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000737 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 }
739 else {
740 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000741 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 }
743 }
744#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000745
746 /* line-by-line tracing support */
747
748 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
749 /* see maybe_call_line_trace
750 for expository comments */
751 maybe_call_line_trace(opcode,
752 tstate->c_tracefunc,
753 tstate->c_traceobj,
754 f, &instr_lb, &instr_ub);
755 }
756
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000758
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000760
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 /* BEWARE!
762 It is essential that any operation that fails sets either
763 x to NULL, err to nonzero, or why to anything but WHY_NOT,
764 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000765
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000767
Neil Schemenauer63543862002-02-17 19:10:14 +0000768 case LOAD_FAST:
769 x = GETLOCAL(oparg);
770 if (x != NULL) {
771 Py_INCREF(x);
772 PUSH(x);
773 goto fast_next_opcode;
774 }
775 format_exc_check_arg(PyExc_UnboundLocalError,
776 UNBOUNDLOCAL_ERROR_MSG,
777 PyTuple_GetItem(co->co_varnames, oparg));
778 break;
779
780 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000781 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000782 Py_INCREF(x);
783 PUSH(x);
784 goto fast_next_opcode;
785
786 case STORE_FAST:
787 v = POP();
788 SETLOCAL(oparg, v);
789 goto fast_next_opcode;
790
Guido van Rossum374a9221991-04-04 10:40:29 +0000791 case POP_TOP:
792 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000793 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000794 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000795
Guido van Rossum374a9221991-04-04 10:40:29 +0000796 case ROT_TWO:
797 v = POP();
798 w = POP();
799 PUSH(v);
800 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000801 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000802
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 case ROT_THREE:
804 v = POP();
805 w = POP();
806 x = POP();
807 PUSH(v);
808 PUSH(x);
809 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000810 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000811
Thomas Wouters434d0822000-08-24 20:11:32 +0000812 case ROT_FOUR:
813 u = POP();
814 v = POP();
815 w = POP();
816 x = POP();
817 PUSH(u);
818 PUSH(x);
819 PUSH(w);
820 PUSH(v);
821 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000822
Guido van Rossum374a9221991-04-04 10:40:29 +0000823 case DUP_TOP:
824 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000825 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000826 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000827 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000828
Thomas Wouters434d0822000-08-24 20:11:32 +0000829 case DUP_TOPX:
830 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000831 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000832 x = TOP();
833 Py_INCREF(x);
834 PUSH(x);
835 continue;
836 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000837 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000838 Py_INCREF(x);
839 w = TOP();
840 Py_INCREF(w);
841 PUSH(x);
842 PUSH(w);
843 PUSH(x);
844 continue;
845 case 3:
846 x = POP();
847 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000848 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000849 Py_INCREF(w);
850 v = TOP();
851 Py_INCREF(v);
852 PUSH(w);
853 PUSH(x);
854 PUSH(v);
855 PUSH(w);
856 PUSH(x);
857 continue;
858 case 4:
859 x = POP();
860 Py_INCREF(x);
861 w = POP();
862 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000863 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000864 Py_INCREF(v);
865 u = TOP();
866 Py_INCREF(u);
867 PUSH(v);
868 PUSH(w);
869 PUSH(x);
870 PUSH(u);
871 PUSH(v);
872 PUSH(w);
873 PUSH(x);
874 continue;
875 case 5:
876 x = POP();
877 Py_INCREF(x);
878 w = POP();
879 Py_INCREF(w);
880 v = POP();
881 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000882 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000883 Py_INCREF(u);
884 t = TOP();
885 Py_INCREF(t);
886 PUSH(u);
887 PUSH(v);
888 PUSH(w);
889 PUSH(x);
890 PUSH(t);
891 PUSH(u);
892 PUSH(v);
893 PUSH(w);
894 PUSH(x);
895 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000896 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000897 Py_FatalError("invalid argument to DUP_TOPX"
898 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000899 }
Tim Peters35ba6892000-10-11 07:04:49 +0000900 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000901
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 case UNARY_POSITIVE:
903 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000904 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000905 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000907 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000909
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 case UNARY_NEGATIVE:
911 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000912 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000913 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000915 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000917
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 case UNARY_NOT:
919 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000920 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000921 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000922 if (err == 0) {
923 Py_INCREF(Py_True);
924 PUSH(Py_True);
925 continue;
926 }
927 else if (err > 0) {
928 Py_INCREF(Py_False);
929 PUSH(Py_False);
930 err = 0;
931 continue;
932 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000934
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 case UNARY_CONVERT:
936 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000937 x = PyObject_Repr(v);
938 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000940 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000942
Guido van Rossum7928cd71991-10-24 14:59:31 +0000943 case UNARY_INVERT:
944 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000945 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000946 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000949 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000950
Guido van Rossum50564e81996-01-12 01:13:16 +0000951 case BINARY_POWER:
952 w = POP();
953 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000954 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000955 Py_DECREF(v);
956 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000957 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000958 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000959 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000960
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 case BINARY_MULTIPLY:
962 w = POP();
963 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000964 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000965 Py_DECREF(v);
966 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000968 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000970
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000972 if (!_Py_QnewFlag) {
973 w = POP();
974 v = POP();
975 x = PyNumber_Divide(v, w);
976 Py_DECREF(v);
977 Py_DECREF(w);
978 PUSH(x);
979 if (x != NULL) continue;
980 break;
981 }
982 /* -Qnew is in effect: fall through to
983 BINARY_TRUE_DIVIDE */
984 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 w = POP();
986 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000987 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(v);
989 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000991 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000993
Guido van Rossum4668b002001-08-08 05:00:18 +0000994 case BINARY_FLOOR_DIVIDE:
995 w = POP();
996 v = POP();
997 x = PyNumber_FloorDivide(v, w);
998 Py_DECREF(v);
999 Py_DECREF(w);
1000 PUSH(x);
1001 if (x != NULL) continue;
1002 break;
1003
Guido van Rossum374a9221991-04-04 10:40:29 +00001004 case BINARY_MODULO:
1005 w = POP();
1006 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001007 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001008 Py_DECREF(v);
1009 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001011 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001013
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 case BINARY_ADD:
1015 w = POP();
1016 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001017 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001018 /* INLINE: int + int */
1019 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001020 a = PyInt_AS_LONG(v);
1021 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001022 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001023 if ((i^a) < 0 && (i^b) < 0)
1024 goto slow_add;
1025 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001026 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001027 else {
1028 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001029 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001030 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001031 Py_DECREF(v);
1032 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001034 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001035 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001036
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 case BINARY_SUBTRACT:
1038 w = POP();
1039 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001040 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001041 /* INLINE: int - int */
1042 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001043 a = PyInt_AS_LONG(v);
1044 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001045 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001046 if ((i^a) < 0 && (i^~b) < 0)
1047 goto slow_sub;
1048 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001049 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001050 else {
1051 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001052 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001053 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001054 Py_DECREF(v);
1055 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001057 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001058 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001059
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 case BINARY_SUBSCR:
1061 w = POP();
1062 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001063 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001064 /* INLINE: list[int] */
1065 long i = PyInt_AsLong(w);
1066 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001067 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001068 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001069 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001070 PyErr_SetString(PyExc_IndexError,
1071 "list index out of range");
1072 x = NULL;
1073 }
1074 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001075 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001076 Py_INCREF(x);
1077 }
1078 }
1079 else
1080 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001081 Py_DECREF(v);
1082 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001084 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001085 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001086
Guido van Rossum7928cd71991-10-24 14:59:31 +00001087 case BINARY_LSHIFT:
1088 w = POP();
1089 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001090 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001091 Py_DECREF(v);
1092 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001093 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001094 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001096
Guido van Rossum7928cd71991-10-24 14:59:31 +00001097 case BINARY_RSHIFT:
1098 w = POP();
1099 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001100 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001101 Py_DECREF(v);
1102 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001103 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001104 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001105 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001106
Guido van Rossum7928cd71991-10-24 14:59:31 +00001107 case BINARY_AND:
1108 w = POP();
1109 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001110 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001111 Py_DECREF(v);
1112 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001113 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001114 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001115 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001116
Guido van Rossum7928cd71991-10-24 14:59:31 +00001117 case BINARY_XOR:
1118 w = POP();
1119 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001120 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001121 Py_DECREF(v);
1122 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001123 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001124 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001125 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001126
Guido van Rossum7928cd71991-10-24 14:59:31 +00001127 case BINARY_OR:
1128 w = POP();
1129 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001130 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001131 Py_DECREF(v);
1132 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001133 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001134 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001135 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001136
1137 case INPLACE_POWER:
1138 w = POP();
1139 v = POP();
1140 x = PyNumber_InPlacePower(v, w, Py_None);
1141 Py_DECREF(v);
1142 Py_DECREF(w);
1143 PUSH(x);
1144 if (x != NULL) continue;
1145 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001146
Thomas Wouters434d0822000-08-24 20:11:32 +00001147 case INPLACE_MULTIPLY:
1148 w = POP();
1149 v = POP();
1150 x = PyNumber_InPlaceMultiply(v, w);
1151 Py_DECREF(v);
1152 Py_DECREF(w);
1153 PUSH(x);
1154 if (x != NULL) continue;
1155 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001156
Thomas Wouters434d0822000-08-24 20:11:32 +00001157 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001158 if (!_Py_QnewFlag) {
1159 w = POP();
1160 v = POP();
1161 x = PyNumber_InPlaceDivide(v, w);
1162 Py_DECREF(v);
1163 Py_DECREF(w);
1164 PUSH(x);
1165 if (x != NULL) continue;
1166 break;
1167 }
1168 /* -Qnew is in effect: fall through to
1169 INPLACE_TRUE_DIVIDE */
1170 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001171 w = POP();
1172 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001173 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001174 Py_DECREF(v);
1175 Py_DECREF(w);
1176 PUSH(x);
1177 if (x != NULL) continue;
1178 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001179
Guido van Rossum4668b002001-08-08 05:00:18 +00001180 case INPLACE_FLOOR_DIVIDE:
1181 w = POP();
1182 v = POP();
1183 x = PyNumber_InPlaceFloorDivide(v, w);
1184 Py_DECREF(v);
1185 Py_DECREF(w);
1186 PUSH(x);
1187 if (x != NULL) continue;
1188 break;
1189
Thomas Wouters434d0822000-08-24 20:11:32 +00001190 case INPLACE_MODULO:
1191 w = POP();
1192 v = POP();
1193 x = PyNumber_InPlaceRemainder(v, w);
1194 Py_DECREF(v);
1195 Py_DECREF(w);
1196 PUSH(x);
1197 if (x != NULL) continue;
1198 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001199
Thomas Wouters434d0822000-08-24 20:11:32 +00001200 case INPLACE_ADD:
1201 w = POP();
1202 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001203 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001204 /* INLINE: int + int */
1205 register long a, b, i;
1206 a = PyInt_AS_LONG(v);
1207 b = PyInt_AS_LONG(w);
1208 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001209 if ((i^a) < 0 && (i^b) < 0)
1210 goto slow_iadd;
1211 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001212 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001213 else {
1214 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001216 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001217 Py_DECREF(v);
1218 Py_DECREF(w);
1219 PUSH(x);
1220 if (x != NULL) continue;
1221 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001222
Thomas Wouters434d0822000-08-24 20:11:32 +00001223 case INPLACE_SUBTRACT:
1224 w = POP();
1225 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001226 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001227 /* INLINE: int - int */
1228 register long a, b, i;
1229 a = PyInt_AS_LONG(v);
1230 b = PyInt_AS_LONG(w);
1231 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001232 if ((i^a) < 0 && (i^~b) < 0)
1233 goto slow_isub;
1234 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001235 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001236 else {
1237 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001238 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001239 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001240 Py_DECREF(v);
1241 Py_DECREF(w);
1242 PUSH(x);
1243 if (x != NULL) continue;
1244 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001245
Thomas Wouters434d0822000-08-24 20:11:32 +00001246 case INPLACE_LSHIFT:
1247 w = POP();
1248 v = POP();
1249 x = PyNumber_InPlaceLshift(v, w);
1250 Py_DECREF(v);
1251 Py_DECREF(w);
1252 PUSH(x);
1253 if (x != NULL) continue;
1254 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001255
Thomas Wouters434d0822000-08-24 20:11:32 +00001256 case INPLACE_RSHIFT:
1257 w = POP();
1258 v = POP();
1259 x = PyNumber_InPlaceRshift(v, w);
1260 Py_DECREF(v);
1261 Py_DECREF(w);
1262 PUSH(x);
1263 if (x != NULL) continue;
1264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Thomas Wouters434d0822000-08-24 20:11:32 +00001266 case INPLACE_AND:
1267 w = POP();
1268 v = POP();
1269 x = PyNumber_InPlaceAnd(v, w);
1270 Py_DECREF(v);
1271 Py_DECREF(w);
1272 PUSH(x);
1273 if (x != NULL) continue;
1274 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001275
Thomas Wouters434d0822000-08-24 20:11:32 +00001276 case INPLACE_XOR:
1277 w = POP();
1278 v = POP();
1279 x = PyNumber_InPlaceXor(v, w);
1280 Py_DECREF(v);
1281 Py_DECREF(w);
1282 PUSH(x);
1283 if (x != NULL) continue;
1284 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001285
Thomas Wouters434d0822000-08-24 20:11:32 +00001286 case INPLACE_OR:
1287 w = POP();
1288 v = POP();
1289 x = PyNumber_InPlaceOr(v, w);
1290 Py_DECREF(v);
1291 Py_DECREF(w);
1292 PUSH(x);
1293 if (x != NULL) continue;
1294 break;
1295
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 case SLICE+0:
1297 case SLICE+1:
1298 case SLICE+2:
1299 case SLICE+3:
1300 if ((opcode-SLICE) & 2)
1301 w = POP();
1302 else
1303 w = NULL;
1304 if ((opcode-SLICE) & 1)
1305 v = POP();
1306 else
1307 v = NULL;
1308 u = POP();
1309 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 Py_DECREF(u);
1311 Py_XDECREF(v);
1312 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001314 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001316
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 case STORE_SLICE+0:
1318 case STORE_SLICE+1:
1319 case STORE_SLICE+2:
1320 case STORE_SLICE+3:
1321 if ((opcode-STORE_SLICE) & 2)
1322 w = POP();
1323 else
1324 w = NULL;
1325 if ((opcode-STORE_SLICE) & 1)
1326 v = POP();
1327 else
1328 v = NULL;
1329 u = POP();
1330 t = POP();
1331 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 Py_DECREF(t);
1333 Py_DECREF(u);
1334 Py_XDECREF(v);
1335 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001336 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001338
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 case DELETE_SLICE+0:
1340 case DELETE_SLICE+1:
1341 case DELETE_SLICE+2:
1342 case DELETE_SLICE+3:
1343 if ((opcode-DELETE_SLICE) & 2)
1344 w = POP();
1345 else
1346 w = NULL;
1347 if ((opcode-DELETE_SLICE) & 1)
1348 v = POP();
1349 else
1350 v = NULL;
1351 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001352 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001354 Py_DECREF(u);
1355 Py_XDECREF(v);
1356 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001357 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001359
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 case STORE_SUBSCR:
1361 w = POP();
1362 v = POP();
1363 u = POP();
1364 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001365 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001366 Py_DECREF(u);
1367 Py_DECREF(v);
1368 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001369 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001371
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 case DELETE_SUBSCR:
1373 w = POP();
1374 v = POP();
1375 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001376 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 Py_DECREF(v);
1378 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001379 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001381
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 case PRINT_EXPR:
1383 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001384 w = PySys_GetObject("displayhook");
1385 if (w == NULL) {
1386 PyErr_SetString(PyExc_RuntimeError,
1387 "lost sys.displayhook");
1388 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001389 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001390 }
1391 if (err == 0) {
1392 x = Py_BuildValue("(O)", v);
1393 if (x == NULL)
1394 err = -1;
1395 }
1396 if (err == 0) {
1397 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001398 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001399 if (w == NULL)
1400 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001403 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001405
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001406 case PRINT_ITEM_TO:
1407 w = stream = POP();
1408 /* fall through to PRINT_ITEM */
1409
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 case PRINT_ITEM:
1411 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001412 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001413 w = PySys_GetObject("stdout");
1414 if (w == NULL) {
1415 PyErr_SetString(PyExc_RuntimeError,
1416 "lost sys.stdout");
1417 err = -1;
1418 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001419 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001420 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001421 err = PyFile_WriteString(" ", w);
1422 if (err == 0)
1423 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001424 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001425 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001426 if (PyString_Check(v)) {
1427 char *s = PyString_AS_STRING(v);
1428 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001429 if (len == 0 ||
1430 !isspace(Py_CHARMASK(s[len-1])) ||
1431 s[len-1] == ' ')
1432 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001433 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001434#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001435 else if (PyUnicode_Check(v)) {
1436 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1437 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001438 if (len == 0 ||
1439 !Py_UNICODE_ISSPACE(s[len-1]) ||
1440 s[len-1] == ' ')
1441 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001442 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001443#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001444 else
1445 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001447 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001448 Py_XDECREF(stream);
1449 stream = NULL;
1450 if (err == 0)
1451 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001453
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001454 case PRINT_NEWLINE_TO:
1455 w = stream = POP();
1456 /* fall through to PRINT_NEWLINE */
1457
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001459 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001460 w = PySys_GetObject("stdout");
1461 if (w == NULL)
1462 PyErr_SetString(PyExc_RuntimeError,
1463 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001464 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001465 if (w != NULL) {
1466 err = PyFile_WriteString("\n", w);
1467 if (err == 0)
1468 PyFile_SoftSpace(w, 0);
1469 }
1470 Py_XDECREF(stream);
1471 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001473
Thomas Wouters434d0822000-08-24 20:11:32 +00001474
1475#ifdef CASE_TOO_BIG
1476 default: switch (opcode) {
1477#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 case BREAK_LOOP:
1479 why = WHY_BREAK;
1480 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001481
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001482 case CONTINUE_LOOP:
1483 retval = PyInt_FromLong(oparg);
1484 why = WHY_CONTINUE;
1485 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001486
Guido van Rossumf10570b1995-07-07 22:53:21 +00001487 case RAISE_VARARGS:
1488 u = v = w = NULL;
1489 switch (oparg) {
1490 case 3:
1491 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001492 /* Fallthrough */
1493 case 2:
1494 v = POP(); /* value */
1495 /* Fallthrough */
1496 case 1:
1497 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001498 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001499 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001500 break;
1501 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001503 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001504 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001505 break;
1506 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001508
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001510 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001511 PyErr_SetString(PyExc_SystemError,
1512 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001513 break;
1514 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001516 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001518
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 case RETURN_VALUE:
1520 retval = POP();
1521 why = WHY_RETURN;
1522 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001523
Tim Peters5ca576e2001-06-18 22:08:13 +00001524 case YIELD_VALUE:
1525 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001526 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001527 why = WHY_YIELD;
1528 break;
1529
1530
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001531 case EXEC_STMT:
1532 w = POP();
1533 v = POP();
1534 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001535 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 Py_DECREF(u);
1537 Py_DECREF(v);
1538 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001539 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001540
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 case POP_BLOCK:
1542 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 while (STACK_LEVEL() > b->b_level) {
1545 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 }
1548 }
1549 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001550
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 case END_FINALLY:
1552 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 if (PyInt_Check(v)) {
1554 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001555 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001556 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001557 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 retval = POP();
1559 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001565 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001567 else if (v != Py_None) {
1568 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 "'finally' pops bad exception");
1570 why = WHY_EXCEPTION;
1571 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001574
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001576 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001578 w = POP();
1579 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_DECREF(u);
1582 Py_DECREF(v);
1583 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001585
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001587 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001590 PyErr_Format(PyExc_SystemError,
1591 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001592 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 break;
1594 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 err = PyDict_SetItem(x, w, v);
1596 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001598
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001600 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001602 PyErr_Format(PyExc_SystemError,
1603 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001604 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 break;
1606 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001608 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001609 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001611
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001612 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001613 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001614 if (PyTuple_Check(v)) {
1615 if (PyTuple_Size(v) != oparg) {
1616 PyErr_SetString(PyExc_ValueError,
1617 "unpack tuple of wrong size");
1618 why = WHY_EXCEPTION;
1619 }
1620 else {
1621 for (; --oparg >= 0; ) {
1622 w = PyTuple_GET_ITEM(v, oparg);
1623 Py_INCREF(w);
1624 PUSH(w);
1625 }
1626 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001628 else if (PyList_Check(v)) {
1629 if (PyList_Size(v) != oparg) {
1630 PyErr_SetString(PyExc_ValueError,
1631 "unpack list of wrong size");
1632 why = WHY_EXCEPTION;
1633 }
1634 else {
1635 for (; --oparg >= 0; ) {
1636 w = PyList_GET_ITEM(v, oparg);
1637 Py_INCREF(w);
1638 PUSH(w);
1639 }
1640 }
1641 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001642 else if (unpack_iterable(v, oparg,
1643 stack_pointer + oparg))
1644 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001645 else {
1646 if (PyErr_ExceptionMatches(PyExc_TypeError))
1647 PyErr_SetString(PyExc_TypeError,
1648 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001649 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001650 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001652 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001653
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001655 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 v = POP();
1657 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1659 Py_DECREF(v);
1660 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001662
Guido van Rossum374a9221991-04-04 10:40:29 +00001663 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001664 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001666 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1667 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001670
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001671 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001672 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001673 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 err = PyDict_SetItem(f->f_globals, w, v);
1675 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001676 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001677
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001678 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001679 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001681 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001682 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001683 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001684
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001686 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001687 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001688 PyErr_Format(PyExc_SystemError,
1689 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001690 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001691 break;
1692 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001699 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001700 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001701 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 break;
1703 }
1704 }
1705 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 PUSH(x);
1708 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001709
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001711 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001712 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001713 /* Inline the PyDict_GetItem() calls.
1714 WARNING: this is an extreme speed hack.
1715 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001716 long hash = ((PyStringObject *)w)->ob_shash;
1717 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001718 PyDictObject *d;
1719 d = (PyDictObject *)(f->f_globals);
1720 x = d->ma_lookup(d, w, hash)->me_value;
1721 if (x != NULL) {
1722 Py_INCREF(x);
1723 PUSH(x);
1724 continue;
1725 }
1726 d = (PyDictObject *)(f->f_builtins);
1727 x = d->ma_lookup(d, w, hash)->me_value;
1728 if (x != NULL) {
1729 Py_INCREF(x);
1730 PUSH(x);
1731 continue;
1732 }
1733 goto load_global_error;
1734 }
1735 }
1736 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001737 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001741 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001742 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001743 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001744 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 break;
1746 }
1747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 PUSH(x);
1750 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001751
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001752 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001753 x = GETLOCAL(oparg);
1754 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001755 format_exc_check_arg(
1756 PyExc_UnboundLocalError,
1757 UNBOUNDLOCAL_ERROR_MSG,
1758 PyTuple_GetItem(co->co_varnames, oparg)
1759 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001760 break;
1761 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001762 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001763 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001764
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001765 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001766 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001767 Py_INCREF(x);
1768 PUSH(x);
1769 break;
1770
1771 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001772 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001773 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001774 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001775 err = -1;
1776 /* Don't stomp existing exception */
1777 if (PyErr_Occurred())
1778 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001779 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001780 v = PyTuple_GetItem(co->co_cellvars,
1781 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001782 format_exc_check_arg(
1783 PyExc_UnboundLocalError,
1784 UNBOUNDLOCAL_ERROR_MSG,
1785 v);
1786 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001787 v = PyTuple_GetItem(
1788 co->co_freevars,
1789 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001790 format_exc_check_arg(
1791 PyExc_NameError,
1792 UNBOUNDFREE_ERROR_MSG,
1793 v);
1794 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001795 break;
1796 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001797 PUSH(w);
1798 break;
1799
1800 case STORE_DEREF:
1801 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001802 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001803 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001804 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001805 continue;
1806
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 if (x != NULL) {
1810 for (; --oparg >= 0;) {
1811 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001812 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 }
1814 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001815 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 }
1817 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001818
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 if (x != NULL) {
1822 for (; --oparg >= 0;) {
1823 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001824 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 }
1826 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001827 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001828 }
1829 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001830
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001832 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001834 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001836
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001838 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001840 x = PyObject_GetAttr(v, w);
1841 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001843 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001845
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 case COMPARE_OP:
1847 w = POP();
1848 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001849 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001850 /* INLINE: cmp(int, int) */
1851 register long a, b;
1852 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001853 a = PyInt_AS_LONG(v);
1854 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001855 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001856 case PyCmp_LT: res = a < b; break;
1857 case PyCmp_LE: res = a <= b; break;
1858 case PyCmp_EQ: res = a == b; break;
1859 case PyCmp_NE: res = a != b; break;
1860 case PyCmp_GT: res = a > b; break;
1861 case PyCmp_GE: res = a >= b; break;
1862 case PyCmp_IS: res = v == w; break;
1863 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001864 default: goto slow_compare;
1865 }
1866 x = res ? Py_True : Py_False;
1867 Py_INCREF(x);
1868 }
1869 else {
1870 slow_compare:
1871 x = cmp_outcome(oparg, v, w);
1872 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001873 Py_DECREF(v);
1874 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001876 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001878
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001880 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001881 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001882 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001883 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001884 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001885 break;
1886 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001887 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001888 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001889 w,
1890 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001891 f->f_locals == NULL ?
1892 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001893 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001894 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001895 if (w == NULL) {
1896 x = NULL;
1897 break;
1898 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001899 x = PyEval_CallObject(x, w);
1900 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001904
Thomas Wouters52152252000-08-17 22:55:00 +00001905 case IMPORT_STAR:
1906 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001907 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001908 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001909 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001910 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001911 break;
1912 }
Thomas Wouters52152252000-08-17 22:55:00 +00001913 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001914 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001915 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001916 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001917 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001918
Thomas Wouters52152252000-08-17 22:55:00 +00001919 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001920 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001921 v = TOP();
1922 x = import_from(v, w);
1923 PUSH(x);
1924 if (x != NULL) continue;
1925 break;
1926
Guido van Rossum374a9221991-04-04 10:40:29 +00001927 case JUMP_FORWARD:
1928 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001929 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001930
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001932 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001933 if (err > 0)
1934 err = 0;
1935 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001936 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001937 else
1938 break;
1939 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001940
Guido van Rossum374a9221991-04-04 10:40:29 +00001941 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001942 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001943 if (err > 0) {
1944 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001945 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001946 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001947 else if (err == 0)
1948 ;
1949 else
1950 break;
1951 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001952
Guido van Rossum374a9221991-04-04 10:40:29 +00001953 case JUMP_ABSOLUTE:
1954 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001955 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001956
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001957 case GET_ITER:
1958 /* before: [obj]; after [getiter(obj)] */
1959 v = POP();
1960 x = PyObject_GetIter(v);
1961 Py_DECREF(v);
1962 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001963 PUSH(x);
1964 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001965 }
1966 break;
1967
1968 case FOR_ITER:
1969 /* before: [iter]; after: [iter, iter()] *or* [] */
1970 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001971 x = PyIter_Next(v);
1972 if (x != NULL) {
1973 PUSH(x);
1974 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001975 }
Tim Petersf4848da2001-05-05 00:14:56 +00001976 if (!PyErr_Occurred()) {
1977 /* iterator ended normally */
1978 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001979 Py_DECREF(v);
1980 JUMPBY(oparg);
1981 continue;
1982 }
1983 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001984
Guido van Rossum374a9221991-04-04 10:40:29 +00001985 case SETUP_LOOP:
1986 case SETUP_EXCEPT:
1987 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001988 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001989 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001990 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001991
Guido van Rossumf10570b1995-07-07 22:53:21 +00001992 case CALL_FUNCTION:
Jeremy Hyltone8c04322002-08-16 17:47:26 +00001993 x = call_function(&stack_pointer, oparg);
1994 PUSH(x);
1995 if (x != NULL)
1996 continue;
1997 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001998
Jeremy Hylton76901512000-03-28 23:49:17 +00001999 case CALL_FUNCTION_VAR:
2000 case CALL_FUNCTION_KW:
2001 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002002 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002003 int na = oparg & 0xff;
2004 int nk = (oparg>>8) & 0xff;
2005 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002006 int n = na + 2 * nk;
2007 PyObject **pfunc, *func;
2008 if (flags & CALL_FLAG_VAR)
2009 n++;
2010 if (flags & CALL_FLAG_KW)
2011 n++;
2012 pfunc = stack_pointer - n - 1;
2013 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002014
Guido van Rossumac7be682001-01-17 15:42:30 +00002015 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002016 && PyMethod_GET_SELF(func) != NULL) {
2017 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002018 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002019 func = PyMethod_GET_FUNCTION(func);
2020 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002021 Py_DECREF(*pfunc);
2022 *pfunc = self;
2023 na++;
2024 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002025 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002026 Py_INCREF(func);
2027 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002028 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002029
Jeremy Hylton76901512000-03-28 23:49:17 +00002030 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002031 w = POP();
2032 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002033 }
2034 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002035 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002036 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002037 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002038 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002039
Guido van Rossum681d79a1995-07-18 14:51:37 +00002040 case MAKE_FUNCTION:
2041 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002042 x = PyFunction_New(v, f->f_globals);
2043 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002044 /* XXX Maybe this should be a separate opcode? */
2045 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002046 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002047 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002048 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002049 x = NULL;
2050 break;
2051 }
2052 while (--oparg >= 0) {
2053 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002054 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002055 }
2056 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002057 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002058 }
2059 PUSH(x);
2060 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002061
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002062 case MAKE_CLOSURE:
2063 {
2064 int nfree;
2065 v = POP(); /* code object */
2066 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002067 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002068 Py_DECREF(v);
2069 /* XXX Maybe this should be a separate opcode? */
2070 if (x != NULL && nfree > 0) {
2071 v = PyTuple_New(nfree);
2072 if (v == NULL) {
2073 Py_DECREF(x);
2074 x = NULL;
2075 break;
2076 }
2077 while (--nfree >= 0) {
2078 w = POP();
2079 PyTuple_SET_ITEM(v, nfree, w);
2080 }
2081 err = PyFunction_SetClosure(x, v);
2082 Py_DECREF(v);
2083 }
2084 if (x != NULL && oparg > 0) {
2085 v = PyTuple_New(oparg);
2086 if (v == NULL) {
2087 Py_DECREF(x);
2088 x = NULL;
2089 break;
2090 }
2091 while (--oparg >= 0) {
2092 w = POP();
2093 PyTuple_SET_ITEM(v, oparg, w);
2094 }
2095 err = PyFunction_SetDefaults(x, v);
2096 Py_DECREF(v);
2097 }
2098 PUSH(x);
2099 break;
2100 }
2101
Guido van Rossum8861b741996-07-30 16:49:37 +00002102 case BUILD_SLICE:
2103 if (oparg == 3)
2104 w = POP();
2105 else
2106 w = NULL;
2107 v = POP();
2108 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002109 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002110 Py_DECREF(u);
2111 Py_DECREF(v);
2112 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002113 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002114 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002115 break;
2116
Fred Drakeef8ace32000-08-24 00:32:09 +00002117 case EXTENDED_ARG:
2118 opcode = NEXTOP();
2119 oparg = oparg<<16 | NEXTARG();
2120 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002121
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 default:
2123 fprintf(stderr,
2124 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002125 PyCode_Addr2Line(f->f_code, f->f_lasti),
2126 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002128 why = WHY_EXCEPTION;
2129 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002130
2131#ifdef CASE_TOO_BIG
2132 }
2133#endif
2134
Guido van Rossum374a9221991-04-04 10:40:29 +00002135 } /* switch */
2136
2137 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002138
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002140
Guido van Rossum374a9221991-04-04 10:40:29 +00002141 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002142 if (err == 0 && x != NULL) {
2143#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002144 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002146 fprintf(stderr,
2147 "XXX undetected error\n");
2148 else
2149#endif
2150 continue; /* Normal, fast path */
2151 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002152 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 err = 0;
2155 }
2156
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002158
Guido van Rossum374a9221991-04-04 10:40:29 +00002159 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002160 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002161 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002162 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 why = WHY_EXCEPTION;
2164 }
2165 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002166#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002168 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002170 fprintf(stderr,
2171 "XXX undetected error (why=%d)\n",
2172 why);
2173 why = WHY_EXCEPTION;
2174 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 }
2176#endif
2177
2178 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002179
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002182
Fred Drake8f51f542001-10-04 14:48:42 +00002183 if (tstate->c_tracefunc != NULL)
2184 call_exc_trace(tstate->c_tracefunc,
2185 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002186 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002187
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002189
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 if (why == WHY_RERAISE)
2191 why = WHY_EXCEPTION;
2192
2193 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002194
Tim Peters5ca576e2001-06-18 22:08:13 +00002195 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002197
2198 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2199 /* For a continue inside a try block,
2200 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002201 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2202 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002203 why = WHY_NOT;
2204 JUMPTO(PyInt_AS_LONG(retval));
2205 Py_DECREF(retval);
2206 break;
2207 }
2208
Guido van Rossum374a9221991-04-04 10:40:29 +00002209 while (STACK_LEVEL() > b->b_level) {
2210 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002211 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002212 }
2213 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2214 why = WHY_NOT;
2215 JUMPTO(b->b_handler);
2216 break;
2217 }
2218 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002219 (b->b_type == SETUP_EXCEPT &&
2220 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002221 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 PyObject *exc, *val, *tb;
2223 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002224 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 val = Py_None;
2226 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 /* Make the raw exception data
2229 available to the handler,
2230 so a program can emulate the
2231 Python main loop. Don't do
2232 this for 'finally'. */
2233 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002234 PyErr_NormalizeException(
2235 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002236 set_exc_info(tstate,
2237 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002239 if (tb == NULL) {
2240 Py_INCREF(Py_None);
2241 PUSH(Py_None);
2242 } else
2243 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002244 PUSH(val);
2245 PUSH(exc);
2246 }
2247 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002248 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002249 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002250 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002252 PUSH(v);
2253 }
2254 why = WHY_NOT;
2255 JUMPTO(b->b_handler);
2256 break;
2257 }
2258 } /* unwind stack */
2259
2260 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002261
Guido van Rossum374a9221991-04-04 10:40:29 +00002262 if (why != WHY_NOT)
2263 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002264
Guido van Rossum374a9221991-04-04 10:40:29 +00002265 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002266
Guido van Rossum35974fb2001-12-06 21:28:18 +00002267 if (why != WHY_YIELD) {
2268 /* Pop remaining stack entries -- but when yielding */
2269 while (!EMPTY()) {
2270 v = POP();
2271 Py_XDECREF(v);
2272 }
2273 }
2274
Tim Peters5ca576e2001-06-18 22:08:13 +00002275 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002276 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002277
Fred Drake9e3ad782001-07-03 23:39:52 +00002278 if (tstate->use_tracing) {
2279 if (tstate->c_tracefunc
2280 && (why == WHY_RETURN || why == WHY_YIELD)) {
2281 if (call_trace(tstate->c_tracefunc,
2282 tstate->c_traceobj, f,
2283 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002284 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002285 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002286 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002287 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002288 }
Fred Drake8f51f542001-10-04 14:48:42 +00002289 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002290 if (why == WHY_EXCEPTION)
2291 call_trace_protected(tstate->c_profilefunc,
2292 tstate->c_profileobj, f,
2293 PyTrace_RETURN);
2294 else if (call_trace(tstate->c_profilefunc,
2295 tstate->c_profileobj, f,
2296 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002297 Py_XDECREF(retval);
2298 retval = NULL;
2299 why = WHY_EXCEPTION;
2300 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002301 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002302 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002303
Guido van Rossuma027efa1997-05-05 20:56:21 +00002304 reset_exc_info(tstate);
2305
Tim Peters5ca576e2001-06-18 22:08:13 +00002306 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002307 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002308 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002309
Guido van Rossum96a42c81992-01-12 02:29:51 +00002310 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002311}
2312
Tim Peters6d6c1a32001-08-02 04:15:00 +00002313PyObject *
2314PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002315 PyObject **args, int argcount, PyObject **kws, int kwcount,
2316 PyObject **defs, int defcount, PyObject *closure)
2317{
2318 register PyFrameObject *f;
2319 register PyObject *retval = NULL;
2320 register PyObject **fastlocals, **freevars;
2321 PyThreadState *tstate = PyThreadState_GET();
2322 PyObject *x, *u;
2323
2324 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002325 PyErr_SetString(PyExc_SystemError,
2326 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002327 return NULL;
2328 }
2329
2330 f = PyFrame_New(tstate, /*back*/
2331 co, /*code*/
2332 globals, locals);
2333 if (f == NULL)
2334 return NULL;
2335
2336 fastlocals = f->f_localsplus;
2337 freevars = f->f_localsplus + f->f_nlocals;
2338
2339 if (co->co_argcount > 0 ||
2340 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2341 int i;
2342 int n = argcount;
2343 PyObject *kwdict = NULL;
2344 if (co->co_flags & CO_VARKEYWORDS) {
2345 kwdict = PyDict_New();
2346 if (kwdict == NULL)
2347 goto fail;
2348 i = co->co_argcount;
2349 if (co->co_flags & CO_VARARGS)
2350 i++;
2351 SETLOCAL(i, kwdict);
2352 }
2353 if (argcount > co->co_argcount) {
2354 if (!(co->co_flags & CO_VARARGS)) {
2355 PyErr_Format(PyExc_TypeError,
2356 "%.200s() takes %s %d "
2357 "%sargument%s (%d given)",
2358 PyString_AsString(co->co_name),
2359 defcount ? "at most" : "exactly",
2360 co->co_argcount,
2361 kwcount ? "non-keyword " : "",
2362 co->co_argcount == 1 ? "" : "s",
2363 argcount);
2364 goto fail;
2365 }
2366 n = co->co_argcount;
2367 }
2368 for (i = 0; i < n; i++) {
2369 x = args[i];
2370 Py_INCREF(x);
2371 SETLOCAL(i, x);
2372 }
2373 if (co->co_flags & CO_VARARGS) {
2374 u = PyTuple_New(argcount - n);
2375 if (u == NULL)
2376 goto fail;
2377 SETLOCAL(co->co_argcount, u);
2378 for (i = n; i < argcount; i++) {
2379 x = args[i];
2380 Py_INCREF(x);
2381 PyTuple_SET_ITEM(u, i-n, x);
2382 }
2383 }
2384 for (i = 0; i < kwcount; i++) {
2385 PyObject *keyword = kws[2*i];
2386 PyObject *value = kws[2*i + 1];
2387 int j;
2388 if (keyword == NULL || !PyString_Check(keyword)) {
2389 PyErr_Format(PyExc_TypeError,
2390 "%.200s() keywords must be strings",
2391 PyString_AsString(co->co_name));
2392 goto fail;
2393 }
2394 /* XXX slow -- speed up using dictionary? */
2395 for (j = 0; j < co->co_argcount; j++) {
2396 PyObject *nm = PyTuple_GET_ITEM(
2397 co->co_varnames, j);
2398 int cmp = PyObject_RichCompareBool(
2399 keyword, nm, Py_EQ);
2400 if (cmp > 0)
2401 break;
2402 else if (cmp < 0)
2403 goto fail;
2404 }
2405 /* Check errors from Compare */
2406 if (PyErr_Occurred())
2407 goto fail;
2408 if (j >= co->co_argcount) {
2409 if (kwdict == NULL) {
2410 PyErr_Format(PyExc_TypeError,
2411 "%.200s() got an unexpected "
2412 "keyword argument '%.400s'",
2413 PyString_AsString(co->co_name),
2414 PyString_AsString(keyword));
2415 goto fail;
2416 }
2417 PyDict_SetItem(kwdict, keyword, value);
2418 }
2419 else {
2420 if (GETLOCAL(j) != NULL) {
2421 PyErr_Format(PyExc_TypeError,
2422 "%.200s() got multiple "
2423 "values for keyword "
2424 "argument '%.400s'",
2425 PyString_AsString(co->co_name),
2426 PyString_AsString(keyword));
2427 goto fail;
2428 }
2429 Py_INCREF(value);
2430 SETLOCAL(j, value);
2431 }
2432 }
2433 if (argcount < co->co_argcount) {
2434 int m = co->co_argcount - defcount;
2435 for (i = argcount; i < m; i++) {
2436 if (GETLOCAL(i) == NULL) {
2437 PyErr_Format(PyExc_TypeError,
2438 "%.200s() takes %s %d "
2439 "%sargument%s (%d given)",
2440 PyString_AsString(co->co_name),
2441 ((co->co_flags & CO_VARARGS) ||
2442 defcount) ? "at least"
2443 : "exactly",
2444 m, kwcount ? "non-keyword " : "",
2445 m == 1 ? "" : "s", i);
2446 goto fail;
2447 }
2448 }
2449 if (n > m)
2450 i = n - m;
2451 else
2452 i = 0;
2453 for (; i < defcount; i++) {
2454 if (GETLOCAL(m+i) == NULL) {
2455 PyObject *def = defs[i];
2456 Py_INCREF(def);
2457 SETLOCAL(m+i, def);
2458 }
2459 }
2460 }
2461 }
2462 else {
2463 if (argcount > 0 || kwcount > 0) {
2464 PyErr_Format(PyExc_TypeError,
2465 "%.200s() takes no arguments (%d given)",
2466 PyString_AsString(co->co_name),
2467 argcount + kwcount);
2468 goto fail;
2469 }
2470 }
2471 /* Allocate and initialize storage for cell vars, and copy free
2472 vars into frame. This isn't too efficient right now. */
2473 if (f->f_ncells) {
2474 int i = 0, j = 0, nargs, found;
2475 char *cellname, *argname;
2476 PyObject *c;
2477
2478 nargs = co->co_argcount;
2479 if (co->co_flags & CO_VARARGS)
2480 nargs++;
2481 if (co->co_flags & CO_VARKEYWORDS)
2482 nargs++;
2483
2484 /* Check for cells that shadow args */
2485 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2486 cellname = PyString_AS_STRING(
2487 PyTuple_GET_ITEM(co->co_cellvars, i));
2488 found = 0;
2489 while (j < nargs) {
2490 argname = PyString_AS_STRING(
2491 PyTuple_GET_ITEM(co->co_varnames, j));
2492 if (strcmp(cellname, argname) == 0) {
2493 c = PyCell_New(GETLOCAL(j));
2494 if (c == NULL)
2495 goto fail;
2496 GETLOCAL(f->f_nlocals + i) = c;
2497 found = 1;
2498 break;
2499 }
2500 j++;
2501 }
2502 if (found == 0) {
2503 c = PyCell_New(NULL);
2504 if (c == NULL)
2505 goto fail;
2506 SETLOCAL(f->f_nlocals + i, c);
2507 }
2508 }
2509 /* Initialize any that are left */
2510 while (i < f->f_ncells) {
2511 c = PyCell_New(NULL);
2512 if (c == NULL)
2513 goto fail;
2514 SETLOCAL(f->f_nlocals + i, c);
2515 i++;
2516 }
2517 }
2518 if (f->f_nfreevars) {
2519 int i;
2520 for (i = 0; i < f->f_nfreevars; ++i) {
2521 PyObject *o = PyTuple_GET_ITEM(closure, i);
2522 Py_INCREF(o);
2523 freevars[f->f_ncells + i] = o;
2524 }
2525 }
2526
Tim Peters5ca576e2001-06-18 22:08:13 +00002527 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002528 /* Don't need to keep the reference to f_back, it will be set
2529 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002530 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002531 f->f_back = NULL;
2532
2533 /* Create a new generator that owns the ready to run frame
2534 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002535 return gen_new(f);
2536 }
2537
2538 retval = eval_frame(f);
2539
2540 fail: /* Jump here from prelude on failure */
2541
Tim Petersb13680b2001-11-27 23:29:29 +00002542 /* decref'ing the frame can cause __del__ methods to get invoked,
2543 which can call back into Python. While we're done with the
2544 current Python frame (f), the associated C stack is still in use,
2545 so recursion_depth must be boosted for the duration.
2546 */
2547 assert(tstate != NULL);
2548 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002549 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002550 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002551 return retval;
2552}
2553
2554
Guido van Rossuma027efa1997-05-05 20:56:21 +00002555static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002556set_exc_info(PyThreadState *tstate,
2557 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002558{
2559 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002560 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002561
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562 frame = tstate->frame;
2563 if (frame->f_exc_type == NULL) {
2564 /* This frame didn't catch an exception before */
2565 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 if (tstate->exc_type == NULL) {
2567 Py_INCREF(Py_None);
2568 tstate->exc_type = Py_None;
2569 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002570 tmp_type = frame->f_exc_type;
2571 tmp_value = frame->f_exc_value;
2572 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573 Py_XINCREF(tstate->exc_type);
2574 Py_XINCREF(tstate->exc_value);
2575 Py_XINCREF(tstate->exc_traceback);
2576 frame->f_exc_type = tstate->exc_type;
2577 frame->f_exc_value = tstate->exc_value;
2578 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002579 Py_XDECREF(tmp_type);
2580 Py_XDECREF(tmp_value);
2581 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002582 }
2583 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002584 tmp_type = tstate->exc_type;
2585 tmp_value = tstate->exc_value;
2586 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002587 Py_XINCREF(type);
2588 Py_XINCREF(value);
2589 Py_XINCREF(tb);
2590 tstate->exc_type = type;
2591 tstate->exc_value = value;
2592 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002593 Py_XDECREF(tmp_type);
2594 Py_XDECREF(tmp_value);
2595 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002596 /* For b/w compatibility */
2597 PySys_SetObject("exc_type", type);
2598 PySys_SetObject("exc_value", value);
2599 PySys_SetObject("exc_traceback", tb);
2600}
2601
2602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002603reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002604{
2605 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002606 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607 frame = tstate->frame;
2608 if (frame->f_exc_type != NULL) {
2609 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002610 tmp_type = tstate->exc_type;
2611 tmp_value = tstate->exc_value;
2612 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002613 Py_XINCREF(frame->f_exc_type);
2614 Py_XINCREF(frame->f_exc_value);
2615 Py_XINCREF(frame->f_exc_traceback);
2616 tstate->exc_type = frame->f_exc_type;
2617 tstate->exc_value = frame->f_exc_value;
2618 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002619 Py_XDECREF(tmp_type);
2620 Py_XDECREF(tmp_value);
2621 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002622 /* For b/w compatibility */
2623 PySys_SetObject("exc_type", frame->f_exc_type);
2624 PySys_SetObject("exc_value", frame->f_exc_value);
2625 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2626 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002627 tmp_type = frame->f_exc_type;
2628 tmp_value = frame->f_exc_value;
2629 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002630 frame->f_exc_type = NULL;
2631 frame->f_exc_value = NULL;
2632 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002633 Py_XDECREF(tmp_type);
2634 Py_XDECREF(tmp_value);
2635 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002636}
2637
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002638/* Logic for the raise statement (too complicated for inlining).
2639 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002640static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002641do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002642{
Guido van Rossumd295f121998-04-09 21:39:57 +00002643 if (type == NULL) {
2644 /* Reraise */
2645 PyThreadState *tstate = PyThreadState_Get();
2646 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2647 value = tstate->exc_value;
2648 tb = tstate->exc_traceback;
2649 Py_XINCREF(type);
2650 Py_XINCREF(value);
2651 Py_XINCREF(tb);
2652 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002653
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002654 /* We support the following forms of raise:
2655 raise <class>, <classinstance>
2656 raise <class>, <argument tuple>
2657 raise <class>, None
2658 raise <class>, <argument>
2659 raise <classinstance>, None
2660 raise <string>, <object>
2661 raise <string>, None
2662
2663 An omitted second argument is the same as None.
2664
2665 In addition, raise <tuple>, <anything> is the same as
2666 raising the tuple's first item (and it better have one!);
2667 this rule is applied recursively.
2668
2669 Finally, an optional third argument can be supplied, which
2670 gives the traceback to be substituted (useful when
2671 re-raising an exception after examining it). */
2672
2673 /* First, check the traceback argument, replacing None with
2674 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002675 if (tb == Py_None) {
2676 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002677 tb = NULL;
2678 }
2679 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002681 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002682 goto raise_error;
2683 }
2684
2685 /* Next, replace a missing value with None */
2686 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 value = Py_None;
2688 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002689 }
2690
2691 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2693 PyObject *tmp = type;
2694 type = PyTuple_GET_ITEM(type, 0);
2695 Py_INCREF(type);
2696 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002697 }
2698
Tim Petersafb2c802002-04-18 18:06:20 +00002699 if (PyString_CheckExact(type))
2700 /* Raising builtin string is deprecated but still allowed --
2701 * do nothing. Raising an instance of a new-style str
2702 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002703 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002704
2705 else if (PyClass_Check(type))
2706 PyErr_NormalizeException(&type, &value, &tb);
2707
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002709 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 if (value != Py_None) {
2711 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002712 "instance exception may not have a separate value");
2713 goto raise_error;
2714 }
2715 else {
2716 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002718 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002719 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2720 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002721 }
2722 }
2723 else {
2724 /* Not something you can raise. You get an exception
2725 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002726 PyErr_Format(PyExc_TypeError,
2727 "exceptions must be strings, classes, or "
2728 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002729 goto raise_error;
2730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002732 if (tb == NULL)
2733 return WHY_EXCEPTION;
2734 else
2735 return WHY_RERAISE;
2736 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 Py_XDECREF(value);
2738 Py_XDECREF(type);
2739 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002740 return WHY_EXCEPTION;
2741}
2742
Tim Petersd6d010b2001-06-21 02:49:55 +00002743/* Iterate v argcnt times and store the results on the stack (via decreasing
2744 sp). Return 1 for success, 0 if error. */
2745
Barry Warsawe42b18f1997-08-25 22:13:04 +00002746static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002747unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002748{
Tim Petersd6d010b2001-06-21 02:49:55 +00002749 int i = 0;
2750 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002751 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002752
Tim Petersd6d010b2001-06-21 02:49:55 +00002753 assert(v != NULL);
2754
2755 it = PyObject_GetIter(v);
2756 if (it == NULL)
2757 goto Error;
2758
2759 for (; i < argcnt; i++) {
2760 w = PyIter_Next(it);
2761 if (w == NULL) {
2762 /* Iterator done, via error or exhaustion. */
2763 if (!PyErr_Occurred()) {
2764 PyErr_Format(PyExc_ValueError,
2765 "need more than %d value%s to unpack",
2766 i, i == 1 ? "" : "s");
2767 }
2768 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002769 }
2770 *--sp = w;
2771 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002772
2773 /* We better have exhausted the iterator now. */
2774 w = PyIter_Next(it);
2775 if (w == NULL) {
2776 if (PyErr_Occurred())
2777 goto Error;
2778 Py_DECREF(it);
2779 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002780 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002781 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002782 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002783 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002784Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002785 for (; i > 0; i--, sp++)
2786 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002787 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002788 return 0;
2789}
2790
2791
Guido van Rossum96a42c81992-01-12 02:29:51 +00002792#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002796 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 if (PyObject_Print(v, stdout, 0) != 0)
2798 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002799 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002800 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002802#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804static void
Fred Drake5755ce62001-06-27 19:19:46 +00002805call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002806{
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002810 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 value = Py_None;
2812 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002813 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002815 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002817 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002818 }
Fred Drake5755ce62001-06-27 19:19:46 +00002819 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 Py_XDECREF(type);
2825 Py_XDECREF(value);
2826 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002828}
2829
Fred Drake4ec5d562001-10-04 19:26:43 +00002830static void
2831call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2832 int what)
2833{
2834 PyObject *type, *value, *traceback;
2835 int err;
2836 PyErr_Fetch(&type, &value, &traceback);
2837 err = call_trace(func, obj, frame, what, NULL);
2838 if (err == 0)
2839 PyErr_Restore(type, value, traceback);
2840 else {
2841 Py_XDECREF(type);
2842 Py_XDECREF(value);
2843 Py_XDECREF(traceback);
2844 }
2845}
2846
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002847static int
Fred Drake5755ce62001-06-27 19:19:46 +00002848call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2849 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002850{
Fred Drake5755ce62001-06-27 19:19:46 +00002851 register PyThreadState *tstate = frame->f_tstate;
2852 int result;
2853 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002854 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002855 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002856 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002857 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002858 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2859 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002860 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002861 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002862}
2863
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002864static void
2865maybe_call_line_trace(int opcode, Py_tracefunc func, PyObject *obj,
2866 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2867{
2868 /* The theory of SET_LINENO-less tracing.
2869
2870 In a nutshell, we use the co_lnotab field of the code object
2871 to tell when execution has moved onto a different line.
2872
2873 As mentioned above, the basic idea is so set things up so
2874 that
2875
2876 *instr_lb <= frame->f_lasti < *instr_ub
2877
2878 is true so long as execution does not change lines.
2879
2880 This is all fairly simple. Digging the information out of
2881 co_lnotab takes some work, but is conceptually clear.
2882
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002883 Somewhat harder to explain is why we don't *always* call the
2884 line trace function when the above test fails.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002885
2886 Consider this code:
2887
2888 1: def f(a):
2889 2: if a:
2890 3: print 1
2891 4: else:
2892 5: print 2
2893
2894 which compiles to this:
2895
2896 2 0 LOAD_FAST 0 (a)
2897 3 JUMP_IF_FALSE 9 (to 15)
2898 6 POP_TOP
2899
2900 3 7 LOAD_CONST 1 (1)
2901 10 PRINT_ITEM
2902 11 PRINT_NEWLINE
2903 12 JUMP_FORWARD 6 (to 21)
2904 >> 15 POP_TOP
2905
2906 5 16 LOAD_CONST 2 (2)
2907 19 PRINT_ITEM
2908 20 PRINT_NEWLINE
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002909 >> 21 LOAD_CONST 0 (None)
2910 24 RETURN_VALUE
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002911
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002912 If 'a' is false, execution will jump to instruction at offset
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002913 15 and the co_lnotab will claim that execution has moved to
2914 line 3. This is at best misleading. In this case we could
2915 associate the POP_TOP with line 4, but that doesn't make
2916 sense in all cases (I think).
2917
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002918 What we do is only call the line trace function if the co_lnotab
2919 indicates we have jumped to the *start* of a line, i.e. if the
2920 current instruction offset matches the offset given for the
2921 start of a line by the co_lnotab.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002922
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002923 This also takes care of the situation where 'a' is true.
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002924 Execution will jump from instruction offset 12 to offset 21.
2925 Then the co_lnotab would imply that execution has moved to line
2926 5, which is again misleading.
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002927
2928 Why do we set f_lineno when tracing? Well, consider the code
2929 above when 'a' is true. If stepping through this with 'n' in
2930 pdb, you would stop at line 1 with a "call" type event, then
2931 line events on lines 2 and 3, then a "return" type event -- but
2932 you would be shown line 5 during this event. This is a change
2933 from the behaviour in 2.2 and before, and I've found it
2934 confusing in practice. By setting and using f_lineno when
2935 tracing, one can report a line number different from that
2936 suggested by f_lasti on this one occasion where it's desirable.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002937 */
2938
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002939 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002940 PyCodeObject* co = frame->f_code;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002941 int size, addr, line;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002942 unsigned char* p;
2943
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002944 size = PyString_GET_SIZE(co->co_lnotab) / 2;
2945 p = (unsigned char*)PyString_AS_STRING(co->co_lnotab);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002946
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002947 addr = 0;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002948 line = co->co_firstlineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002949
2950 /* possible optimization: if f->f_lasti == instr_ub
2951 (likely to be a common case) then we already know
2952 instr_lb -- if we stored the matching value of p
2953 somwhere we could skip the first while loop. */
2954
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002955 /* see comments in compile.c for the description of
2956 co_lnotab. A point to remember: increments to p
2957 should come in pairs -- although we don't care about
2958 the line increments here, treating them as byte
2959 increments gets confusing, to say the least. */
2960
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002961 while (size > 0) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002962 if (addr + *p > frame->f_lasti)
2963 break;
2964 addr += *p++;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002965 line += *p++;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002966 --size;
2967 }
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002968 if (addr == frame->f_lasti) {
2969 frame->f_lineno = line;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002970 call_trace(func, obj, frame,
2971 PyTrace_LINE, Py_None);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002972 }
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002973 *instr_lb = addr;
2974 if (size > 0) {
2975 while (--size >= 0) {
2976 addr += *p++;
2977 if (*p++)
2978 break;
2979 }
2980 *instr_ub = addr;
2981 }
2982 else {
2983 *instr_ub = INT_MAX;
2984 }
2985 }
2986}
2987
Fred Drake5755ce62001-06-27 19:19:46 +00002988void
2989PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002990{
Fred Drake5755ce62001-06-27 19:19:46 +00002991 PyThreadState *tstate = PyThreadState_Get();
2992 PyObject *temp = tstate->c_profileobj;
2993 Py_XINCREF(arg);
2994 tstate->c_profilefunc = NULL;
2995 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002996 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002997 Py_XDECREF(temp);
2998 tstate->c_profilefunc = func;
2999 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003000 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003001}
3002
3003void
3004PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3005{
3006 PyThreadState *tstate = PyThreadState_Get();
3007 PyObject *temp = tstate->c_traceobj;
3008 Py_XINCREF(arg);
3009 tstate->c_tracefunc = NULL;
3010 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003011 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003012 Py_XDECREF(temp);
3013 tstate->c_tracefunc = func;
3014 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003015 tstate->use_tracing = ((func != NULL)
3016 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003017}
3018
Guido van Rossumb209a111997-04-29 18:18:01 +00003019PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003020PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003021{
Guido van Rossum25ce5661997-08-02 03:10:38 +00003022 PyThreadState *tstate = PyThreadState_Get();
3023 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003024 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00003025 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003026 else
3027 return current_frame->f_builtins;
3028}
3029
Guido van Rossumb209a111997-04-29 18:18:01 +00003030PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003031PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003032{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003033 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00003034 if (current_frame == NULL)
3035 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003036 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003037 return current_frame->f_locals;
3038}
3039
Guido van Rossumb209a111997-04-29 18:18:01 +00003040PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003041PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003042{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003043 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003044 if (current_frame == NULL)
3045 return NULL;
3046 else
3047 return current_frame->f_globals;
3048}
3049
Guido van Rossumb209a111997-04-29 18:18:01 +00003050PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003051PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003052{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003053 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00003054 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00003055}
3056
Guido van Rossum6135a871995-01-09 17:53:26 +00003057int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003059{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003060 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003061 return current_frame == NULL ? 0 : current_frame->f_restricted;
3062}
3063
Guido van Rossumbe270261997-05-22 22:26:18 +00003064int
Tim Peters5ba58662001-07-16 02:29:45 +00003065PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003066{
3067 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00003068 int result = 0;
3069
3070 if (current_frame != NULL) {
3071 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003072 const int compilerflags = codeflags & PyCF_MASK;
3073 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003074 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003075 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003076 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003077#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003078 if (codeflags & CO_GENERATOR_ALLOWED) {
3079 result = 1;
3080 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3081 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003082#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003083 }
3084 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003085}
3086
3087int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003088Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089{
Guido van Rossumb209a111997-04-29 18:18:01 +00003090 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003091 if (f == NULL)
3092 return 0;
3093 if (!PyFile_SoftSpace(f, 0))
3094 return 0;
3095 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003096}
3097
Guido van Rossum3f5da241990-12-20 15:06:42 +00003098
Guido van Rossum681d79a1995-07-18 14:51:37 +00003099/* External interface to call any callable object.
3100 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003101
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003102#undef PyEval_CallObject
3103/* for backward compatibility: export this interface */
3104
Guido van Rossumb209a111997-04-29 18:18:01 +00003105PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003106PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003107{
Guido van Rossumb209a111997-04-29 18:18:01 +00003108 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003109}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003110#define PyEval_CallObject(func,arg) \
3111 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003112
Guido van Rossumb209a111997-04-29 18:18:01 +00003113PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003114PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003115{
Jeremy Hylton52820442001-01-03 23:52:36 +00003116 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003117
3118 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003119 arg = PyTuple_New(0);
3120 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003121 PyErr_SetString(PyExc_TypeError,
3122 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003123 return NULL;
3124 }
3125 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003126 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003127
Guido van Rossumb209a111997-04-29 18:18:01 +00003128 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003129 PyErr_SetString(PyExc_TypeError,
3130 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003131 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003132 return NULL;
3133 }
3134
Tim Peters6d6c1a32001-08-02 04:15:00 +00003135 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003136 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003137 return result;
3138}
3139
Tim Peters6d6c1a32001-08-02 04:15:00 +00003140char *
3141PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003142{
3143 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003144 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003145 else if (PyFunction_Check(func))
3146 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3147 else if (PyCFunction_Check(func))
3148 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3149 else if (PyClass_Check(func))
3150 return PyString_AsString(((PyClassObject*)func)->cl_name);
3151 else if (PyInstance_Check(func)) {
3152 return PyString_AsString(
3153 ((PyInstanceObject*)func)->in_class->cl_name);
3154 } else {
3155 return func->ob_type->tp_name;
3156 }
3157}
3158
Tim Peters6d6c1a32001-08-02 04:15:00 +00003159char *
3160PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003161{
3162 if (PyMethod_Check(func))
3163 return "()";
3164 else if (PyFunction_Check(func))
3165 return "()";
3166 else if (PyCFunction_Check(func))
3167 return "()";
3168 else if (PyClass_Check(func))
3169 return " constructor";
3170 else if (PyInstance_Check(func)) {
3171 return " instance";
3172 } else {
3173 return " object";
3174 }
3175}
3176
Jeremy Hylton52820442001-01-03 23:52:36 +00003177#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3178
Jeremy Hylton192690e2002-08-16 18:36:11 +00003179void
3180err_args(PyObject *func, int flags, int nargs)
3181{
3182 if (flags & METH_NOARGS)
3183 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003184 "%.200s() takes no arguments (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003185 ((PyCFunctionObject *)func)->m_ml->ml_name,
3186 nargs);
3187 else
3188 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003189 "%.200s() takes exactly one argument (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003190 ((PyCFunctionObject *)func)->m_ml->ml_name,
3191 nargs);
3192}
3193
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003194static PyObject *
3195call_function(PyObject ***pp_stack, int oparg)
3196{
3197 int na = oparg & 0xff;
3198 int nk = (oparg>>8) & 0xff;
3199 int n = na + 2 * nk;
3200 PyObject **pfunc = (*pp_stack) - n - 1;
3201 PyObject *func = *pfunc;
3202 PyObject *x, *w;
3203
3204 /* Always dispatch PyCFunction first, because
3205 these are presumed to be the most frequent
3206 callable object.
3207 */
3208 if (PyCFunction_Check(func) && nk == 0) {
3209 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003210 if (flags & (METH_NOARGS | METH_O)) {
3211 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3212 PyObject *self = PyCFunction_GET_SELF(func);
3213 if (flags & METH_NOARGS && na == 0)
3214 x = (*meth)(self, NULL);
3215 else if (flags & METH_O && na == 1) {
3216 PyObject *arg = EXT_POP(*pp_stack);
3217 x = (*meth)(self, arg);
3218 Py_DECREF(arg);
3219 }
3220 else {
3221 err_args(func, flags, na);
3222 x = NULL;
3223 }
3224 }
3225 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003226 PyObject *callargs;
3227 callargs = load_args(pp_stack, na);
3228 x = PyCFunction_Call(func, callargs, NULL);
3229 Py_XDECREF(callargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003230 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003231 } else {
3232 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3233 /* optimize access to bound methods */
3234 PyObject *self = PyMethod_GET_SELF(func);
3235 Py_INCREF(self);
3236 func = PyMethod_GET_FUNCTION(func);
3237 Py_INCREF(func);
3238 Py_DECREF(*pfunc);
3239 *pfunc = self;
3240 na++;
3241 n++;
3242 } else
3243 Py_INCREF(func);
3244 if (PyFunction_Check(func))
3245 x = fast_function(func, pp_stack, n, na, nk);
3246 else
3247 x = do_call(func, pp_stack, na, nk);
3248 Py_DECREF(func);
3249 }
3250
3251 while ((*pp_stack) > pfunc) {
3252 w = EXT_POP(*pp_stack);
3253 Py_DECREF(w);
3254 }
3255 return x;
3256}
3257
Jeremy Hylton192690e2002-08-16 18:36:11 +00003258/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003259 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton52820442001-01-03 23:52:36 +00003260*/
3261
3262static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003263fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003264{
3265 PyObject *co = PyFunction_GET_CODE(func);
3266 PyObject *globals = PyFunction_GET_GLOBALS(func);
3267 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003268 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003269 PyObject **d = NULL;
3270 int nd = 0;
3271
3272 if (argdefs != NULL) {
3273 d = &PyTuple_GET_ITEM(argdefs, 0);
3274 nd = ((PyTupleObject *)argdefs)->ob_size;
3275 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003276 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003277 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003278 (*pp_stack)-2*nk, nk, d, nd,
3279 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003280}
3281
3282static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003283update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3284 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003285{
3286 PyObject *kwdict = NULL;
3287 if (orig_kwdict == NULL)
3288 kwdict = PyDict_New();
3289 else {
3290 kwdict = PyDict_Copy(orig_kwdict);
3291 Py_DECREF(orig_kwdict);
3292 }
3293 if (kwdict == NULL)
3294 return NULL;
3295 while (--nk >= 0) {
3296 int err;
3297 PyObject *value = EXT_POP(*pp_stack);
3298 PyObject *key = EXT_POP(*pp_stack);
3299 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003300 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003301 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003302 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003303 PyEval_GetFuncName(func),
3304 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003305 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003306 Py_DECREF(key);
3307 Py_DECREF(value);
3308 Py_DECREF(kwdict);
3309 return NULL;
3310 }
3311 err = PyDict_SetItem(kwdict, key, value);
3312 Py_DECREF(key);
3313 Py_DECREF(value);
3314 if (err) {
3315 Py_DECREF(kwdict);
3316 return NULL;
3317 }
3318 }
3319 return kwdict;
3320}
3321
3322static PyObject *
3323update_star_args(int nstack, int nstar, PyObject *stararg,
3324 PyObject ***pp_stack)
3325{
3326 PyObject *callargs, *w;
3327
3328 callargs = PyTuple_New(nstack + nstar);
3329 if (callargs == NULL) {
3330 return NULL;
3331 }
3332 if (nstar) {
3333 int i;
3334 for (i = 0; i < nstar; i++) {
3335 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3336 Py_INCREF(a);
3337 PyTuple_SET_ITEM(callargs, nstack + i, a);
3338 }
3339 }
3340 while (--nstack >= 0) {
3341 w = EXT_POP(*pp_stack);
3342 PyTuple_SET_ITEM(callargs, nstack, w);
3343 }
3344 return callargs;
3345}
3346
3347static PyObject *
3348load_args(PyObject ***pp_stack, int na)
3349{
3350 PyObject *args = PyTuple_New(na);
3351 PyObject *w;
3352
3353 if (args == NULL)
3354 return NULL;
3355 while (--na >= 0) {
3356 w = EXT_POP(*pp_stack);
3357 PyTuple_SET_ITEM(args, na, w);
3358 }
3359 return args;
3360}
3361
3362static PyObject *
3363do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3364{
3365 PyObject *callargs = NULL;
3366 PyObject *kwdict = NULL;
3367 PyObject *result = NULL;
3368
3369 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003370 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003371 if (kwdict == NULL)
3372 goto call_fail;
3373 }
3374 callargs = load_args(pp_stack, na);
3375 if (callargs == NULL)
3376 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003377 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003378 call_fail:
3379 Py_XDECREF(callargs);
3380 Py_XDECREF(kwdict);
3381 return result;
3382}
3383
3384static PyObject *
3385ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3386{
3387 int nstar = 0;
3388 PyObject *callargs = NULL;
3389 PyObject *stararg = NULL;
3390 PyObject *kwdict = NULL;
3391 PyObject *result = NULL;
3392
3393 if (flags & CALL_FLAG_KW) {
3394 kwdict = EXT_POP(*pp_stack);
3395 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003396 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003397 "%s%s argument after ** "
3398 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003399 PyEval_GetFuncName(func),
3400 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003401 goto ext_call_fail;
3402 }
3403 }
3404 if (flags & CALL_FLAG_VAR) {
3405 stararg = EXT_POP(*pp_stack);
3406 if (!PyTuple_Check(stararg)) {
3407 PyObject *t = NULL;
3408 t = PySequence_Tuple(stararg);
3409 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003410 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3411 PyErr_Format(PyExc_TypeError,
3412 "%s%s argument after * "
3413 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003414 PyEval_GetFuncName(func),
3415 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003416 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003417 goto ext_call_fail;
3418 }
3419 Py_DECREF(stararg);
3420 stararg = t;
3421 }
3422 nstar = PyTuple_GET_SIZE(stararg);
3423 }
3424 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003425 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003426 if (kwdict == NULL)
3427 goto ext_call_fail;
3428 }
3429 callargs = update_star_args(na, nstar, stararg, pp_stack);
3430 if (callargs == NULL)
3431 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003432 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003433 ext_call_fail:
3434 Py_XDECREF(callargs);
3435 Py_XDECREF(kwdict);
3436 Py_XDECREF(stararg);
3437 return result;
3438}
3439
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003440#define SLICE_ERROR_MSG \
3441 "standard sequence type does not support step size other than one"
3442
Tim Peterscb479e72001-12-16 19:11:44 +00003443/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3444 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3445 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3446*/
Tim Petersb5196382001-12-16 19:44:20 +00003447/* Note: If v is NULL, return success without storing into *pi. This
3448 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3449 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003450*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003451int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003452_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453{
Tim Petersb5196382001-12-16 19:44:20 +00003454 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003455 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003456 if (PyInt_Check(v)) {
3457 x = PyInt_AsLong(v);
3458 } else if (PyLong_Check(v)) {
3459 x = PyLong_AsLong(v);
3460 if (x==-1 && PyErr_Occurred()) {
3461 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003462 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003463
Guido van Rossumac7be682001-01-17 15:42:30 +00003464 if (!PyErr_ExceptionMatches(
3465 PyExc_OverflowError)) {
3466 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003467 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003468 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003469 }
3470
Guido van Rossumac7be682001-01-17 15:42:30 +00003471 /* Clear the OverflowError */
3472 PyErr_Clear();
3473
3474 /* It's an overflow error, so we need to
3475 check the sign of the long integer,
3476 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003477 the error. */
3478
3479 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003480 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003481 if (long_zero == NULL)
3482 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003483
3484 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003485 cmp = PyObject_RichCompareBool(v, long_zero,
3486 Py_GT);
3487 Py_DECREF(long_zero);
3488 if (cmp < 0)
3489 return 0;
3490 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003491 x = INT_MAX;
3492 else
3493 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003494 }
3495 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003496 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003497 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003498 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003500 /* Truncate -- very long indices are truncated anyway */
3501 if (x > INT_MAX)
3502 x = INT_MAX;
3503 else if (x < -INT_MAX)
3504 x = 0;
3505 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003507 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508}
3509
Guido van Rossum50d756e2001-08-18 17:43:36 +00003510#undef ISINT
3511#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3512
Guido van Rossumb209a111997-04-29 18:18:01 +00003513static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003514apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003516 PyTypeObject *tp = u->ob_type;
3517 PySequenceMethods *sq = tp->tp_as_sequence;
3518
3519 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3520 int ilow = 0, ihigh = INT_MAX;
3521 if (!_PyEval_SliceIndex(v, &ilow))
3522 return NULL;
3523 if (!_PyEval_SliceIndex(w, &ihigh))
3524 return NULL;
3525 return PySequence_GetSlice(u, ilow, ihigh);
3526 }
3527 else {
3528 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003529 if (slice != NULL) {
3530 PyObject *res = PyObject_GetItem(u, slice);
3531 Py_DECREF(slice);
3532 return res;
3533 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003534 else
3535 return NULL;
3536 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003537}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003538
3539static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003540assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3541 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003543 PyTypeObject *tp = u->ob_type;
3544 PySequenceMethods *sq = tp->tp_as_sequence;
3545
3546 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3547 int ilow = 0, ihigh = INT_MAX;
3548 if (!_PyEval_SliceIndex(v, &ilow))
3549 return -1;
3550 if (!_PyEval_SliceIndex(w, &ihigh))
3551 return -1;
3552 if (x == NULL)
3553 return PySequence_DelSlice(u, ilow, ihigh);
3554 else
3555 return PySequence_SetSlice(u, ilow, ihigh, x);
3556 }
3557 else {
3558 PyObject *slice = PySlice_New(v, w, NULL);
3559 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003560 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003561 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003562 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003563 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003564 res = PyObject_DelItem(u, slice);
3565 Py_DECREF(slice);
3566 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003567 }
3568 else
3569 return -1;
3570 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003571}
3572
Guido van Rossumb209a111997-04-29 18:18:01 +00003573static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003574cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575{
Guido van Rossumac7be682001-01-17 15:42:30 +00003576 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003577 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003578 case PyCmp_IS:
3579 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003580 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003581 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003582 res = !res;
3583 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003584 case PyCmp_IN:
3585 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003586 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003587 if (res < 0)
3588 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003589 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003590 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003592 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003593 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003594 break;
3595 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003596 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003597 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003598 v = res ? Py_True : Py_False;
3599 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600 return v;
3601}
3602
Thomas Wouters52152252000-08-17 22:55:00 +00003603static PyObject *
3604import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003605{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003606 PyObject *x;
3607
3608 x = PyObject_GetAttr(v, name);
3609 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003610 PyErr_Format(PyExc_ImportError,
3611 "cannot import name %.230s",
3612 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003613 }
Thomas Wouters52152252000-08-17 22:55:00 +00003614 return x;
3615}
Guido van Rossumac7be682001-01-17 15:42:30 +00003616
Thomas Wouters52152252000-08-17 22:55:00 +00003617static int
3618import_all_from(PyObject *locals, PyObject *v)
3619{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003620 PyObject *all = PyObject_GetAttrString(v, "__all__");
3621 PyObject *dict, *name, *value;
3622 int skip_leading_underscores = 0;
3623 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003624
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003625 if (all == NULL) {
3626 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3627 return -1; /* Unexpected error */
3628 PyErr_Clear();
3629 dict = PyObject_GetAttrString(v, "__dict__");
3630 if (dict == NULL) {
3631 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3632 return -1;
3633 PyErr_SetString(PyExc_ImportError,
3634 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003635 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003636 }
3637 all = PyMapping_Keys(dict);
3638 Py_DECREF(dict);
3639 if (all == NULL)
3640 return -1;
3641 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003642 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003643
3644 for (pos = 0, err = 0; ; pos++) {
3645 name = PySequence_GetItem(all, pos);
3646 if (name == NULL) {
3647 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3648 err = -1;
3649 else
3650 PyErr_Clear();
3651 break;
3652 }
3653 if (skip_leading_underscores &&
3654 PyString_Check(name) &&
3655 PyString_AS_STRING(name)[0] == '_')
3656 {
3657 Py_DECREF(name);
3658 continue;
3659 }
3660 value = PyObject_GetAttr(v, name);
3661 if (value == NULL)
3662 err = -1;
3663 else
3664 err = PyDict_SetItem(locals, name, value);
3665 Py_DECREF(name);
3666 Py_XDECREF(value);
3667 if (err != 0)
3668 break;
3669 }
3670 Py_DECREF(all);
3671 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003672}
3673
Guido van Rossumb209a111997-04-29 18:18:01 +00003674static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003675build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003676{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003677 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003678
3679 if (PyDict_Check(methods))
3680 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003681 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003682 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003683 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3684 base = PyTuple_GET_ITEM(bases, 0);
3685 metaclass = PyObject_GetAttrString(base, "__class__");
3686 if (metaclass == NULL) {
3687 PyErr_Clear();
3688 metaclass = (PyObject *)base->ob_type;
3689 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003690 }
3691 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003692 else {
3693 PyObject *g = PyEval_GetGlobals();
3694 if (g != NULL && PyDict_Check(g))
3695 metaclass = PyDict_GetItemString(g, "__metaclass__");
3696 if (metaclass == NULL)
3697 metaclass = (PyObject *) &PyClass_Type;
3698 Py_INCREF(metaclass);
3699 }
3700 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3701 Py_DECREF(metaclass);
3702 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003703}
3704
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003705static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003706exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3707 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003708{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003709 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003710 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003711 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003712
Guido van Rossumb209a111997-04-29 18:18:01 +00003713 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3714 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003715 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003716 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003717 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003718 locals = PyTuple_GetItem(prog, 2);
3719 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003720 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003721 if (globals == Py_None) {
3722 globals = PyEval_GetGlobals();
3723 if (locals == Py_None) {
3724 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003725 plain = 1;
3726 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003727 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003728 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003729 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003730 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003731 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003732 !PyCode_Check(prog) &&
3733 !PyFile_Check(prog)) {
3734 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003735 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003736 return -1;
3737 }
Fred Drake661ea262000-10-24 19:57:45 +00003738 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003739 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003740 "exec: arg 2 must be a dictionary or None");
3741 return -1;
3742 }
3743 if (!PyDict_Check(locals)) {
3744 PyErr_SetString(PyExc_TypeError,
3745 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003746 return -1;
3747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003748 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003749 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003750 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003751 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3752 PyErr_SetString(PyExc_TypeError,
3753 "code object passed to exec may not contain free variables");
3754 return -1;
3755 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003756 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003757 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003758 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003759 FILE *fp = PyFile_AsFile(prog);
3760 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003761 PyCompilerFlags cf;
3762 cf.cf_flags = 0;
3763 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003764 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3765 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003766 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003767 v = PyRun_File(fp, name, Py_file_input, globals,
3768 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003769 }
3770 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003771 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003772 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003773 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003774 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003775 cf.cf_flags = 0;
3776 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003777 v = PyRun_StringFlags(str, Py_file_input, globals,
3778 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003779 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003780 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003781 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003782 if (plain)
3783 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003784 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003785 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003786 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003787 return 0;
3788}
Guido van Rossum24c13741995-02-14 09:42:43 +00003789
Guido van Rossumac7be682001-01-17 15:42:30 +00003790static void
Paul Prescode68140d2000-08-30 20:25:01 +00003791format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3792{
3793 char *obj_str;
3794
3795 if (!obj)
3796 return;
3797
3798 obj_str = PyString_AsString(obj);
3799 if (!obj_str)
3800 return;
3801
3802 PyErr_Format(exc, format_str, obj_str);
3803}
Guido van Rossum950361c1997-01-24 13:49:28 +00003804
3805#ifdef DYNAMIC_EXECUTION_PROFILE
3806
Skip Montanarof118cb12001-10-15 20:51:38 +00003807static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003808getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003809{
3810 int i;
3811 PyObject *l = PyList_New(256);
3812 if (l == NULL) return NULL;
3813 for (i = 0; i < 256; i++) {
3814 PyObject *x = PyInt_FromLong(a[i]);
3815 if (x == NULL) {
3816 Py_DECREF(l);
3817 return NULL;
3818 }
3819 PyList_SetItem(l, i, x);
3820 }
3821 for (i = 0; i < 256; i++)
3822 a[i] = 0;
3823 return l;
3824}
3825
3826PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003827_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003828{
3829#ifndef DXPAIRS
3830 return getarray(dxp);
3831#else
3832 int i;
3833 PyObject *l = PyList_New(257);
3834 if (l == NULL) return NULL;
3835 for (i = 0; i < 257; i++) {
3836 PyObject *x = getarray(dxpairs[i]);
3837 if (x == NULL) {
3838 Py_DECREF(l);
3839 return NULL;
3840 }
3841 PyList_SetItem(l, i, x);
3842 }
3843 return l;
3844#endif
3845}
3846
3847#endif