blob: afc480e151e29bcde7a700a1e6670298fa8ffc40 [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 */
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000639 --tstate->recursion_depth;
640 tstate->frame = f->f_back;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000641 return NULL;
642 }
643 }
644 if (tstate->c_profilefunc != NULL) {
645 /* Similar for c_profilefunc, except it needn't
646 return itself and isn't called for "line" events */
647 if (call_trace(tstate->c_profilefunc,
648 tstate->c_profileobj,
649 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000650 /* Profile function raised an error */
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000651 --tstate->recursion_depth;
652 tstate->frame = f->f_back;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000653 return NULL;
654 }
655 }
656 }
657
Tim Peters5ca576e2001-06-18 22:08:13 +0000658#ifdef LLTRACE
659 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
660#endif
661#if defined(Py_DEBUG) || defined(LLTRACE)
662 filename = PyString_AsString(co->co_filename);
663#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000664
Guido van Rossum374a9221991-04-04 10:40:29 +0000665 why = WHY_NOT;
666 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000667 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000668 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000669
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 for (;;) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000671 assert(stack_pointer >= f->f_valuestack); /* else underflow */
672 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
673
Guido van Rossuma027efa1997-05-05 20:56:21 +0000674 /* Do periodic things. Doing this every time through
675 the loop would add too much overhead, so we do it
676 only every Nth instruction. We also do it if
677 ``things_to_do'' is set, i.e. when an asynchronous
678 event needs attention (e.g. a signal handler or
679 async I/O handler); see Py_AddPendingCall() and
680 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000681
Skip Montanarod581d772002-09-03 20:10:45 +0000682 if (--_Py_Ticker < 0) {
683 _Py_Ticker = _Py_CheckInterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000684 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000685 if (Py_MakePendingCalls() < 0) {
686 why = WHY_EXCEPTION;
687 goto on_error;
688 }
689 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000690#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000691 /* If we have true signals, the signal handler
692 will call Py_AddPendingCall() so we don't
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000693 have to call PyErr_CheckSignals(). On the
694 Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000695 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000696 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 goto on_error;
698 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000699#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000700
Guido van Rossume59214e1994-08-30 08:01:59 +0000701#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000702 if (interpreter_lock) {
703 /* Give another thread a chance */
704
Guido van Rossum25ce5661997-08-02 03:10:38 +0000705 if (PyThreadState_Swap(NULL) != tstate)
706 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000707 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000708
709 /* Other threads may run now */
710
Guido van Rossum65d5b571998-12-21 19:32:43 +0000711 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000712 if (PyThreadState_Swap(tstate) != NULL)
713 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000714 }
715#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000717
Neil Schemenauer63543862002-02-17 19:10:14 +0000718 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000720
Guido van Rossum99bec951992-09-03 20:29:45 +0000721 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 opcode = NEXTOP();
724 if (HAS_ARG(opcode))
725 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000726 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000727#ifdef DYNAMIC_EXECUTION_PROFILE
728#ifdef DXPAIRS
729 dxpairs[lastopcode][opcode]++;
730 lastopcode = opcode;
731#endif
732 dxp[opcode]++;
733#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000734
Guido van Rossum96a42c81992-01-12 02:29:51 +0000735#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000737
Guido van Rossum96a42c81992-01-12 02:29:51 +0000738 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 if (HAS_ARG(opcode)) {
740 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000741 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 }
743 else {
744 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000745 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000746 }
747 }
748#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000749
750 /* line-by-line tracing support */
751
752 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
753 /* see maybe_call_line_trace
754 for expository comments */
755 maybe_call_line_trace(opcode,
756 tstate->c_tracefunc,
757 tstate->c_traceobj,
758 f, &instr_lb, &instr_ub);
759 }
760
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000762
Guido van Rossum374a9221991-04-04 10:40:29 +0000763 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000764
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 /* BEWARE!
766 It is essential that any operation that fails sets either
767 x to NULL, err to nonzero, or why to anything but WHY_NOT,
768 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000769
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000771
Neil Schemenauer63543862002-02-17 19:10:14 +0000772 case LOAD_FAST:
773 x = GETLOCAL(oparg);
774 if (x != NULL) {
775 Py_INCREF(x);
776 PUSH(x);
777 goto fast_next_opcode;
778 }
779 format_exc_check_arg(PyExc_UnboundLocalError,
780 UNBOUNDLOCAL_ERROR_MSG,
781 PyTuple_GetItem(co->co_varnames, oparg));
782 break;
783
784 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000785 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000786 Py_INCREF(x);
787 PUSH(x);
788 goto fast_next_opcode;
789
790 case STORE_FAST:
791 v = POP();
792 SETLOCAL(oparg, v);
793 goto fast_next_opcode;
794
Guido van Rossum374a9221991-04-04 10:40:29 +0000795 case POP_TOP:
796 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000797 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000798 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000799
Guido van Rossum374a9221991-04-04 10:40:29 +0000800 case ROT_TWO:
801 v = POP();
802 w = POP();
803 PUSH(v);
804 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000805 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000806
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 case ROT_THREE:
808 v = POP();
809 w = POP();
810 x = POP();
811 PUSH(v);
812 PUSH(x);
813 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000814 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000815
Thomas Wouters434d0822000-08-24 20:11:32 +0000816 case ROT_FOUR:
817 u = POP();
818 v = POP();
819 w = POP();
820 x = POP();
821 PUSH(u);
822 PUSH(x);
823 PUSH(w);
824 PUSH(v);
825 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000826
Guido van Rossum374a9221991-04-04 10:40:29 +0000827 case DUP_TOP:
828 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000829 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000830 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000831 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000832
Thomas Wouters434d0822000-08-24 20:11:32 +0000833 case DUP_TOPX:
834 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000835 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000836 x = TOP();
837 Py_INCREF(x);
838 PUSH(x);
839 continue;
840 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000841 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000842 Py_INCREF(x);
843 w = TOP();
844 Py_INCREF(w);
845 PUSH(x);
846 PUSH(w);
847 PUSH(x);
848 continue;
849 case 3:
850 x = POP();
851 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000852 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000853 Py_INCREF(w);
854 v = TOP();
855 Py_INCREF(v);
856 PUSH(w);
857 PUSH(x);
858 PUSH(v);
859 PUSH(w);
860 PUSH(x);
861 continue;
862 case 4:
863 x = POP();
864 Py_INCREF(x);
865 w = POP();
866 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000867 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000868 Py_INCREF(v);
869 u = TOP();
870 Py_INCREF(u);
871 PUSH(v);
872 PUSH(w);
873 PUSH(x);
874 PUSH(u);
875 PUSH(v);
876 PUSH(w);
877 PUSH(x);
878 continue;
879 case 5:
880 x = POP();
881 Py_INCREF(x);
882 w = POP();
883 Py_INCREF(w);
884 v = POP();
885 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000886 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000887 Py_INCREF(u);
888 t = TOP();
889 Py_INCREF(t);
890 PUSH(u);
891 PUSH(v);
892 PUSH(w);
893 PUSH(x);
894 PUSH(t);
895 PUSH(u);
896 PUSH(v);
897 PUSH(w);
898 PUSH(x);
899 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000900 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000901 Py_FatalError("invalid argument to DUP_TOPX"
902 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000903 }
Tim Peters35ba6892000-10-11 07:04:49 +0000904 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000905
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 case UNARY_POSITIVE:
907 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000908 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000909 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000913
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 case UNARY_NEGATIVE:
915 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000916 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000919 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000921
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 case UNARY_NOT:
923 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000924 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000925 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000926 if (err == 0) {
927 Py_INCREF(Py_True);
928 PUSH(Py_True);
929 continue;
930 }
931 else if (err > 0) {
932 Py_INCREF(Py_False);
933 PUSH(Py_False);
934 err = 0;
935 continue;
936 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000937 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000938
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 case UNARY_CONVERT:
940 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000941 x = PyObject_Repr(v);
942 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000944 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000946
Guido van Rossum7928cd71991-10-24 14:59:31 +0000947 case UNARY_INVERT:
948 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000949 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000951 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000952 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000953 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000954
Guido van Rossum50564e81996-01-12 01:13:16 +0000955 case BINARY_POWER:
956 w = POP();
957 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000958 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(v);
960 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000961 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000962 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000963 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000964
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 case BINARY_MULTIPLY:
966 w = POP();
967 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000968 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000969 Py_DECREF(v);
970 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000972 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000974
Guido van Rossum374a9221991-04-04 10:40:29 +0000975 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000976 if (!_Py_QnewFlag) {
977 w = POP();
978 v = POP();
979 x = PyNumber_Divide(v, w);
980 Py_DECREF(v);
981 Py_DECREF(w);
982 PUSH(x);
983 if (x != NULL) continue;
984 break;
985 }
986 /* -Qnew is in effect: fall through to
987 BINARY_TRUE_DIVIDE */
988 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000989 w = POP();
990 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000991 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_DECREF(v);
993 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000995 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000997
Guido van Rossum4668b002001-08-08 05:00:18 +0000998 case BINARY_FLOOR_DIVIDE:
999 w = POP();
1000 v = POP();
1001 x = PyNumber_FloorDivide(v, w);
1002 Py_DECREF(v);
1003 Py_DECREF(w);
1004 PUSH(x);
1005 if (x != NULL) continue;
1006 break;
1007
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 case BINARY_MODULO:
1009 w = POP();
1010 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001011 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001012 Py_DECREF(v);
1013 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001015 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001017
Guido van Rossum374a9221991-04-04 10:40:29 +00001018 case BINARY_ADD:
1019 w = POP();
1020 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001021 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001022 /* INLINE: int + int */
1023 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001024 a = PyInt_AS_LONG(v);
1025 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001026 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001027 if ((i^a) < 0 && (i^b) < 0)
1028 goto slow_add;
1029 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001030 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001031 else {
1032 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001033 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001034 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 Py_DECREF(v);
1036 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001038 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001040
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 case BINARY_SUBTRACT:
1042 w = POP();
1043 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001044 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001045 /* INLINE: int - int */
1046 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001047 a = PyInt_AS_LONG(v);
1048 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001049 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001050 if ((i^a) < 0 && (i^~b) < 0)
1051 goto slow_sub;
1052 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001053 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001054 else {
1055 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001056 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001057 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001058 Py_DECREF(v);
1059 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001061 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001062 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001063
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 case BINARY_SUBSCR:
1065 w = POP();
1066 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001067 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001068 /* INLINE: list[int] */
1069 long i = PyInt_AsLong(w);
1070 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001071 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001072 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001073 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001074 PyErr_SetString(PyExc_IndexError,
1075 "list index out of range");
1076 x = NULL;
1077 }
1078 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001079 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001080 Py_INCREF(x);
1081 }
1082 }
1083 else
1084 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001085 Py_DECREF(v);
1086 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001088 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001089 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001090
Guido van Rossum7928cd71991-10-24 14:59:31 +00001091 case BINARY_LSHIFT:
1092 w = POP();
1093 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001094 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001095 Py_DECREF(v);
1096 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001097 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001098 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001099 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001100
Guido van Rossum7928cd71991-10-24 14:59:31 +00001101 case BINARY_RSHIFT:
1102 w = POP();
1103 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001104 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001105 Py_DECREF(v);
1106 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001107 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001108 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001109 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001110
Guido van Rossum7928cd71991-10-24 14:59:31 +00001111 case BINARY_AND:
1112 w = POP();
1113 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001114 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001115 Py_DECREF(v);
1116 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001117 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001118 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001119 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001120
Guido van Rossum7928cd71991-10-24 14:59:31 +00001121 case BINARY_XOR:
1122 w = POP();
1123 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001124 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001125 Py_DECREF(v);
1126 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001127 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001128 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001129 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001130
Guido van Rossum7928cd71991-10-24 14:59:31 +00001131 case BINARY_OR:
1132 w = POP();
1133 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001134 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001135 Py_DECREF(v);
1136 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001137 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001138 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001139 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001140
1141 case INPLACE_POWER:
1142 w = POP();
1143 v = POP();
1144 x = PyNumber_InPlacePower(v, w, Py_None);
1145 Py_DECREF(v);
1146 Py_DECREF(w);
1147 PUSH(x);
1148 if (x != NULL) continue;
1149 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001150
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 case INPLACE_MULTIPLY:
1152 w = POP();
1153 v = POP();
1154 x = PyNumber_InPlaceMultiply(v, w);
1155 Py_DECREF(v);
1156 Py_DECREF(w);
1157 PUSH(x);
1158 if (x != NULL) continue;
1159 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001160
Thomas Wouters434d0822000-08-24 20:11:32 +00001161 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001162 if (!_Py_QnewFlag) {
1163 w = POP();
1164 v = POP();
1165 x = PyNumber_InPlaceDivide(v, w);
1166 Py_DECREF(v);
1167 Py_DECREF(w);
1168 PUSH(x);
1169 if (x != NULL) continue;
1170 break;
1171 }
1172 /* -Qnew is in effect: fall through to
1173 INPLACE_TRUE_DIVIDE */
1174 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001175 w = POP();
1176 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001177 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001178 Py_DECREF(v);
1179 Py_DECREF(w);
1180 PUSH(x);
1181 if (x != NULL) continue;
1182 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001183
Guido van Rossum4668b002001-08-08 05:00:18 +00001184 case INPLACE_FLOOR_DIVIDE:
1185 w = POP();
1186 v = POP();
1187 x = PyNumber_InPlaceFloorDivide(v, w);
1188 Py_DECREF(v);
1189 Py_DECREF(w);
1190 PUSH(x);
1191 if (x != NULL) continue;
1192 break;
1193
Thomas Wouters434d0822000-08-24 20:11:32 +00001194 case INPLACE_MODULO:
1195 w = POP();
1196 v = POP();
1197 x = PyNumber_InPlaceRemainder(v, w);
1198 Py_DECREF(v);
1199 Py_DECREF(w);
1200 PUSH(x);
1201 if (x != NULL) continue;
1202 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001203
Thomas Wouters434d0822000-08-24 20:11:32 +00001204 case INPLACE_ADD:
1205 w = POP();
1206 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001207 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001208 /* INLINE: int + int */
1209 register long a, b, i;
1210 a = PyInt_AS_LONG(v);
1211 b = PyInt_AS_LONG(w);
1212 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001213 if ((i^a) < 0 && (i^b) < 0)
1214 goto slow_iadd;
1215 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001216 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001217 else {
1218 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001219 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001220 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001221 Py_DECREF(v);
1222 Py_DECREF(w);
1223 PUSH(x);
1224 if (x != NULL) continue;
1225 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001226
Thomas Wouters434d0822000-08-24 20:11:32 +00001227 case INPLACE_SUBTRACT:
1228 w = POP();
1229 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001230 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001231 /* INLINE: int - int */
1232 register long a, b, i;
1233 a = PyInt_AS_LONG(v);
1234 b = PyInt_AS_LONG(w);
1235 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001236 if ((i^a) < 0 && (i^~b) < 0)
1237 goto slow_isub;
1238 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001239 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001240 else {
1241 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001242 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001243 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001244 Py_DECREF(v);
1245 Py_DECREF(w);
1246 PUSH(x);
1247 if (x != NULL) continue;
1248 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001249
Thomas Wouters434d0822000-08-24 20:11:32 +00001250 case INPLACE_LSHIFT:
1251 w = POP();
1252 v = POP();
1253 x = PyNumber_InPlaceLshift(v, w);
1254 Py_DECREF(v);
1255 Py_DECREF(w);
1256 PUSH(x);
1257 if (x != NULL) continue;
1258 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001259
Thomas Wouters434d0822000-08-24 20:11:32 +00001260 case INPLACE_RSHIFT:
1261 w = POP();
1262 v = POP();
1263 x = PyNumber_InPlaceRshift(v, w);
1264 Py_DECREF(v);
1265 Py_DECREF(w);
1266 PUSH(x);
1267 if (x != NULL) continue;
1268 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001269
Thomas Wouters434d0822000-08-24 20:11:32 +00001270 case INPLACE_AND:
1271 w = POP();
1272 v = POP();
1273 x = PyNumber_InPlaceAnd(v, w);
1274 Py_DECREF(v);
1275 Py_DECREF(w);
1276 PUSH(x);
1277 if (x != NULL) continue;
1278 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001279
Thomas Wouters434d0822000-08-24 20:11:32 +00001280 case INPLACE_XOR:
1281 w = POP();
1282 v = POP();
1283 x = PyNumber_InPlaceXor(v, w);
1284 Py_DECREF(v);
1285 Py_DECREF(w);
1286 PUSH(x);
1287 if (x != NULL) continue;
1288 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001289
Thomas Wouters434d0822000-08-24 20:11:32 +00001290 case INPLACE_OR:
1291 w = POP();
1292 v = POP();
1293 x = PyNumber_InPlaceOr(v, w);
1294 Py_DECREF(v);
1295 Py_DECREF(w);
1296 PUSH(x);
1297 if (x != NULL) continue;
1298 break;
1299
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 case SLICE+0:
1301 case SLICE+1:
1302 case SLICE+2:
1303 case SLICE+3:
1304 if ((opcode-SLICE) & 2)
1305 w = POP();
1306 else
1307 w = NULL;
1308 if ((opcode-SLICE) & 1)
1309 v = POP();
1310 else
1311 v = NULL;
1312 u = POP();
1313 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001314 Py_DECREF(u);
1315 Py_XDECREF(v);
1316 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001318 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001320
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 case STORE_SLICE+0:
1322 case STORE_SLICE+1:
1323 case STORE_SLICE+2:
1324 case STORE_SLICE+3:
1325 if ((opcode-STORE_SLICE) & 2)
1326 w = POP();
1327 else
1328 w = NULL;
1329 if ((opcode-STORE_SLICE) & 1)
1330 v = POP();
1331 else
1332 v = NULL;
1333 u = POP();
1334 t = POP();
1335 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001336 Py_DECREF(t);
1337 Py_DECREF(u);
1338 Py_XDECREF(v);
1339 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001340 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001342
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 case DELETE_SLICE+0:
1344 case DELETE_SLICE+1:
1345 case DELETE_SLICE+2:
1346 case DELETE_SLICE+3:
1347 if ((opcode-DELETE_SLICE) & 2)
1348 w = POP();
1349 else
1350 w = NULL;
1351 if ((opcode-DELETE_SLICE) & 1)
1352 v = POP();
1353 else
1354 v = NULL;
1355 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 Py_DECREF(u);
1359 Py_XDECREF(v);
1360 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001361 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001363
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 case STORE_SUBSCR:
1365 w = POP();
1366 v = POP();
1367 u = POP();
1368 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001369 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 Py_DECREF(u);
1371 Py_DECREF(v);
1372 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001373 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001375
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 case DELETE_SUBSCR:
1377 w = POP();
1378 v = POP();
1379 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001380 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001381 Py_DECREF(v);
1382 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001383 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001385
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 case PRINT_EXPR:
1387 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001388 w = PySys_GetObject("displayhook");
1389 if (w == NULL) {
1390 PyErr_SetString(PyExc_RuntimeError,
1391 "lost sys.displayhook");
1392 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001393 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001394 }
1395 if (err == 0) {
1396 x = Py_BuildValue("(O)", v);
1397 if (x == NULL)
1398 err = -1;
1399 }
1400 if (err == 0) {
1401 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001402 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001403 if (w == NULL)
1404 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001406 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001407 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001408 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001409
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001410 case PRINT_ITEM_TO:
1411 w = stream = POP();
1412 /* fall through to PRINT_ITEM */
1413
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 case PRINT_ITEM:
1415 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001416 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001417 w = PySys_GetObject("stdout");
1418 if (w == NULL) {
1419 PyErr_SetString(PyExc_RuntimeError,
1420 "lost sys.stdout");
1421 err = -1;
1422 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001423 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001424 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001425 err = PyFile_WriteString(" ", w);
1426 if (err == 0)
1427 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001428 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001429 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001430 if (PyString_Check(v)) {
1431 char *s = PyString_AS_STRING(v);
1432 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001433 if (len == 0 ||
1434 !isspace(Py_CHARMASK(s[len-1])) ||
1435 s[len-1] == ' ')
1436 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001437 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001438#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001439 else if (PyUnicode_Check(v)) {
1440 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1441 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001442 if (len == 0 ||
1443 !Py_UNICODE_ISSPACE(s[len-1]) ||
1444 s[len-1] == ' ')
1445 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001446 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001447#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001448 else
1449 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001451 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001452 Py_XDECREF(stream);
1453 stream = NULL;
1454 if (err == 0)
1455 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001457
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001458 case PRINT_NEWLINE_TO:
1459 w = stream = POP();
1460 /* fall through to PRINT_NEWLINE */
1461
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001463 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001464 w = PySys_GetObject("stdout");
1465 if (w == NULL)
1466 PyErr_SetString(PyExc_RuntimeError,
1467 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001468 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001469 if (w != NULL) {
1470 err = PyFile_WriteString("\n", w);
1471 if (err == 0)
1472 PyFile_SoftSpace(w, 0);
1473 }
1474 Py_XDECREF(stream);
1475 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001477
Thomas Wouters434d0822000-08-24 20:11:32 +00001478
1479#ifdef CASE_TOO_BIG
1480 default: switch (opcode) {
1481#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 case BREAK_LOOP:
1483 why = WHY_BREAK;
1484 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001485
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001486 case CONTINUE_LOOP:
1487 retval = PyInt_FromLong(oparg);
1488 why = WHY_CONTINUE;
1489 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001490
Guido van Rossumf10570b1995-07-07 22:53:21 +00001491 case RAISE_VARARGS:
1492 u = v = w = NULL;
1493 switch (oparg) {
1494 case 3:
1495 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001496 /* Fallthrough */
1497 case 2:
1498 v = POP(); /* value */
1499 /* Fallthrough */
1500 case 1:
1501 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001502 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001503 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001504 break;
1505 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001506 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001507 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001508 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001509 break;
1510 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001512
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001514 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001515 PyErr_SetString(PyExc_SystemError,
1516 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001517 break;
1518 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001519 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001522
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 case RETURN_VALUE:
1524 retval = POP();
1525 why = WHY_RETURN;
1526 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001527
Tim Peters5ca576e2001-06-18 22:08:13 +00001528 case YIELD_VALUE:
1529 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001530 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001531 why = WHY_YIELD;
1532 break;
1533
1534
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001535 case EXEC_STMT:
1536 w = POP();
1537 v = POP();
1538 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001539 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001540 Py_DECREF(u);
1541 Py_DECREF(v);
1542 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001543 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001544
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 case POP_BLOCK:
1546 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 while (STACK_LEVEL() > b->b_level) {
1549 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 }
1552 }
1553 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001554
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 case END_FINALLY:
1556 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 if (PyInt_Check(v)) {
1558 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001559 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001560 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001561 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 retval = POP();
1563 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001566 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001567 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001569 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001571 else if (v != Py_None) {
1572 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 "'finally' pops bad exception");
1574 why = WHY_EXCEPTION;
1575 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001578
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001580 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001582 w = POP();
1583 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001585 Py_DECREF(u);
1586 Py_DECREF(v);
1587 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001589
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001591 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001594 PyErr_Format(PyExc_SystemError,
1595 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001596 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001597 break;
1598 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 err = PyDict_SetItem(x, w, v);
1600 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001602
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001604 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001606 PyErr_Format(PyExc_SystemError,
1607 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001608 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001609 break;
1610 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001612 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001613 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001614 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001615
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001616 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001617 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001618 if (PyTuple_Check(v)) {
1619 if (PyTuple_Size(v) != oparg) {
1620 PyErr_SetString(PyExc_ValueError,
1621 "unpack tuple of wrong size");
1622 why = WHY_EXCEPTION;
1623 }
1624 else {
1625 for (; --oparg >= 0; ) {
1626 w = PyTuple_GET_ITEM(v, oparg);
1627 Py_INCREF(w);
1628 PUSH(w);
1629 }
1630 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001631 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001632 else if (PyList_Check(v)) {
1633 if (PyList_Size(v) != oparg) {
1634 PyErr_SetString(PyExc_ValueError,
1635 "unpack list of wrong size");
1636 why = WHY_EXCEPTION;
1637 }
1638 else {
1639 for (; --oparg >= 0; ) {
1640 w = PyList_GET_ITEM(v, oparg);
1641 Py_INCREF(w);
1642 PUSH(w);
1643 }
1644 }
1645 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001646 else if (unpack_iterable(v, oparg,
1647 stack_pointer + oparg))
1648 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001649 else {
1650 if (PyErr_ExceptionMatches(PyExc_TypeError))
1651 PyErr_SetString(PyExc_TypeError,
1652 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001653 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001654 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001657
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001659 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 v = POP();
1661 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1663 Py_DECREF(v);
1664 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001666
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001668 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001670 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1671 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001674
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001675 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001676 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001677 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 err = PyDict_SetItem(f->f_globals, w, v);
1679 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001680 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001681
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001682 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001683 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001685 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001686 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001687 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001688
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001690 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001691 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001692 PyErr_Format(PyExc_SystemError,
1693 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001694 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001695 break;
1696 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001699 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001700 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001701 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001703 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001704 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001705 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001706 break;
1707 }
1708 }
1709 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 PUSH(x);
1712 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001713
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001715 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001716 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001717 /* Inline the PyDict_GetItem() calls.
1718 WARNING: this is an extreme speed hack.
1719 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001720 long hash = ((PyStringObject *)w)->ob_shash;
1721 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001722 PyDictObject *d;
1723 d = (PyDictObject *)(f->f_globals);
1724 x = d->ma_lookup(d, w, hash)->me_value;
1725 if (x != NULL) {
1726 Py_INCREF(x);
1727 PUSH(x);
1728 continue;
1729 }
1730 d = (PyDictObject *)(f->f_builtins);
1731 x = d->ma_lookup(d, w, hash)->me_value;
1732 if (x != NULL) {
1733 Py_INCREF(x);
1734 PUSH(x);
1735 continue;
1736 }
1737 goto load_global_error;
1738 }
1739 }
1740 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001745 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001746 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001747 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001748 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 break;
1750 }
1751 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 PUSH(x);
1754 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001755
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001756 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001757 x = GETLOCAL(oparg);
1758 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001759 format_exc_check_arg(
1760 PyExc_UnboundLocalError,
1761 UNBOUNDLOCAL_ERROR_MSG,
1762 PyTuple_GetItem(co->co_varnames, oparg)
1763 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001764 break;
1765 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001766 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001767 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001768
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001769 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001770 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001771 Py_INCREF(x);
1772 PUSH(x);
1773 break;
1774
1775 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001776 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001777 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001778 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001779 err = -1;
1780 /* Don't stomp existing exception */
1781 if (PyErr_Occurred())
1782 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001783 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001784 v = PyTuple_GetItem(co->co_cellvars,
1785 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001786 format_exc_check_arg(
1787 PyExc_UnboundLocalError,
1788 UNBOUNDLOCAL_ERROR_MSG,
1789 v);
1790 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001791 v = PyTuple_GetItem(
1792 co->co_freevars,
1793 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001794 format_exc_check_arg(
1795 PyExc_NameError,
1796 UNBOUNDFREE_ERROR_MSG,
1797 v);
1798 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001799 break;
1800 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001801 PUSH(w);
1802 break;
1803
1804 case STORE_DEREF:
1805 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001806 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001807 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001808 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001809 continue;
1810
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001812 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 if (x != NULL) {
1814 for (; --oparg >= 0;) {
1815 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001816 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001817 }
1818 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001819 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 }
1821 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001822
Guido van Rossum374a9221991-04-04 10:40:29 +00001823 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 if (x != NULL) {
1826 for (; --oparg >= 0;) {
1827 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001828 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 }
1830 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001831 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 }
1833 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001834
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001838 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001840
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001842 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001843 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 x = PyObject_GetAttr(v, w);
1845 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001847 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001849
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 case COMPARE_OP:
1851 w = POP();
1852 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001853 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001854 /* INLINE: cmp(int, int) */
1855 register long a, b;
1856 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001857 a = PyInt_AS_LONG(v);
1858 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001859 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001860 case PyCmp_LT: res = a < b; break;
1861 case PyCmp_LE: res = a <= b; break;
1862 case PyCmp_EQ: res = a == b; break;
1863 case PyCmp_NE: res = a != b; break;
1864 case PyCmp_GT: res = a > b; break;
1865 case PyCmp_GE: res = a >= b; break;
1866 case PyCmp_IS: res = v == w; break;
1867 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001868 default: goto slow_compare;
1869 }
1870 x = res ? Py_True : Py_False;
1871 Py_INCREF(x);
1872 }
1873 else {
1874 slow_compare:
1875 x = cmp_outcome(oparg, v, w);
1876 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001877 Py_DECREF(v);
1878 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001880 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001881 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001882
Guido van Rossum374a9221991-04-04 10:40:29 +00001883 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001884 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001885 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001887 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001888 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889 break;
1890 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001891 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001892 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001893 w,
1894 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001895 f->f_locals == NULL ?
1896 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001897 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001898 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001899 if (w == NULL) {
1900 x = NULL;
1901 break;
1902 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001903 x = PyEval_CallObject(x, w);
1904 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001905 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001906 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001908
Thomas Wouters52152252000-08-17 22:55:00 +00001909 case IMPORT_STAR:
1910 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001911 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001912 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001913 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001914 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001915 break;
1916 }
Thomas Wouters52152252000-08-17 22:55:00 +00001917 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001918 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001919 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001920 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001921 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001922
Thomas Wouters52152252000-08-17 22:55:00 +00001923 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001924 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001925 v = TOP();
1926 x = import_from(v, w);
1927 PUSH(x);
1928 if (x != NULL) continue;
1929 break;
1930
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 case JUMP_FORWARD:
1932 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001933 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001934
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001936 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001937 if (err > 0)
1938 err = 0;
1939 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001940 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001941 else
1942 break;
1943 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001944
Guido van Rossum374a9221991-04-04 10:40:29 +00001945 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001946 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001947 if (err > 0) {
1948 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001949 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001950 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001951 else if (err == 0)
1952 ;
1953 else
1954 break;
1955 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001956
Guido van Rossum374a9221991-04-04 10:40:29 +00001957 case JUMP_ABSOLUTE:
1958 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001959 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001960
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001961 case GET_ITER:
1962 /* before: [obj]; after [getiter(obj)] */
1963 v = POP();
1964 x = PyObject_GetIter(v);
1965 Py_DECREF(v);
1966 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001967 PUSH(x);
1968 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001969 }
1970 break;
1971
1972 case FOR_ITER:
1973 /* before: [iter]; after: [iter, iter()] *or* [] */
1974 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001975 x = PyIter_Next(v);
1976 if (x != NULL) {
1977 PUSH(x);
1978 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001979 }
Tim Petersf4848da2001-05-05 00:14:56 +00001980 if (!PyErr_Occurred()) {
1981 /* iterator ended normally */
1982 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001983 Py_DECREF(v);
1984 JUMPBY(oparg);
1985 continue;
1986 }
1987 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001988
Guido van Rossum374a9221991-04-04 10:40:29 +00001989 case SETUP_LOOP:
1990 case SETUP_EXCEPT:
1991 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001992 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001993 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001994 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001995
Guido van Rossumf10570b1995-07-07 22:53:21 +00001996 case CALL_FUNCTION:
Jeremy Hyltone8c04322002-08-16 17:47:26 +00001997 x = call_function(&stack_pointer, oparg);
1998 PUSH(x);
1999 if (x != NULL)
2000 continue;
2001 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002002
Jeremy Hylton76901512000-03-28 23:49:17 +00002003 case CALL_FUNCTION_VAR:
2004 case CALL_FUNCTION_KW:
2005 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002006 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002007 int na = oparg & 0xff;
2008 int nk = (oparg>>8) & 0xff;
2009 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002010 int n = na + 2 * nk;
2011 PyObject **pfunc, *func;
2012 if (flags & CALL_FLAG_VAR)
2013 n++;
2014 if (flags & CALL_FLAG_KW)
2015 n++;
2016 pfunc = stack_pointer - n - 1;
2017 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002018
Guido van Rossumac7be682001-01-17 15:42:30 +00002019 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002020 && PyMethod_GET_SELF(func) != NULL) {
2021 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002022 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002023 func = PyMethod_GET_FUNCTION(func);
2024 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002025 Py_DECREF(*pfunc);
2026 *pfunc = self;
2027 na++;
2028 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002029 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002030 Py_INCREF(func);
2031 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002032 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002033
Jeremy Hylton76901512000-03-28 23:49:17 +00002034 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002035 w = POP();
2036 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002037 }
2038 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002039 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002040 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002041 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002042 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002043
Guido van Rossum681d79a1995-07-18 14:51:37 +00002044 case MAKE_FUNCTION:
2045 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002046 x = PyFunction_New(v, f->f_globals);
2047 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002048 /* XXX Maybe this should be a separate opcode? */
2049 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002051 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002053 x = NULL;
2054 break;
2055 }
2056 while (--oparg >= 0) {
2057 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002059 }
2060 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002062 }
2063 PUSH(x);
2064 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002065
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002066 case MAKE_CLOSURE:
2067 {
2068 int nfree;
2069 v = POP(); /* code object */
2070 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002071 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002072 Py_DECREF(v);
2073 /* XXX Maybe this should be a separate opcode? */
2074 if (x != NULL && nfree > 0) {
2075 v = PyTuple_New(nfree);
2076 if (v == NULL) {
2077 Py_DECREF(x);
2078 x = NULL;
2079 break;
2080 }
2081 while (--nfree >= 0) {
2082 w = POP();
2083 PyTuple_SET_ITEM(v, nfree, w);
2084 }
2085 err = PyFunction_SetClosure(x, v);
2086 Py_DECREF(v);
2087 }
2088 if (x != NULL && oparg > 0) {
2089 v = PyTuple_New(oparg);
2090 if (v == NULL) {
2091 Py_DECREF(x);
2092 x = NULL;
2093 break;
2094 }
2095 while (--oparg >= 0) {
2096 w = POP();
2097 PyTuple_SET_ITEM(v, oparg, w);
2098 }
2099 err = PyFunction_SetDefaults(x, v);
2100 Py_DECREF(v);
2101 }
2102 PUSH(x);
2103 break;
2104 }
2105
Guido van Rossum8861b741996-07-30 16:49:37 +00002106 case BUILD_SLICE:
2107 if (oparg == 3)
2108 w = POP();
2109 else
2110 w = NULL;
2111 v = POP();
2112 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002113 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002114 Py_DECREF(u);
2115 Py_DECREF(v);
2116 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002117 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002118 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002119 break;
2120
Fred Drakeef8ace32000-08-24 00:32:09 +00002121 case EXTENDED_ARG:
2122 opcode = NEXTOP();
2123 oparg = oparg<<16 | NEXTARG();
2124 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002125
Guido van Rossum374a9221991-04-04 10:40:29 +00002126 default:
2127 fprintf(stderr,
2128 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002129 PyCode_Addr2Line(f->f_code, f->f_lasti),
2130 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 why = WHY_EXCEPTION;
2133 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002134
2135#ifdef CASE_TOO_BIG
2136 }
2137#endif
2138
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 } /* switch */
2140
2141 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002142
Guido van Rossum374a9221991-04-04 10:40:29 +00002143 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002144
Guido van Rossum374a9221991-04-04 10:40:29 +00002145 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002146 if (err == 0 && x != NULL) {
2147#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002148 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002149 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002150 fprintf(stderr,
2151 "XXX undetected error\n");
2152 else
2153#endif
2154 continue; /* Normal, fast path */
2155 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002157 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 err = 0;
2159 }
2160
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002162
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002165 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002166 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 why = WHY_EXCEPTION;
2168 }
2169 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002170#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002172 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002173 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002174 fprintf(stderr,
2175 "XXX undetected error (why=%d)\n",
2176 why);
2177 why = WHY_EXCEPTION;
2178 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 }
2180#endif
2181
2182 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002183
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002186
Fred Drake8f51f542001-10-04 14:48:42 +00002187 if (tstate->c_tracefunc != NULL)
2188 call_exc_trace(tstate->c_tracefunc,
2189 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002190 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002191
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002193
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 if (why == WHY_RERAISE)
2195 why = WHY_EXCEPTION;
2196
2197 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002198
Tim Peters5ca576e2001-06-18 22:08:13 +00002199 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002201
2202 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2203 /* For a continue inside a try block,
2204 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002205 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2206 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002207 why = WHY_NOT;
2208 JUMPTO(PyInt_AS_LONG(retval));
2209 Py_DECREF(retval);
2210 break;
2211 }
2212
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 while (STACK_LEVEL() > b->b_level) {
2214 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 }
2217 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2218 why = WHY_NOT;
2219 JUMPTO(b->b_handler);
2220 break;
2221 }
2222 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002223 (b->b_type == SETUP_EXCEPT &&
2224 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 PyObject *exc, *val, *tb;
2227 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 val = Py_None;
2230 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002231 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 /* Make the raw exception data
2233 available to the handler,
2234 so a program can emulate the
2235 Python main loop. Don't do
2236 this for 'finally'. */
2237 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002238 PyErr_NormalizeException(
2239 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002240 set_exc_info(tstate,
2241 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002242 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002243 if (tb == NULL) {
2244 Py_INCREF(Py_None);
2245 PUSH(Py_None);
2246 } else
2247 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 PUSH(val);
2249 PUSH(exc);
2250 }
2251 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002252 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002253 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002254 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002255 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 PUSH(v);
2257 }
2258 why = WHY_NOT;
2259 JUMPTO(b->b_handler);
2260 break;
2261 }
2262 } /* unwind stack */
2263
2264 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002265
Guido van Rossum374a9221991-04-04 10:40:29 +00002266 if (why != WHY_NOT)
2267 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002268
Guido van Rossum374a9221991-04-04 10:40:29 +00002269 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002270
Guido van Rossum35974fb2001-12-06 21:28:18 +00002271 if (why != WHY_YIELD) {
2272 /* Pop remaining stack entries -- but when yielding */
2273 while (!EMPTY()) {
2274 v = POP();
2275 Py_XDECREF(v);
2276 }
2277 }
2278
Tim Peters5ca576e2001-06-18 22:08:13 +00002279 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002280 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002281
Fred Drake9e3ad782001-07-03 23:39:52 +00002282 if (tstate->use_tracing) {
2283 if (tstate->c_tracefunc
2284 && (why == WHY_RETURN || why == WHY_YIELD)) {
2285 if (call_trace(tstate->c_tracefunc,
2286 tstate->c_traceobj, f,
2287 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002288 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002289 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002290 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002291 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002292 }
Fred Drake8f51f542001-10-04 14:48:42 +00002293 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002294 if (why == WHY_EXCEPTION)
2295 call_trace_protected(tstate->c_profilefunc,
2296 tstate->c_profileobj, f,
2297 PyTrace_RETURN);
2298 else if (call_trace(tstate->c_profilefunc,
2299 tstate->c_profileobj, f,
2300 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002301 Py_XDECREF(retval);
2302 retval = NULL;
2303 why = WHY_EXCEPTION;
2304 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002305 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002306 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002307
Guido van Rossuma027efa1997-05-05 20:56:21 +00002308 reset_exc_info(tstate);
2309
Tim Peters5ca576e2001-06-18 22:08:13 +00002310 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002311 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002312 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002313
Guido van Rossum96a42c81992-01-12 02:29:51 +00002314 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002315}
2316
Tim Peters6d6c1a32001-08-02 04:15:00 +00002317PyObject *
2318PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002319 PyObject **args, int argcount, PyObject **kws, int kwcount,
2320 PyObject **defs, int defcount, PyObject *closure)
2321{
2322 register PyFrameObject *f;
2323 register PyObject *retval = NULL;
2324 register PyObject **fastlocals, **freevars;
2325 PyThreadState *tstate = PyThreadState_GET();
2326 PyObject *x, *u;
2327
2328 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002329 PyErr_SetString(PyExc_SystemError,
2330 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002331 return NULL;
2332 }
2333
2334 f = PyFrame_New(tstate, /*back*/
2335 co, /*code*/
2336 globals, locals);
2337 if (f == NULL)
2338 return NULL;
2339
2340 fastlocals = f->f_localsplus;
2341 freevars = f->f_localsplus + f->f_nlocals;
2342
2343 if (co->co_argcount > 0 ||
2344 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2345 int i;
2346 int n = argcount;
2347 PyObject *kwdict = NULL;
2348 if (co->co_flags & CO_VARKEYWORDS) {
2349 kwdict = PyDict_New();
2350 if (kwdict == NULL)
2351 goto fail;
2352 i = co->co_argcount;
2353 if (co->co_flags & CO_VARARGS)
2354 i++;
2355 SETLOCAL(i, kwdict);
2356 }
2357 if (argcount > co->co_argcount) {
2358 if (!(co->co_flags & CO_VARARGS)) {
2359 PyErr_Format(PyExc_TypeError,
2360 "%.200s() takes %s %d "
2361 "%sargument%s (%d given)",
2362 PyString_AsString(co->co_name),
2363 defcount ? "at most" : "exactly",
2364 co->co_argcount,
2365 kwcount ? "non-keyword " : "",
2366 co->co_argcount == 1 ? "" : "s",
2367 argcount);
2368 goto fail;
2369 }
2370 n = co->co_argcount;
2371 }
2372 for (i = 0; i < n; i++) {
2373 x = args[i];
2374 Py_INCREF(x);
2375 SETLOCAL(i, x);
2376 }
2377 if (co->co_flags & CO_VARARGS) {
2378 u = PyTuple_New(argcount - n);
2379 if (u == NULL)
2380 goto fail;
2381 SETLOCAL(co->co_argcount, u);
2382 for (i = n; i < argcount; i++) {
2383 x = args[i];
2384 Py_INCREF(x);
2385 PyTuple_SET_ITEM(u, i-n, x);
2386 }
2387 }
2388 for (i = 0; i < kwcount; i++) {
2389 PyObject *keyword = kws[2*i];
2390 PyObject *value = kws[2*i + 1];
2391 int j;
2392 if (keyword == NULL || !PyString_Check(keyword)) {
2393 PyErr_Format(PyExc_TypeError,
2394 "%.200s() keywords must be strings",
2395 PyString_AsString(co->co_name));
2396 goto fail;
2397 }
2398 /* XXX slow -- speed up using dictionary? */
2399 for (j = 0; j < co->co_argcount; j++) {
2400 PyObject *nm = PyTuple_GET_ITEM(
2401 co->co_varnames, j);
2402 int cmp = PyObject_RichCompareBool(
2403 keyword, nm, Py_EQ);
2404 if (cmp > 0)
2405 break;
2406 else if (cmp < 0)
2407 goto fail;
2408 }
2409 /* Check errors from Compare */
2410 if (PyErr_Occurred())
2411 goto fail;
2412 if (j >= co->co_argcount) {
2413 if (kwdict == NULL) {
2414 PyErr_Format(PyExc_TypeError,
2415 "%.200s() got an unexpected "
2416 "keyword argument '%.400s'",
2417 PyString_AsString(co->co_name),
2418 PyString_AsString(keyword));
2419 goto fail;
2420 }
2421 PyDict_SetItem(kwdict, keyword, value);
2422 }
2423 else {
2424 if (GETLOCAL(j) != NULL) {
2425 PyErr_Format(PyExc_TypeError,
2426 "%.200s() got multiple "
2427 "values for keyword "
2428 "argument '%.400s'",
2429 PyString_AsString(co->co_name),
2430 PyString_AsString(keyword));
2431 goto fail;
2432 }
2433 Py_INCREF(value);
2434 SETLOCAL(j, value);
2435 }
2436 }
2437 if (argcount < co->co_argcount) {
2438 int m = co->co_argcount - defcount;
2439 for (i = argcount; i < m; i++) {
2440 if (GETLOCAL(i) == NULL) {
2441 PyErr_Format(PyExc_TypeError,
2442 "%.200s() takes %s %d "
2443 "%sargument%s (%d given)",
2444 PyString_AsString(co->co_name),
2445 ((co->co_flags & CO_VARARGS) ||
2446 defcount) ? "at least"
2447 : "exactly",
2448 m, kwcount ? "non-keyword " : "",
2449 m == 1 ? "" : "s", i);
2450 goto fail;
2451 }
2452 }
2453 if (n > m)
2454 i = n - m;
2455 else
2456 i = 0;
2457 for (; i < defcount; i++) {
2458 if (GETLOCAL(m+i) == NULL) {
2459 PyObject *def = defs[i];
2460 Py_INCREF(def);
2461 SETLOCAL(m+i, def);
2462 }
2463 }
2464 }
2465 }
2466 else {
2467 if (argcount > 0 || kwcount > 0) {
2468 PyErr_Format(PyExc_TypeError,
2469 "%.200s() takes no arguments (%d given)",
2470 PyString_AsString(co->co_name),
2471 argcount + kwcount);
2472 goto fail;
2473 }
2474 }
2475 /* Allocate and initialize storage for cell vars, and copy free
2476 vars into frame. This isn't too efficient right now. */
2477 if (f->f_ncells) {
2478 int i = 0, j = 0, nargs, found;
2479 char *cellname, *argname;
2480 PyObject *c;
2481
2482 nargs = co->co_argcount;
2483 if (co->co_flags & CO_VARARGS)
2484 nargs++;
2485 if (co->co_flags & CO_VARKEYWORDS)
2486 nargs++;
2487
2488 /* Check for cells that shadow args */
2489 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2490 cellname = PyString_AS_STRING(
2491 PyTuple_GET_ITEM(co->co_cellvars, i));
2492 found = 0;
2493 while (j < nargs) {
2494 argname = PyString_AS_STRING(
2495 PyTuple_GET_ITEM(co->co_varnames, j));
2496 if (strcmp(cellname, argname) == 0) {
2497 c = PyCell_New(GETLOCAL(j));
2498 if (c == NULL)
2499 goto fail;
2500 GETLOCAL(f->f_nlocals + i) = c;
2501 found = 1;
2502 break;
2503 }
2504 j++;
2505 }
2506 if (found == 0) {
2507 c = PyCell_New(NULL);
2508 if (c == NULL)
2509 goto fail;
2510 SETLOCAL(f->f_nlocals + i, c);
2511 }
2512 }
2513 /* Initialize any that are left */
2514 while (i < f->f_ncells) {
2515 c = PyCell_New(NULL);
2516 if (c == NULL)
2517 goto fail;
2518 SETLOCAL(f->f_nlocals + i, c);
2519 i++;
2520 }
2521 }
2522 if (f->f_nfreevars) {
2523 int i;
2524 for (i = 0; i < f->f_nfreevars; ++i) {
2525 PyObject *o = PyTuple_GET_ITEM(closure, i);
2526 Py_INCREF(o);
2527 freevars[f->f_ncells + i] = o;
2528 }
2529 }
2530
Tim Peters5ca576e2001-06-18 22:08:13 +00002531 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002532 /* Don't need to keep the reference to f_back, it will be set
2533 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002534 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002535 f->f_back = NULL;
2536
2537 /* Create a new generator that owns the ready to run frame
2538 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002539 return gen_new(f);
2540 }
2541
2542 retval = eval_frame(f);
2543
2544 fail: /* Jump here from prelude on failure */
2545
Tim Petersb13680b2001-11-27 23:29:29 +00002546 /* decref'ing the frame can cause __del__ methods to get invoked,
2547 which can call back into Python. While we're done with the
2548 current Python frame (f), the associated C stack is still in use,
2549 so recursion_depth must be boosted for the duration.
2550 */
2551 assert(tstate != NULL);
2552 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002553 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002554 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002555 return retval;
2556}
2557
2558
Guido van Rossuma027efa1997-05-05 20:56:21 +00002559static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002560set_exc_info(PyThreadState *tstate,
2561 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562{
2563 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002564 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002565
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 frame = tstate->frame;
2567 if (frame->f_exc_type == NULL) {
2568 /* This frame didn't catch an exception before */
2569 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 if (tstate->exc_type == NULL) {
2571 Py_INCREF(Py_None);
2572 tstate->exc_type = Py_None;
2573 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002574 tmp_type = frame->f_exc_type;
2575 tmp_value = frame->f_exc_value;
2576 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 Py_XINCREF(tstate->exc_type);
2578 Py_XINCREF(tstate->exc_value);
2579 Py_XINCREF(tstate->exc_traceback);
2580 frame->f_exc_type = tstate->exc_type;
2581 frame->f_exc_value = tstate->exc_value;
2582 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002583 Py_XDECREF(tmp_type);
2584 Py_XDECREF(tmp_value);
2585 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 }
2587 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002588 tmp_type = tstate->exc_type;
2589 tmp_value = tstate->exc_value;
2590 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 Py_XINCREF(type);
2592 Py_XINCREF(value);
2593 Py_XINCREF(tb);
2594 tstate->exc_type = type;
2595 tstate->exc_value = value;
2596 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002597 Py_XDECREF(tmp_type);
2598 Py_XDECREF(tmp_value);
2599 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600 /* For b/w compatibility */
2601 PySys_SetObject("exc_type", type);
2602 PySys_SetObject("exc_value", value);
2603 PySys_SetObject("exc_traceback", tb);
2604}
2605
2606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002608{
2609 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002610 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 frame = tstate->frame;
2612 if (frame->f_exc_type != NULL) {
2613 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002614 tmp_type = tstate->exc_type;
2615 tmp_value = tstate->exc_value;
2616 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 Py_XINCREF(frame->f_exc_type);
2618 Py_XINCREF(frame->f_exc_value);
2619 Py_XINCREF(frame->f_exc_traceback);
2620 tstate->exc_type = frame->f_exc_type;
2621 tstate->exc_value = frame->f_exc_value;
2622 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002623 Py_XDECREF(tmp_type);
2624 Py_XDECREF(tmp_value);
2625 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626 /* For b/w compatibility */
2627 PySys_SetObject("exc_type", frame->f_exc_type);
2628 PySys_SetObject("exc_value", frame->f_exc_value);
2629 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2630 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 tmp_type = frame->f_exc_type;
2632 tmp_value = frame->f_exc_value;
2633 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 frame->f_exc_type = NULL;
2635 frame->f_exc_value = NULL;
2636 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002637 Py_XDECREF(tmp_type);
2638 Py_XDECREF(tmp_value);
2639 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640}
2641
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002642/* Logic for the raise statement (too complicated for inlining).
2643 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002644static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002645do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002646{
Guido van Rossumd295f121998-04-09 21:39:57 +00002647 if (type == NULL) {
2648 /* Reraise */
2649 PyThreadState *tstate = PyThreadState_Get();
2650 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2651 value = tstate->exc_value;
2652 tb = tstate->exc_traceback;
2653 Py_XINCREF(type);
2654 Py_XINCREF(value);
2655 Py_XINCREF(tb);
2656 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002657
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002658 /* We support the following forms of raise:
2659 raise <class>, <classinstance>
2660 raise <class>, <argument tuple>
2661 raise <class>, None
2662 raise <class>, <argument>
2663 raise <classinstance>, None
2664 raise <string>, <object>
2665 raise <string>, None
2666
2667 An omitted second argument is the same as None.
2668
2669 In addition, raise <tuple>, <anything> is the same as
2670 raising the tuple's first item (and it better have one!);
2671 this rule is applied recursively.
2672
2673 Finally, an optional third argument can be supplied, which
2674 gives the traceback to be substituted (useful when
2675 re-raising an exception after examining it). */
2676
2677 /* First, check the traceback argument, replacing None with
2678 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 if (tb == Py_None) {
2680 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681 tb = NULL;
2682 }
2683 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002685 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 goto raise_error;
2687 }
2688
2689 /* Next, replace a missing value with None */
2690 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 value = Py_None;
2692 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 }
2694
2695 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2697 PyObject *tmp = type;
2698 type = PyTuple_GET_ITEM(type, 0);
2699 Py_INCREF(type);
2700 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002701 }
2702
Tim Petersafb2c802002-04-18 18:06:20 +00002703 if (PyString_CheckExact(type))
2704 /* Raising builtin string is deprecated but still allowed --
2705 * do nothing. Raising an instance of a new-style str
2706 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002707 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002708
2709 else if (PyClass_Check(type))
2710 PyErr_NormalizeException(&type, &value, &tb);
2711
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002714 if (value != Py_None) {
2715 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002716 "instance exception may not have a separate value");
2717 goto raise_error;
2718 }
2719 else {
2720 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002721 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002722 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2724 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002725 }
2726 }
2727 else {
2728 /* Not something you can raise. You get an exception
2729 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002730 PyErr_Format(PyExc_TypeError,
2731 "exceptions must be strings, classes, or "
2732 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 goto raise_error;
2734 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 if (tb == NULL)
2737 return WHY_EXCEPTION;
2738 else
2739 return WHY_RERAISE;
2740 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 Py_XDECREF(value);
2742 Py_XDECREF(type);
2743 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002744 return WHY_EXCEPTION;
2745}
2746
Tim Petersd6d010b2001-06-21 02:49:55 +00002747/* Iterate v argcnt times and store the results on the stack (via decreasing
2748 sp). Return 1 for success, 0 if error. */
2749
Barry Warsawe42b18f1997-08-25 22:13:04 +00002750static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002751unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002752{
Tim Petersd6d010b2001-06-21 02:49:55 +00002753 int i = 0;
2754 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002755 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002756
Tim Petersd6d010b2001-06-21 02:49:55 +00002757 assert(v != NULL);
2758
2759 it = PyObject_GetIter(v);
2760 if (it == NULL)
2761 goto Error;
2762
2763 for (; i < argcnt; i++) {
2764 w = PyIter_Next(it);
2765 if (w == NULL) {
2766 /* Iterator done, via error or exhaustion. */
2767 if (!PyErr_Occurred()) {
2768 PyErr_Format(PyExc_ValueError,
2769 "need more than %d value%s to unpack",
2770 i, i == 1 ? "" : "s");
2771 }
2772 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002773 }
2774 *--sp = w;
2775 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002776
2777 /* We better have exhausted the iterator now. */
2778 w = PyIter_Next(it);
2779 if (w == NULL) {
2780 if (PyErr_Occurred())
2781 goto Error;
2782 Py_DECREF(it);
2783 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002784 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002785 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002786 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002787 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002788Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002789 for (; i > 0; i--, sp++)
2790 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002791 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002792 return 0;
2793}
2794
2795
Guido van Rossum96a42c81992-01-12 02:29:51 +00002796#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002797static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002798prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002800 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 if (PyObject_Print(v, stdout, 0) != 0)
2802 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002803 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002804 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002806#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808static void
Fred Drake5755ce62001-06-27 19:19:46 +00002809call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002810{
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002812 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002813 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002814 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 value = Py_None;
2816 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002817 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002819 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822 }
Fred Drake5755ce62001-06-27 19:19:46 +00002823 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002825 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002826 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 Py_XDECREF(type);
2829 Py_XDECREF(value);
2830 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002831 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002832}
2833
Fred Drake4ec5d562001-10-04 19:26:43 +00002834static void
2835call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2836 int what)
2837{
2838 PyObject *type, *value, *traceback;
2839 int err;
2840 PyErr_Fetch(&type, &value, &traceback);
2841 err = call_trace(func, obj, frame, what, NULL);
2842 if (err == 0)
2843 PyErr_Restore(type, value, traceback);
2844 else {
2845 Py_XDECREF(type);
2846 Py_XDECREF(value);
2847 Py_XDECREF(traceback);
2848 }
2849}
2850
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002851static int
Fred Drake5755ce62001-06-27 19:19:46 +00002852call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2853 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002854{
Fred Drake5755ce62001-06-27 19:19:46 +00002855 register PyThreadState *tstate = frame->f_tstate;
2856 int result;
2857 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002858 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002859 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002860 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002861 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002862 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2863 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002864 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002865 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002866}
2867
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002868static void
2869maybe_call_line_trace(int opcode, Py_tracefunc func, PyObject *obj,
2870 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2871{
2872 /* The theory of SET_LINENO-less tracing.
2873
2874 In a nutshell, we use the co_lnotab field of the code object
2875 to tell when execution has moved onto a different line.
2876
2877 As mentioned above, the basic idea is so set things up so
2878 that
2879
2880 *instr_lb <= frame->f_lasti < *instr_ub
2881
2882 is true so long as execution does not change lines.
2883
2884 This is all fairly simple. Digging the information out of
2885 co_lnotab takes some work, but is conceptually clear.
2886
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002887 Somewhat harder to explain is why we don't *always* call the
2888 line trace function when the above test fails.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002889
2890 Consider this code:
2891
2892 1: def f(a):
2893 2: if a:
2894 3: print 1
2895 4: else:
2896 5: print 2
2897
2898 which compiles to this:
2899
2900 2 0 LOAD_FAST 0 (a)
2901 3 JUMP_IF_FALSE 9 (to 15)
2902 6 POP_TOP
2903
2904 3 7 LOAD_CONST 1 (1)
2905 10 PRINT_ITEM
2906 11 PRINT_NEWLINE
2907 12 JUMP_FORWARD 6 (to 21)
2908 >> 15 POP_TOP
2909
2910 5 16 LOAD_CONST 2 (2)
2911 19 PRINT_ITEM
2912 20 PRINT_NEWLINE
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002913 >> 21 LOAD_CONST 0 (None)
2914 24 RETURN_VALUE
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002915
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002916 If 'a' is false, execution will jump to instruction at offset
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002917 15 and the co_lnotab will claim that execution has moved to
2918 line 3. This is at best misleading. In this case we could
2919 associate the POP_TOP with line 4, but that doesn't make
2920 sense in all cases (I think).
2921
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002922 What we do is only call the line trace function if the co_lnotab
2923 indicates we have jumped to the *start* of a line, i.e. if the
2924 current instruction offset matches the offset given for the
2925 start of a line by the co_lnotab.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002926
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002927 This also takes care of the situation where 'a' is true.
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002928 Execution will jump from instruction offset 12 to offset 21.
2929 Then the co_lnotab would imply that execution has moved to line
2930 5, which is again misleading.
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002931
2932 Why do we set f_lineno when tracing? Well, consider the code
2933 above when 'a' is true. If stepping through this with 'n' in
2934 pdb, you would stop at line 1 with a "call" type event, then
2935 line events on lines 2 and 3, then a "return" type event -- but
2936 you would be shown line 5 during this event. This is a change
2937 from the behaviour in 2.2 and before, and I've found it
2938 confusing in practice. By setting and using f_lineno when
2939 tracing, one can report a line number different from that
2940 suggested by f_lasti on this one occasion where it's desirable.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002941 */
2942
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002943 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002944 PyCodeObject* co = frame->f_code;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002945 int size, addr, line;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002946 unsigned char* p;
2947
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002948 size = PyString_GET_SIZE(co->co_lnotab) / 2;
2949 p = (unsigned char*)PyString_AS_STRING(co->co_lnotab);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002950
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002951 addr = 0;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002952 line = co->co_firstlineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002953
2954 /* possible optimization: if f->f_lasti == instr_ub
2955 (likely to be a common case) then we already know
2956 instr_lb -- if we stored the matching value of p
2957 somwhere we could skip the first while loop. */
2958
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002959 /* see comments in compile.c for the description of
2960 co_lnotab. A point to remember: increments to p
2961 should come in pairs -- although we don't care about
2962 the line increments here, treating them as byte
2963 increments gets confusing, to say the least. */
2964
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002965 while (size > 0) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002966 if (addr + *p > frame->f_lasti)
2967 break;
2968 addr += *p++;
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002969 if (*p) *instr_lb = addr;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002970 line += *p++;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002971 --size;
2972 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002973
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002974 if (addr == frame->f_lasti) {
2975 frame->f_lineno = line;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002976 call_trace(func, obj, frame,
2977 PyTrace_LINE, Py_None);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002978 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002979
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002980 if (size > 0) {
2981 while (--size >= 0) {
2982 addr += *p++;
2983 if (*p++)
2984 break;
2985 }
2986 *instr_ub = addr;
2987 }
2988 else {
2989 *instr_ub = INT_MAX;
2990 }
2991 }
2992}
2993
Fred Drake5755ce62001-06-27 19:19:46 +00002994void
2995PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002996{
Fred Drake5755ce62001-06-27 19:19:46 +00002997 PyThreadState *tstate = PyThreadState_Get();
2998 PyObject *temp = tstate->c_profileobj;
2999 Py_XINCREF(arg);
3000 tstate->c_profilefunc = NULL;
3001 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003002 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003003 Py_XDECREF(temp);
3004 tstate->c_profilefunc = func;
3005 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003006 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003007}
3008
3009void
3010PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3011{
3012 PyThreadState *tstate = PyThreadState_Get();
3013 PyObject *temp = tstate->c_traceobj;
3014 Py_XINCREF(arg);
3015 tstate->c_tracefunc = NULL;
3016 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003017 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003018 Py_XDECREF(temp);
3019 tstate->c_tracefunc = func;
3020 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003021 tstate->use_tracing = ((func != NULL)
3022 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003023}
3024
Guido van Rossumb209a111997-04-29 18:18:01 +00003025PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003026PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003027{
Guido van Rossum25ce5661997-08-02 03:10:38 +00003028 PyThreadState *tstate = PyThreadState_Get();
3029 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003030 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00003031 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003032 else
3033 return current_frame->f_builtins;
3034}
3035
Guido van Rossumb209a111997-04-29 18:18:01 +00003036PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003037PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003038{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003039 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00003040 if (current_frame == NULL)
3041 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003042 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003043 return current_frame->f_locals;
3044}
3045
Guido van Rossumb209a111997-04-29 18:18:01 +00003046PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003047PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003048{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003049 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003050 if (current_frame == NULL)
3051 return NULL;
3052 else
3053 return current_frame->f_globals;
3054}
3055
Guido van Rossumb209a111997-04-29 18:18:01 +00003056PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003057PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003058{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003059 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00003060 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00003061}
3062
Guido van Rossum6135a871995-01-09 17:53:26 +00003063int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003064PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003065{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003066 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003067 return current_frame == NULL ? 0 : current_frame->f_restricted;
3068}
3069
Guido van Rossumbe270261997-05-22 22:26:18 +00003070int
Tim Peters5ba58662001-07-16 02:29:45 +00003071PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003072{
3073 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00003074 int result = 0;
3075
3076 if (current_frame != NULL) {
3077 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003078 const int compilerflags = codeflags & PyCF_MASK;
3079 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003080 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003081 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003082 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003083#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003084 if (codeflags & CO_GENERATOR_ALLOWED) {
3085 result = 1;
3086 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3087 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003088#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003089 }
3090 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003091}
3092
3093int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003094Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095{
Guido van Rossumb209a111997-04-29 18:18:01 +00003096 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003097 if (f == NULL)
3098 return 0;
3099 if (!PyFile_SoftSpace(f, 0))
3100 return 0;
3101 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102}
3103
Guido van Rossum3f5da241990-12-20 15:06:42 +00003104
Guido van Rossum681d79a1995-07-18 14:51:37 +00003105/* External interface to call any callable object.
3106 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003107
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003108#undef PyEval_CallObject
3109/* for backward compatibility: export this interface */
3110
Guido van Rossumb209a111997-04-29 18:18:01 +00003111PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003112PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003113{
Guido van Rossumb209a111997-04-29 18:18:01 +00003114 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003115}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003116#define PyEval_CallObject(func,arg) \
3117 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003118
Guido van Rossumb209a111997-04-29 18:18:01 +00003119PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003120PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003121{
Jeremy Hylton52820442001-01-03 23:52:36 +00003122 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003123
3124 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003125 arg = PyTuple_New(0);
3126 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003127 PyErr_SetString(PyExc_TypeError,
3128 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003129 return NULL;
3130 }
3131 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003132 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003133
Guido van Rossumb209a111997-04-29 18:18:01 +00003134 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003135 PyErr_SetString(PyExc_TypeError,
3136 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003137 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003138 return NULL;
3139 }
3140
Tim Peters6d6c1a32001-08-02 04:15:00 +00003141 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003142 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003143 return result;
3144}
3145
Tim Peters6d6c1a32001-08-02 04:15:00 +00003146char *
3147PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003148{
3149 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003150 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003151 else if (PyFunction_Check(func))
3152 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3153 else if (PyCFunction_Check(func))
3154 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3155 else if (PyClass_Check(func))
3156 return PyString_AsString(((PyClassObject*)func)->cl_name);
3157 else if (PyInstance_Check(func)) {
3158 return PyString_AsString(
3159 ((PyInstanceObject*)func)->in_class->cl_name);
3160 } else {
3161 return func->ob_type->tp_name;
3162 }
3163}
3164
Tim Peters6d6c1a32001-08-02 04:15:00 +00003165char *
3166PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003167{
3168 if (PyMethod_Check(func))
3169 return "()";
3170 else if (PyFunction_Check(func))
3171 return "()";
3172 else if (PyCFunction_Check(func))
3173 return "()";
3174 else if (PyClass_Check(func))
3175 return " constructor";
3176 else if (PyInstance_Check(func)) {
3177 return " instance";
3178 } else {
3179 return " object";
3180 }
3181}
3182
Jeremy Hylton52820442001-01-03 23:52:36 +00003183#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3184
Jeremy Hylton192690e2002-08-16 18:36:11 +00003185void
3186err_args(PyObject *func, int flags, int nargs)
3187{
3188 if (flags & METH_NOARGS)
3189 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003190 "%.200s() takes no arguments (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003191 ((PyCFunctionObject *)func)->m_ml->ml_name,
3192 nargs);
3193 else
3194 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003195 "%.200s() takes exactly one argument (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003196 ((PyCFunctionObject *)func)->m_ml->ml_name,
3197 nargs);
3198}
3199
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003200static PyObject *
3201call_function(PyObject ***pp_stack, int oparg)
3202{
3203 int na = oparg & 0xff;
3204 int nk = (oparg>>8) & 0xff;
3205 int n = na + 2 * nk;
3206 PyObject **pfunc = (*pp_stack) - n - 1;
3207 PyObject *func = *pfunc;
3208 PyObject *x, *w;
3209
3210 /* Always dispatch PyCFunction first, because
3211 these are presumed to be the most frequent
3212 callable object.
3213 */
3214 if (PyCFunction_Check(func) && nk == 0) {
3215 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003216 if (flags & (METH_NOARGS | METH_O)) {
3217 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3218 PyObject *self = PyCFunction_GET_SELF(func);
3219 if (flags & METH_NOARGS && na == 0)
3220 x = (*meth)(self, NULL);
3221 else if (flags & METH_O && na == 1) {
3222 PyObject *arg = EXT_POP(*pp_stack);
3223 x = (*meth)(self, arg);
3224 Py_DECREF(arg);
3225 }
3226 else {
3227 err_args(func, flags, na);
3228 x = NULL;
3229 }
3230 }
3231 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003232 PyObject *callargs;
3233 callargs = load_args(pp_stack, na);
3234 x = PyCFunction_Call(func, callargs, NULL);
3235 Py_XDECREF(callargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003236 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003237 } else {
3238 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3239 /* optimize access to bound methods */
3240 PyObject *self = PyMethod_GET_SELF(func);
3241 Py_INCREF(self);
3242 func = PyMethod_GET_FUNCTION(func);
3243 Py_INCREF(func);
3244 Py_DECREF(*pfunc);
3245 *pfunc = self;
3246 na++;
3247 n++;
3248 } else
3249 Py_INCREF(func);
3250 if (PyFunction_Check(func))
3251 x = fast_function(func, pp_stack, n, na, nk);
3252 else
3253 x = do_call(func, pp_stack, na, nk);
3254 Py_DECREF(func);
3255 }
3256
3257 while ((*pp_stack) > pfunc) {
3258 w = EXT_POP(*pp_stack);
3259 Py_DECREF(w);
3260 }
3261 return x;
3262}
3263
Jeremy Hylton192690e2002-08-16 18:36:11 +00003264/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003265 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton52820442001-01-03 23:52:36 +00003266*/
3267
3268static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003269fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003270{
3271 PyObject *co = PyFunction_GET_CODE(func);
3272 PyObject *globals = PyFunction_GET_GLOBALS(func);
3273 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003274 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003275 PyObject **d = NULL;
3276 int nd = 0;
3277
3278 if (argdefs != NULL) {
3279 d = &PyTuple_GET_ITEM(argdefs, 0);
3280 nd = ((PyTupleObject *)argdefs)->ob_size;
3281 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003282 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003283 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003284 (*pp_stack)-2*nk, nk, d, nd,
3285 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003286}
3287
3288static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003289update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3290 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003291{
3292 PyObject *kwdict = NULL;
3293 if (orig_kwdict == NULL)
3294 kwdict = PyDict_New();
3295 else {
3296 kwdict = PyDict_Copy(orig_kwdict);
3297 Py_DECREF(orig_kwdict);
3298 }
3299 if (kwdict == NULL)
3300 return NULL;
3301 while (--nk >= 0) {
3302 int err;
3303 PyObject *value = EXT_POP(*pp_stack);
3304 PyObject *key = EXT_POP(*pp_stack);
3305 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003306 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003307 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003308 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003309 PyEval_GetFuncName(func),
3310 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003311 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003312 Py_DECREF(key);
3313 Py_DECREF(value);
3314 Py_DECREF(kwdict);
3315 return NULL;
3316 }
3317 err = PyDict_SetItem(kwdict, key, value);
3318 Py_DECREF(key);
3319 Py_DECREF(value);
3320 if (err) {
3321 Py_DECREF(kwdict);
3322 return NULL;
3323 }
3324 }
3325 return kwdict;
3326}
3327
3328static PyObject *
3329update_star_args(int nstack, int nstar, PyObject *stararg,
3330 PyObject ***pp_stack)
3331{
3332 PyObject *callargs, *w;
3333
3334 callargs = PyTuple_New(nstack + nstar);
3335 if (callargs == NULL) {
3336 return NULL;
3337 }
3338 if (nstar) {
3339 int i;
3340 for (i = 0; i < nstar; i++) {
3341 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3342 Py_INCREF(a);
3343 PyTuple_SET_ITEM(callargs, nstack + i, a);
3344 }
3345 }
3346 while (--nstack >= 0) {
3347 w = EXT_POP(*pp_stack);
3348 PyTuple_SET_ITEM(callargs, nstack, w);
3349 }
3350 return callargs;
3351}
3352
3353static PyObject *
3354load_args(PyObject ***pp_stack, int na)
3355{
3356 PyObject *args = PyTuple_New(na);
3357 PyObject *w;
3358
3359 if (args == NULL)
3360 return NULL;
3361 while (--na >= 0) {
3362 w = EXT_POP(*pp_stack);
3363 PyTuple_SET_ITEM(args, na, w);
3364 }
3365 return args;
3366}
3367
3368static PyObject *
3369do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3370{
3371 PyObject *callargs = NULL;
3372 PyObject *kwdict = NULL;
3373 PyObject *result = NULL;
3374
3375 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003376 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003377 if (kwdict == NULL)
3378 goto call_fail;
3379 }
3380 callargs = load_args(pp_stack, na);
3381 if (callargs == NULL)
3382 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003383 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003384 call_fail:
3385 Py_XDECREF(callargs);
3386 Py_XDECREF(kwdict);
3387 return result;
3388}
3389
3390static PyObject *
3391ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3392{
3393 int nstar = 0;
3394 PyObject *callargs = NULL;
3395 PyObject *stararg = NULL;
3396 PyObject *kwdict = NULL;
3397 PyObject *result = NULL;
3398
3399 if (flags & CALL_FLAG_KW) {
3400 kwdict = EXT_POP(*pp_stack);
3401 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003402 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003403 "%s%s argument after ** "
3404 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003405 PyEval_GetFuncName(func),
3406 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003407 goto ext_call_fail;
3408 }
3409 }
3410 if (flags & CALL_FLAG_VAR) {
3411 stararg = EXT_POP(*pp_stack);
3412 if (!PyTuple_Check(stararg)) {
3413 PyObject *t = NULL;
3414 t = PySequence_Tuple(stararg);
3415 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003416 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3417 PyErr_Format(PyExc_TypeError,
3418 "%s%s argument after * "
3419 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003420 PyEval_GetFuncName(func),
3421 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003422 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003423 goto ext_call_fail;
3424 }
3425 Py_DECREF(stararg);
3426 stararg = t;
3427 }
3428 nstar = PyTuple_GET_SIZE(stararg);
3429 }
3430 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003431 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003432 if (kwdict == NULL)
3433 goto ext_call_fail;
3434 }
3435 callargs = update_star_args(na, nstar, stararg, pp_stack);
3436 if (callargs == NULL)
3437 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003438 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003439 ext_call_fail:
3440 Py_XDECREF(callargs);
3441 Py_XDECREF(kwdict);
3442 Py_XDECREF(stararg);
3443 return result;
3444}
3445
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003446#define SLICE_ERROR_MSG \
3447 "standard sequence type does not support step size other than one"
3448
Tim Peterscb479e72001-12-16 19:11:44 +00003449/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3450 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3451 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3452*/
Tim Petersb5196382001-12-16 19:44:20 +00003453/* Note: If v is NULL, return success without storing into *pi. This
3454 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3455 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003456*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003457int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003458_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459{
Tim Petersb5196382001-12-16 19:44:20 +00003460 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003461 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003462 if (PyInt_Check(v)) {
3463 x = PyInt_AsLong(v);
3464 } else if (PyLong_Check(v)) {
3465 x = PyLong_AsLong(v);
3466 if (x==-1 && PyErr_Occurred()) {
3467 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003468 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003469
Guido van Rossumac7be682001-01-17 15:42:30 +00003470 if (!PyErr_ExceptionMatches(
3471 PyExc_OverflowError)) {
3472 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003473 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003474 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003475 }
3476
Guido van Rossumac7be682001-01-17 15:42:30 +00003477 /* Clear the OverflowError */
3478 PyErr_Clear();
3479
3480 /* It's an overflow error, so we need to
3481 check the sign of the long integer,
3482 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003483 the error. */
3484
3485 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003486 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003487 if (long_zero == NULL)
3488 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003489
3490 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003491 cmp = PyObject_RichCompareBool(v, long_zero,
3492 Py_GT);
3493 Py_DECREF(long_zero);
3494 if (cmp < 0)
3495 return 0;
3496 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003497 x = INT_MAX;
3498 else
3499 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003500 }
3501 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003502 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003503 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003504 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003506 /* Truncate -- very long indices are truncated anyway */
3507 if (x > INT_MAX)
3508 x = INT_MAX;
3509 else if (x < -INT_MAX)
3510 x = 0;
3511 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003513 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514}
3515
Guido van Rossum50d756e2001-08-18 17:43:36 +00003516#undef ISINT
3517#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3518
Guido van Rossumb209a111997-04-29 18:18:01 +00003519static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003520apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003522 PyTypeObject *tp = u->ob_type;
3523 PySequenceMethods *sq = tp->tp_as_sequence;
3524
3525 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3526 int ilow = 0, ihigh = INT_MAX;
3527 if (!_PyEval_SliceIndex(v, &ilow))
3528 return NULL;
3529 if (!_PyEval_SliceIndex(w, &ihigh))
3530 return NULL;
3531 return PySequence_GetSlice(u, ilow, ihigh);
3532 }
3533 else {
3534 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003535 if (slice != NULL) {
3536 PyObject *res = PyObject_GetItem(u, slice);
3537 Py_DECREF(slice);
3538 return res;
3539 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003540 else
3541 return NULL;
3542 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003543}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003544
3545static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003546assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3547 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003548{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003549 PyTypeObject *tp = u->ob_type;
3550 PySequenceMethods *sq = tp->tp_as_sequence;
3551
3552 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3553 int ilow = 0, ihigh = INT_MAX;
3554 if (!_PyEval_SliceIndex(v, &ilow))
3555 return -1;
3556 if (!_PyEval_SliceIndex(w, &ihigh))
3557 return -1;
3558 if (x == NULL)
3559 return PySequence_DelSlice(u, ilow, ihigh);
3560 else
3561 return PySequence_SetSlice(u, ilow, ihigh, x);
3562 }
3563 else {
3564 PyObject *slice = PySlice_New(v, w, NULL);
3565 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003566 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003567 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003568 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003569 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003570 res = PyObject_DelItem(u, slice);
3571 Py_DECREF(slice);
3572 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003573 }
3574 else
3575 return -1;
3576 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003577}
3578
Guido van Rossumb209a111997-04-29 18:18:01 +00003579static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003580cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581{
Guido van Rossumac7be682001-01-17 15:42:30 +00003582 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003584 case PyCmp_IS:
3585 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003586 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003587 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003588 res = !res;
3589 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003590 case PyCmp_IN:
3591 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003592 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003593 if (res < 0)
3594 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003595 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003596 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003597 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003598 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003599 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600 break;
3601 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003602 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003604 v = res ? Py_True : Py_False;
3605 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606 return v;
3607}
3608
Thomas Wouters52152252000-08-17 22:55:00 +00003609static PyObject *
3610import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003611{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003612 PyObject *x;
3613
3614 x = PyObject_GetAttr(v, name);
3615 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003616 PyErr_Format(PyExc_ImportError,
3617 "cannot import name %.230s",
3618 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003619 }
Thomas Wouters52152252000-08-17 22:55:00 +00003620 return x;
3621}
Guido van Rossumac7be682001-01-17 15:42:30 +00003622
Thomas Wouters52152252000-08-17 22:55:00 +00003623static int
3624import_all_from(PyObject *locals, PyObject *v)
3625{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003626 PyObject *all = PyObject_GetAttrString(v, "__all__");
3627 PyObject *dict, *name, *value;
3628 int skip_leading_underscores = 0;
3629 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003630
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003631 if (all == NULL) {
3632 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3633 return -1; /* Unexpected error */
3634 PyErr_Clear();
3635 dict = PyObject_GetAttrString(v, "__dict__");
3636 if (dict == NULL) {
3637 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3638 return -1;
3639 PyErr_SetString(PyExc_ImportError,
3640 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003641 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003642 }
3643 all = PyMapping_Keys(dict);
3644 Py_DECREF(dict);
3645 if (all == NULL)
3646 return -1;
3647 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003648 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003649
3650 for (pos = 0, err = 0; ; pos++) {
3651 name = PySequence_GetItem(all, pos);
3652 if (name == NULL) {
3653 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3654 err = -1;
3655 else
3656 PyErr_Clear();
3657 break;
3658 }
3659 if (skip_leading_underscores &&
3660 PyString_Check(name) &&
3661 PyString_AS_STRING(name)[0] == '_')
3662 {
3663 Py_DECREF(name);
3664 continue;
3665 }
3666 value = PyObject_GetAttr(v, name);
3667 if (value == NULL)
3668 err = -1;
3669 else
3670 err = PyDict_SetItem(locals, name, value);
3671 Py_DECREF(name);
3672 Py_XDECREF(value);
3673 if (err != 0)
3674 break;
3675 }
3676 Py_DECREF(all);
3677 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003678}
3679
Guido van Rossumb209a111997-04-29 18:18:01 +00003680static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003681build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003682{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003683 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003684
3685 if (PyDict_Check(methods))
3686 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003687 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003688 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003689 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3690 base = PyTuple_GET_ITEM(bases, 0);
3691 metaclass = PyObject_GetAttrString(base, "__class__");
3692 if (metaclass == NULL) {
3693 PyErr_Clear();
3694 metaclass = (PyObject *)base->ob_type;
3695 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003696 }
3697 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003698 else {
3699 PyObject *g = PyEval_GetGlobals();
3700 if (g != NULL && PyDict_Check(g))
3701 metaclass = PyDict_GetItemString(g, "__metaclass__");
3702 if (metaclass == NULL)
3703 metaclass = (PyObject *) &PyClass_Type;
3704 Py_INCREF(metaclass);
3705 }
3706 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3707 Py_DECREF(metaclass);
3708 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003709}
3710
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003711static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003712exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3713 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003714{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003715 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003716 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003717 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003718
Guido van Rossumb209a111997-04-29 18:18:01 +00003719 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3720 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003721 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003722 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003723 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003724 locals = PyTuple_GetItem(prog, 2);
3725 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003726 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003727 if (globals == Py_None) {
3728 globals = PyEval_GetGlobals();
3729 if (locals == Py_None) {
3730 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003731 plain = 1;
3732 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003733 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003734 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003735 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003736 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003737 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003738 !PyCode_Check(prog) &&
3739 !PyFile_Check(prog)) {
3740 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003741 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003742 return -1;
3743 }
Fred Drake661ea262000-10-24 19:57:45 +00003744 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003745 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003746 "exec: arg 2 must be a dictionary or None");
3747 return -1;
3748 }
3749 if (!PyDict_Check(locals)) {
3750 PyErr_SetString(PyExc_TypeError,
3751 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003752 return -1;
3753 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003754 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003755 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003756 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003757 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3758 PyErr_SetString(PyExc_TypeError,
3759 "code object passed to exec may not contain free variables");
3760 return -1;
3761 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003762 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003763 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003764 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003765 FILE *fp = PyFile_AsFile(prog);
3766 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003767 PyCompilerFlags cf;
3768 cf.cf_flags = 0;
3769 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003770 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3771 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003772 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003773 v = PyRun_File(fp, name, Py_file_input, globals,
3774 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003775 }
3776 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003777 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003778 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003779 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003780 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003781 cf.cf_flags = 0;
3782 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003783 v = PyRun_StringFlags(str, Py_file_input, globals,
3784 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003785 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003786 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003787 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003788 if (plain)
3789 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003790 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003791 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003792 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003793 return 0;
3794}
Guido van Rossum24c13741995-02-14 09:42:43 +00003795
Guido van Rossumac7be682001-01-17 15:42:30 +00003796static void
Paul Prescode68140d2000-08-30 20:25:01 +00003797format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3798{
3799 char *obj_str;
3800
3801 if (!obj)
3802 return;
3803
3804 obj_str = PyString_AsString(obj);
3805 if (!obj_str)
3806 return;
3807
3808 PyErr_Format(exc, format_str, obj_str);
3809}
Guido van Rossum950361c1997-01-24 13:49:28 +00003810
3811#ifdef DYNAMIC_EXECUTION_PROFILE
3812
Skip Montanarof118cb12001-10-15 20:51:38 +00003813static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003814getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003815{
3816 int i;
3817 PyObject *l = PyList_New(256);
3818 if (l == NULL) return NULL;
3819 for (i = 0; i < 256; i++) {
3820 PyObject *x = PyInt_FromLong(a[i]);
3821 if (x == NULL) {
3822 Py_DECREF(l);
3823 return NULL;
3824 }
3825 PyList_SetItem(l, i, x);
3826 }
3827 for (i = 0; i < 256; i++)
3828 a[i] = 0;
3829 return l;
3830}
3831
3832PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003833_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003834{
3835#ifndef DXPAIRS
3836 return getarray(dxp);
3837#else
3838 int i;
3839 PyObject *l = PyList_New(257);
3840 if (l == NULL) return NULL;
3841 for (i = 0; i < 257; i++) {
3842 PyObject *x = getarray(dxpairs[i]);
3843 if (x == NULL) {
3844 Py_DECREF(l);
3845 return NULL;
3846 }
3847 PyList_SetItem(l, i, x);
3848 }
3849 return l;
3850#endif
3851}
3852
3853#endif