blob: 1c95cb9cfbae04123bd1a4280ce09bd31187cb09 [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. Hudson019a78e2002-11-08 12:53:11 +000054static void maybe_call_line_trace(Py_tracefunc, PyObject *,
Michael W. Hudsondd32a912002-08-15 14:59:02 +000055 PyFrameObject *, int *, int *);
56
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
58static int assign_slice(PyObject *, PyObject *,
59 PyObject *, PyObject *);
60static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000061static PyObject *import_from(PyObject *, PyObject *);
62static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static PyObject *build_class(PyObject *, PyObject *, PyObject *);
64static int exec_statement(PyFrameObject *,
65 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000066static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
67static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000068static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000069
Paul Prescode68140d2000-08-30 20:25:01 +000070#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000071 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000072#define GLOBAL_NAME_ERROR_MSG \
73 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000074#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000075 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000076#define UNBOUNDFREE_ERROR_MSG \
77 "free variable '%.200s' referenced before assignment" \
78 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000079
Guido van Rossum950361c1997-01-24 13:49:28 +000080/* Dynamic execution profile */
81#ifdef DYNAMIC_EXECUTION_PROFILE
82#ifdef DXPAIRS
83static long dxpairs[257][256];
84#define dxp dxpairs[256]
85#else
86static long dxp[256];
87#endif
88#endif
89
Jeremy Hylton938ace62002-07-17 16:30:39 +000090static PyTypeObject gentype;
Tim Peters5ca576e2001-06-18 22:08:13 +000091
92typedef struct {
93 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000094 /* The gi_ prefix is intended to remind of generator-iterator. */
95
96 PyFrameObject *gi_frame;
97
Tim Peterse77f2e22001-06-26 22:24:51 +000098 /* True if generator is being executed. */
99 int gi_running;
Fred Drake72bc4562002-08-09 18:35:52 +0000100
101 /* List of weak reference. */
102 PyObject *gi_weakreflist;
Tim Peters5ca576e2001-06-18 22:08:13 +0000103} genobject;
104
105static PyObject *
106gen_new(PyFrameObject *f)
107{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000108 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000109 if (gen == NULL) {
110 Py_DECREF(f);
111 return NULL;
112 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000113 gen->gi_frame = f;
114 gen->gi_running = 0;
Fred Drake72bc4562002-08-09 18:35:52 +0000115 gen->gi_weakreflist = NULL;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000116 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000117 return (PyObject *)gen;
118}
119
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000120static int
121gen_traverse(genobject *gen, visitproc visit, void *arg)
122{
123 return visit((PyObject *)gen->gi_frame, arg);
124}
125
Tim Peters5ca576e2001-06-18 22:08:13 +0000126static void
127gen_dealloc(genobject *gen)
128{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000129 _PyObject_GC_UNTRACK(gen);
Fred Drake72bc4562002-08-09 18:35:52 +0000130 if (gen->gi_weakreflist != NULL)
131 PyObject_ClearWeakRefs((PyObject *) gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000133 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000134}
135
136static PyObject *
137gen_iternext(genobject *gen)
138{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000139 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000140 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 PyObject *result;
142
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000143 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000144 PyErr_SetString(PyExc_ValueError,
145 "generator already executing");
146 return NULL;
147 }
Tim Peters8c963692001-06-23 05:26:56 +0000148 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000150
151 /* Generators always return to their most recent caller, not
152 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000153 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000154 assert(f->f_back == NULL);
155 f->f_back = tstate->frame;
156
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000157 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000158 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000159 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000160
161 /* Don't keep the reference to f_back any longer than necessary. It
162 * may keep a chain of frames alive or it could create a reference
163 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000164 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000165 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166
Tim Petersad1a18b2001-06-23 06:19:16 +0000167 /* If the generator just returned (as opposed to yielding), signal
168 * that the generator is exhausted. */
169 if (result == Py_None && f->f_stacktop == NULL) {
170 Py_DECREF(result);
171 result = NULL;
172 }
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000175}
176
177static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000178gen_getiter(PyObject *gen)
179{
180 Py_INCREF(gen);
181 return gen;
182}
183
Guido van Rossum6f799372001-09-20 20:46:19 +0000184static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000185 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
186 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
187 {NULL} /* Sentinel */
188};
Tim Peters5ca576e2001-06-18 22:08:13 +0000189
Tim Peters0c322792002-07-17 16:49:03 +0000190static PyTypeObject gentype = {
Tim Peters5ca576e2001-06-18 22:08:13 +0000191 PyObject_HEAD_INIT(&PyType_Type)
192 0, /* ob_size */
193 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000194 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000195 0, /* tp_itemsize */
196 /* methods */
197 (destructor)gen_dealloc, /* tp_dealloc */
198 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000199 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000200 0, /* tp_setattr */
201 0, /* tp_compare */
202 0, /* tp_repr */
203 0, /* tp_as_number */
204 0, /* tp_as_sequence */
205 0, /* tp_as_mapping */
206 0, /* tp_hash */
207 0, /* tp_call */
208 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000209 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000210 0, /* tp_setattro */
211 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000212 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000214 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000215 0, /* tp_clear */
216 0, /* tp_richcompare */
Fred Drake72bc4562002-08-09 18:35:52 +0000217 offsetof(genobject, gi_weakreflist), /* tp_weaklistoffset */
Tim Peters5ca576e2001-06-18 22:08:13 +0000218 (getiterfunc)gen_getiter, /* tp_iter */
219 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Petersa64295b2002-07-17 00:15:22 +0000220 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 gen_memberlist, /* tp_members */
222 0, /* tp_getset */
223 0, /* tp_base */
224 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225};
226
227
Guido van Rossume59214e1994-08-30 08:01:59 +0000228#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000229
Guido van Rossum2571cc81999-04-07 16:07:23 +0000230#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000231#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000232#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000233#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000234
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235extern int _PyThread_Started; /* Flag for Py_Exit */
236
Guido van Rossum65d5b571998-12-21 19:32:43 +0000237static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000238static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000239
240void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000242{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000244 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000246 interpreter_lock = PyThread_allocate_lock();
247 PyThread_acquire_lock(interpreter_lock, 1);
248 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000250
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000254 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255}
256
257void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000259{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000260 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261}
262
263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000265{
266 if (tstate == NULL)
267 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000269 if (PyThreadState_Swap(tstate) != NULL)
270 Py_FatalError(
271 "PyEval_AcquireThread: non-NULL old thread state");
272}
273
274void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000276{
277 if (tstate == NULL)
278 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
279 if (PyThreadState_Swap(NULL) != tstate)
280 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000283
284/* This function is called from PyOS_AfterFork to ensure that newly
285 created child processes don't hold locks referring to threads which
286 are not running in the child process. (This could also be done using
287 pthread_atfork mechanism, at least for the pthreads implementation.) */
288
289void
290PyEval_ReInitThreads(void)
291{
292 if (!interpreter_lock)
293 return;
294 /*XXX Can't use PyThread_free_lock here because it does too
295 much error-checking. Doing this cleanly would require
296 adding a new function to each thread_*.h. Instead, just
297 create a new lock and waste a little bit of memory */
298 interpreter_lock = PyThread_allocate_lock();
299 PyThread_acquire_lock(interpreter_lock, 1);
300 main_thread = PyThread_get_thread_ident();
301}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302#endif
303
Guido van Rossumff4949e1992-08-05 19:58:53 +0000304/* Functions save_thread and restore_thread are always defined so
305 dynamically loaded modules needn't be compiled separately for use
306 with and without threads: */
307
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000308PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000309PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000311 PyThreadState *tstate = PyThreadState_Swap(NULL);
312 if (tstate == NULL)
313 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000314#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000315 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000318 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319}
320
321void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 if (tstate == NULL)
325 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 }
332#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336
Guido van Rossuma9672091994-09-14 13:31:22 +0000337/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
338 signal handlers or Mac I/O completion routines) can schedule calls
339 to a function to be called synchronously.
340 The synchronous function is called with one void* argument.
341 It should return 0 for success or -1 for failure -- failure should
342 be accompanied by an exception.
343
344 If registry succeeds, the registry function returns 0; if it fails
345 (e.g. due to too many pending calls) it returns -1 (without setting
346 an exception condition).
347
348 Note that because registry may occur from within signal handlers,
349 or other asynchronous events, calling malloc() is unsafe!
350
351#ifdef WITH_THREAD
352 Any thread can schedule pending calls, but only the main thread
353 will execute them.
354#endif
355
356 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
357 There are two possible race conditions:
358 (1) nested asynchronous registry calls;
359 (2) registry calls made while pending calls are being processed.
360 While (1) is very unlikely, (2) is a real possibility.
361 The current code is safe against (2), but not against (1).
362 The safety against (2) is derived from the fact that only one
363 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000364
Guido van Rossuma027efa1997-05-05 20:56:21 +0000365 XXX Darn! With the advent of thread state, we should have an array
366 of pending calls per thread in the thread state! Later...
367*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000368
Guido van Rossuma9672091994-09-14 13:31:22 +0000369#define NPENDINGCALLS 32
370static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000371 int (*func)(void *);
372 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373} pendingcalls[NPENDINGCALLS];
374static volatile int pendingfirst = 0;
375static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
378int
Thomas Wouters334fb892000-07-25 12:56:38 +0000379Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000380{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 int i, j;
383 /* XXX Begin critical section */
384 /* XXX If you want this to be safe against nested
385 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 if (busy)
387 return -1;
388 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389 i = pendinglast;
390 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000391 if (j == pendingfirst) {
392 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000393 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000394 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 pendingcalls[i].func = func;
396 pendingcalls[i].arg = arg;
397 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000398
399 _Py_Ticker = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 /* XXX End critical section */
403 return 0;
404}
405
Guido van Rossum180d7b41994-09-29 09:45:57 +0000406int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000407Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000408{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000409 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000410#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000411 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000412 return 0;
413#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415 return 0;
416 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000417 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418 for (;;) {
419 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000420 int (*func)(void *);
421 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000422 i = pendingfirst;
423 if (i == pendinglast)
424 break; /* Queue empty */
425 func = pendingcalls[i].func;
426 arg = pendingcalls[i].arg;
427 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000428 if (func(arg) < 0) {
429 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000432 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000433 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000434 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000435 return 0;
436}
437
438
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000439/* The interpreter's recursion limit */
440
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000441static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000442
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000443int
444Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000445{
446 return recursion_limit;
447}
448
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000449void
450Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451{
452 recursion_limit = new_limit;
453}
454
Guido van Rossum374a9221991-04-04 10:40:29 +0000455/* Status code for main loop (reason for stack unwind) */
456
457enum why_code {
458 WHY_NOT, /* No error */
459 WHY_EXCEPTION, /* Exception occurred */
460 WHY_RERAISE, /* Exception re-raised by 'finally' */
461 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000462 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000463 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000464 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000465};
466
Tim Petersdbd9ba62000-07-09 03:09:57 +0000467static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000468static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000469
Skip Montanarod581d772002-09-03 20:10:45 +0000470/* for manipulating the thread switch and periodic "stuff" - used to be
471 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000472int _Py_CheckInterval = 100;
473volatile int _Py_Ticker = 100;
Guido van Rossum374a9221991-04-04 10:40:29 +0000474
Guido van Rossumb209a111997-04-29 18:18:01 +0000475PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000476PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000478 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 (PyObject **)NULL, 0,
481 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482 (PyObject **)NULL, 0,
483 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484}
485
486
487/* Interpreter main loop */
488
Tim Peters6d6c1a32001-08-02 04:15:00 +0000489static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000490eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000491{
Guido van Rossum950361c1997-01-24 13:49:28 +0000492#ifdef DXPAIRS
493 int lastopcode = 0;
494#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000495 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000496 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000497 register int opcode=0; /* Current opcode */
498 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000499 register enum why_code why; /* Reason for block stack unwind */
500 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000501 register PyObject *x; /* Result object -- NULL if error */
502 register PyObject *v; /* Temporary objects popped off stack */
503 register PyObject *w;
504 register PyObject *u;
505 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000506 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000507 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000508 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000509 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000510 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000511
512 /* when tracing we set things up so that
513
514 not (instr_lb <= current_bytecode_offset < instr_ub)
515
516 is true when the line being executed has changed. The
517 initial values are such as to make this false the first
518 time it is tested. */
519 int instr_ub = -1, instr_lb = 0;
520
Guido van Rossumd076c731998-10-07 19:42:25 +0000521 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000522 PyObject *names;
523 PyObject *consts;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000524#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000525 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000526#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000527#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000529 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000530#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000531
Neal Norwitza81d2202002-07-14 00:27:26 +0000532/* Tuple access macros */
533
534#ifndef Py_DEBUG
535#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
536#else
537#define GETITEM(v, i) PyTuple_GetItem((v), (i))
538#endif
539
Guido van Rossum374a9221991-04-04 10:40:29 +0000540/* Code access macros */
541
Guido van Rossumd076c731998-10-07 19:42:25 +0000542#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000543#define NEXTOP() (*next_instr++)
544#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000545#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000546#define JUMPBY(x) (next_instr += (x))
547
548/* Stack manipulation macros */
549
550#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
551#define EMPTY() (STACK_LEVEL() == 0)
552#define TOP() (stack_pointer[-1])
553#define BASIC_PUSH(v) (*stack_pointer++ = (v))
554#define BASIC_POP() (*--stack_pointer)
555
Guido van Rossum96a42c81992-01-12 02:29:51 +0000556#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000557#define PUSH(v) { (void)(BASIC_PUSH(v), \
558 lltrace && prtrace(TOP(), "push")); \
559 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000560#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000561#else
562#define PUSH(v) BASIC_PUSH(v)
563#define POP() BASIC_POP()
564#endif
565
Guido van Rossum681d79a1995-07-18 14:51:37 +0000566/* Local variable macros */
567
568#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000569
570/* The SETLOCAL() macro must not DECREF the local variable in-place and
571 then store the new value; it must copy the old value to a temporary
572 value, then store the new value, and then DECREF the temporary value.
573 This is because it is possible that during the DECREF the frame is
574 accessed by other code (e.g. a __del__ method or gc.collect()) and the
575 variable would be pointing to already-freed memory. */
576#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
577 GETLOCAL(i) = value; \
578 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000579
Guido van Rossuma027efa1997-05-05 20:56:21 +0000580/* Start of code */
581
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 if (f == NULL)
583 return NULL;
584
Guido van Rossum8861b741996-07-30 16:49:37 +0000585#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000586 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000587 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000588 return NULL;
589 }
590#endif
591
Tim Peters5ca576e2001-06-18 22:08:13 +0000592 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000593 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000594 --tstate->recursion_depth;
595 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000596 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000597 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000598 return NULL;
599 }
600
Tim Peters5ca576e2001-06-18 22:08:13 +0000601 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000602
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000603 if (tstate->use_tracing) {
604 if (tstate->c_tracefunc != NULL) {
605 /* tstate->c_tracefunc, if defined, is a
606 function that will be called on *every* entry
607 to a code block. Its return value, if not
608 None, is a function that will be called at
609 the start of each executed line of code.
610 (Actually, the function must return itself
611 in order to continue tracing.) The trace
612 functions are called with three arguments:
613 a pointer to the current frame, a string
614 indicating why the function is called, and
615 an argument which depends on the situation.
616 The global trace function is also called
617 whenever an exception is detected. */
618 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
619 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000620 /* Trace function raised an error */
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000621 --tstate->recursion_depth;
622 tstate->frame = f->f_back;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000623 return NULL;
624 }
625 }
626 if (tstate->c_profilefunc != NULL) {
627 /* Similar for c_profilefunc, except it needn't
628 return itself and isn't called for "line" events */
629 if (call_trace(tstate->c_profilefunc,
630 tstate->c_profileobj,
631 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000632 /* Profile function raised an error */
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000633 --tstate->recursion_depth;
634 tstate->frame = f->f_back;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000635 return NULL;
636 }
637 }
638 }
639
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000640 co = f->f_code;
641 names = co->co_names;
642 consts = co->co_consts;
643 fastlocals = f->f_localsplus;
644 freevars = f->f_localsplus + f->f_nlocals;
645 _PyCode_GETCODEPTR(co, &first_instr);
646 /* An explanation is in order for the next line.
647
648 f->f_lasti now refers to the index of the last instruction
649 executed. You might think this was obvious from the name, but
650 this wasn't always true before 2.3! PyFrame_New now sets
651 f->f_lasti to -1 (i.e. the index *before* the first instruction)
652 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
653 does work. Promise. */
654 next_instr = first_instr + f->f_lasti + 1;
655 stack_pointer = f->f_stacktop;
656 assert(stack_pointer != NULL);
657 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
658
Tim Peters5ca576e2001-06-18 22:08:13 +0000659#ifdef LLTRACE
660 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
661#endif
662#if defined(Py_DEBUG) || defined(LLTRACE)
663 filename = PyString_AsString(co->co_filename);
664#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000665
Guido van Rossum374a9221991-04-04 10:40:29 +0000666 why = WHY_NOT;
667 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000668 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000669 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000670
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 for (;;) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000672 assert(stack_pointer >= f->f_valuestack); /* else underflow */
673 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
674
Guido van Rossuma027efa1997-05-05 20:56:21 +0000675 /* Do periodic things. Doing this every time through
676 the loop would add too much overhead, so we do it
677 only every Nth instruction. We also do it if
678 ``things_to_do'' is set, i.e. when an asynchronous
679 event needs attention (e.g. a signal handler or
680 async I/O handler); see Py_AddPendingCall() and
681 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000682
Skip Montanarod581d772002-09-03 20:10:45 +0000683 if (--_Py_Ticker < 0) {
684 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000685 tstate->tick_counter++;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000686 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000687 if (Py_MakePendingCalls() < 0) {
688 why = WHY_EXCEPTION;
689 goto on_error;
690 }
691 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000692#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000693 /* If we have true signals, the signal handler
694 will call Py_AddPendingCall() so we don't
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000695 have to call PyErr_CheckSignals(). On the
696 Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000697 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 goto on_error;
700 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000701#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000702
Guido van Rossume59214e1994-08-30 08:01:59 +0000703#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000704 if (interpreter_lock) {
705 /* Give another thread a chance */
706
Guido van Rossum25ce5661997-08-02 03:10:38 +0000707 if (PyThreadState_Swap(NULL) != tstate)
708 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000709 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000710
711 /* Other threads may run now */
712
Guido van Rossum65d5b571998-12-21 19:32:43 +0000713 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000714 if (PyThreadState_Swap(tstate) != NULL)
715 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000716 }
717#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000719
Neil Schemenauer63543862002-02-17 19:10:14 +0000720 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000721 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000723 /* line-by-line tracing support */
724
725 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
726 /* see maybe_call_line_trace
727 for expository comments */
728 f->f_stacktop = stack_pointer;
729 maybe_call_line_trace(tstate->c_tracefunc,
730 tstate->c_traceobj,
731 f, &instr_lb, &instr_ub);
732 /* Reload possibly changed frame fields */
733 JUMPTO(f->f_lasti);
734 stack_pointer = f->f_stacktop;
735 assert(stack_pointer != NULL);
736 f->f_stacktop = NULL;
737 }
738
739 /* Extract opcode and argument */
740
Guido van Rossum374a9221991-04-04 10:40:29 +0000741 opcode = NEXTOP();
742 if (HAS_ARG(opcode))
743 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000744 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000745#ifdef DYNAMIC_EXECUTION_PROFILE
746#ifdef DXPAIRS
747 dxpairs[lastopcode][opcode]++;
748 lastopcode = opcode;
749#endif
750 dxp[opcode]++;
751#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000752
Guido van Rossum96a42c81992-01-12 02:29:51 +0000753#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000755
Guido van Rossum96a42c81992-01-12 02:29:51 +0000756 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 if (HAS_ARG(opcode)) {
758 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000759 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 }
761 else {
762 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000763 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 }
765 }
766#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000767
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000769
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000771
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 /* BEWARE!
773 It is essential that any operation that fails sets either
774 x to NULL, err to nonzero, or why to anything but WHY_NOT,
775 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000776
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000778
Neil Schemenauer63543862002-02-17 19:10:14 +0000779 case LOAD_FAST:
780 x = GETLOCAL(oparg);
781 if (x != NULL) {
782 Py_INCREF(x);
783 PUSH(x);
784 goto fast_next_opcode;
785 }
786 format_exc_check_arg(PyExc_UnboundLocalError,
787 UNBOUNDLOCAL_ERROR_MSG,
788 PyTuple_GetItem(co->co_varnames, oparg));
789 break;
790
791 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000792 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000793 Py_INCREF(x);
794 PUSH(x);
795 goto fast_next_opcode;
796
797 case STORE_FAST:
798 v = POP();
799 SETLOCAL(oparg, v);
800 goto fast_next_opcode;
801
Guido van Rossum374a9221991-04-04 10:40:29 +0000802 case POP_TOP:
803 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000804 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000805 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000806
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 case ROT_TWO:
808 v = POP();
809 w = POP();
810 PUSH(v);
811 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000812 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000813
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 case ROT_THREE:
815 v = POP();
816 w = POP();
817 x = POP();
818 PUSH(v);
819 PUSH(x);
820 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000821 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000822
Thomas Wouters434d0822000-08-24 20:11:32 +0000823 case ROT_FOUR:
824 u = POP();
825 v = POP();
826 w = POP();
827 x = POP();
828 PUSH(u);
829 PUSH(x);
830 PUSH(w);
831 PUSH(v);
832 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000833
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 case DUP_TOP:
835 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000836 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000838 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000839
Thomas Wouters434d0822000-08-24 20:11:32 +0000840 case DUP_TOPX:
841 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000842 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000843 x = TOP();
844 Py_INCREF(x);
845 PUSH(x);
846 continue;
847 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000848 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000849 Py_INCREF(x);
850 w = TOP();
851 Py_INCREF(w);
852 PUSH(x);
853 PUSH(w);
854 PUSH(x);
855 continue;
856 case 3:
857 x = POP();
858 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000859 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000860 Py_INCREF(w);
861 v = TOP();
862 Py_INCREF(v);
863 PUSH(w);
864 PUSH(x);
865 PUSH(v);
866 PUSH(w);
867 PUSH(x);
868 continue;
869 case 4:
870 x = POP();
871 Py_INCREF(x);
872 w = POP();
873 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000874 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000875 Py_INCREF(v);
876 u = TOP();
877 Py_INCREF(u);
878 PUSH(v);
879 PUSH(w);
880 PUSH(x);
881 PUSH(u);
882 PUSH(v);
883 PUSH(w);
884 PUSH(x);
885 continue;
886 case 5:
887 x = POP();
888 Py_INCREF(x);
889 w = POP();
890 Py_INCREF(w);
891 v = POP();
892 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000893 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000894 Py_INCREF(u);
895 t = TOP();
896 Py_INCREF(t);
897 PUSH(u);
898 PUSH(v);
899 PUSH(w);
900 PUSH(x);
901 PUSH(t);
902 PUSH(u);
903 PUSH(v);
904 PUSH(w);
905 PUSH(x);
906 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000907 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000908 Py_FatalError("invalid argument to DUP_TOPX"
909 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000910 }
Tim Peters35ba6892000-10-11 07:04:49 +0000911 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 case UNARY_POSITIVE:
914 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000915 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000916 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000918 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000920
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 case UNARY_NEGATIVE:
922 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000923 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000926 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000928
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 case UNARY_NOT:
930 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000931 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000932 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000933 if (err == 0) {
934 Py_INCREF(Py_True);
935 PUSH(Py_True);
936 continue;
937 }
938 else if (err > 0) {
939 Py_INCREF(Py_False);
940 PUSH(Py_False);
941 err = 0;
942 continue;
943 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000945
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 case UNARY_CONVERT:
947 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000948 x = PyObject_Repr(v);
949 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000951 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000953
Guido van Rossum7928cd71991-10-24 14:59:31 +0000954 case UNARY_INVERT:
955 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000956 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000957 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000958 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000959 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000960 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000961
Guido van Rossum50564e81996-01-12 01:13:16 +0000962 case BINARY_POWER:
963 w = POP();
964 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000965 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000966 Py_DECREF(v);
967 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000968 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000969 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000970 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000971
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 case BINARY_MULTIPLY:
973 w = POP();
974 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000975 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000976 Py_DECREF(v);
977 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000979 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000981
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000983 if (!_Py_QnewFlag) {
984 w = POP();
985 v = POP();
986 x = PyNumber_Divide(v, w);
987 Py_DECREF(v);
988 Py_DECREF(w);
989 PUSH(x);
990 if (x != NULL) continue;
991 break;
992 }
993 /* -Qnew is in effect: fall through to
994 BINARY_TRUE_DIVIDE */
995 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 w = POP();
997 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000998 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000999 Py_DECREF(v);
1000 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001002 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001003 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001004
Guido van Rossum4668b002001-08-08 05:00:18 +00001005 case BINARY_FLOOR_DIVIDE:
1006 w = POP();
1007 v = POP();
1008 x = PyNumber_FloorDivide(v, w);
1009 Py_DECREF(v);
1010 Py_DECREF(w);
1011 PUSH(x);
1012 if (x != NULL) continue;
1013 break;
1014
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 case BINARY_MODULO:
1016 w = POP();
1017 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001018 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001019 Py_DECREF(v);
1020 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001022 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001023 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001024
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 case BINARY_ADD:
1026 w = POP();
1027 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001028 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001029 /* INLINE: int + int */
1030 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001031 a = PyInt_AS_LONG(v);
1032 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001033 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001034 if ((i^a) < 0 && (i^b) < 0)
1035 goto slow_add;
1036 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001037 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001038 else {
1039 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001040 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001041 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 Py_DECREF(v);
1043 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001045 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001047
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 case BINARY_SUBTRACT:
1049 w = POP();
1050 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001051 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001052 /* INLINE: int - int */
1053 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001054 a = PyInt_AS_LONG(v);
1055 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001056 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001057 if ((i^a) < 0 && (i^~b) < 0)
1058 goto slow_sub;
1059 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001060 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001061 else {
1062 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001063 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001064 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001065 Py_DECREF(v);
1066 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001067 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001068 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001069 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001070
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 case BINARY_SUBSCR:
1072 w = POP();
1073 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001074 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001075 /* INLINE: list[int] */
1076 long i = PyInt_AsLong(w);
1077 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001078 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001079 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001080 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001081 PyErr_SetString(PyExc_IndexError,
1082 "list index out of range");
1083 x = NULL;
1084 }
1085 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001086 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001087 Py_INCREF(x);
1088 }
1089 }
1090 else
1091 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001092 Py_DECREF(v);
1093 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001094 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001095 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001097
Guido van Rossum7928cd71991-10-24 14:59:31 +00001098 case BINARY_LSHIFT:
1099 w = POP();
1100 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001101 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001102 Py_DECREF(v);
1103 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001104 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001105 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001106 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001107
Guido van Rossum7928cd71991-10-24 14:59:31 +00001108 case BINARY_RSHIFT:
1109 w = POP();
1110 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001111 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001112 Py_DECREF(v);
1113 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001114 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001115 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001116 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Guido van Rossum7928cd71991-10-24 14:59:31 +00001118 case BINARY_AND:
1119 w = POP();
1120 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001121 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001122 Py_DECREF(v);
1123 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001124 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001125 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001126 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001127
Guido van Rossum7928cd71991-10-24 14:59:31 +00001128 case BINARY_XOR:
1129 w = POP();
1130 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001131 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001132 Py_DECREF(v);
1133 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001134 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001135 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001136 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001137
Guido van Rossum7928cd71991-10-24 14:59:31 +00001138 case BINARY_OR:
1139 w = POP();
1140 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001141 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001142 Py_DECREF(v);
1143 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001144 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001145 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001146 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001147
1148 case INPLACE_POWER:
1149 w = POP();
1150 v = POP();
1151 x = PyNumber_InPlacePower(v, w, Py_None);
1152 Py_DECREF(v);
1153 Py_DECREF(w);
1154 PUSH(x);
1155 if (x != NULL) continue;
1156 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001157
Thomas Wouters434d0822000-08-24 20:11:32 +00001158 case INPLACE_MULTIPLY:
1159 w = POP();
1160 v = POP();
1161 x = PyNumber_InPlaceMultiply(v, w);
1162 Py_DECREF(v);
1163 Py_DECREF(w);
1164 PUSH(x);
1165 if (x != NULL) continue;
1166 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001167
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001169 if (!_Py_QnewFlag) {
1170 w = POP();
1171 v = POP();
1172 x = PyNumber_InPlaceDivide(v, w);
1173 Py_DECREF(v);
1174 Py_DECREF(w);
1175 PUSH(x);
1176 if (x != NULL) continue;
1177 break;
1178 }
1179 /* -Qnew is in effect: fall through to
1180 INPLACE_TRUE_DIVIDE */
1181 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001182 w = POP();
1183 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001184 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001185 Py_DECREF(v);
1186 Py_DECREF(w);
1187 PUSH(x);
1188 if (x != NULL) continue;
1189 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001190
Guido van Rossum4668b002001-08-08 05:00:18 +00001191 case INPLACE_FLOOR_DIVIDE:
1192 w = POP();
1193 v = POP();
1194 x = PyNumber_InPlaceFloorDivide(v, w);
1195 Py_DECREF(v);
1196 Py_DECREF(w);
1197 PUSH(x);
1198 if (x != NULL) continue;
1199 break;
1200
Thomas Wouters434d0822000-08-24 20:11:32 +00001201 case INPLACE_MODULO:
1202 w = POP();
1203 v = POP();
1204 x = PyNumber_InPlaceRemainder(v, w);
1205 Py_DECREF(v);
1206 Py_DECREF(w);
1207 PUSH(x);
1208 if (x != NULL) continue;
1209 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001210
Thomas Wouters434d0822000-08-24 20:11:32 +00001211 case INPLACE_ADD:
1212 w = POP();
1213 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001214 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 /* INLINE: int + int */
1216 register long a, b, i;
1217 a = PyInt_AS_LONG(v);
1218 b = PyInt_AS_LONG(w);
1219 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001220 if ((i^a) < 0 && (i^b) < 0)
1221 goto slow_iadd;
1222 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001223 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001224 else {
1225 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001226 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001227 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001228 Py_DECREF(v);
1229 Py_DECREF(w);
1230 PUSH(x);
1231 if (x != NULL) continue;
1232 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001233
Thomas Wouters434d0822000-08-24 20:11:32 +00001234 case INPLACE_SUBTRACT:
1235 w = POP();
1236 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001237 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001238 /* INLINE: int - int */
1239 register long a, b, i;
1240 a = PyInt_AS_LONG(v);
1241 b = PyInt_AS_LONG(w);
1242 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001243 if ((i^a) < 0 && (i^~b) < 0)
1244 goto slow_isub;
1245 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001246 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001247 else {
1248 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001249 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001250 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001251 Py_DECREF(v);
1252 Py_DECREF(w);
1253 PUSH(x);
1254 if (x != NULL) continue;
1255 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001256
Thomas Wouters434d0822000-08-24 20:11:32 +00001257 case INPLACE_LSHIFT:
1258 w = POP();
1259 v = POP();
1260 x = PyNumber_InPlaceLshift(v, w);
1261 Py_DECREF(v);
1262 Py_DECREF(w);
1263 PUSH(x);
1264 if (x != NULL) continue;
1265 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001266
Thomas Wouters434d0822000-08-24 20:11:32 +00001267 case INPLACE_RSHIFT:
1268 w = POP();
1269 v = POP();
1270 x = PyNumber_InPlaceRshift(v, w);
1271 Py_DECREF(v);
1272 Py_DECREF(w);
1273 PUSH(x);
1274 if (x != NULL) continue;
1275 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001276
Thomas Wouters434d0822000-08-24 20:11:32 +00001277 case INPLACE_AND:
1278 w = POP();
1279 v = POP();
1280 x = PyNumber_InPlaceAnd(v, w);
1281 Py_DECREF(v);
1282 Py_DECREF(w);
1283 PUSH(x);
1284 if (x != NULL) continue;
1285 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001286
Thomas Wouters434d0822000-08-24 20:11:32 +00001287 case INPLACE_XOR:
1288 w = POP();
1289 v = POP();
1290 x = PyNumber_InPlaceXor(v, w);
1291 Py_DECREF(v);
1292 Py_DECREF(w);
1293 PUSH(x);
1294 if (x != NULL) continue;
1295 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001296
Thomas Wouters434d0822000-08-24 20:11:32 +00001297 case INPLACE_OR:
1298 w = POP();
1299 v = POP();
1300 x = PyNumber_InPlaceOr(v, w);
1301 Py_DECREF(v);
1302 Py_DECREF(w);
1303 PUSH(x);
1304 if (x != NULL) continue;
1305 break;
1306
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 case SLICE+0:
1308 case SLICE+1:
1309 case SLICE+2:
1310 case SLICE+3:
1311 if ((opcode-SLICE) & 2)
1312 w = POP();
1313 else
1314 w = NULL;
1315 if ((opcode-SLICE) & 1)
1316 v = POP();
1317 else
1318 v = NULL;
1319 u = POP();
1320 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 Py_DECREF(u);
1322 Py_XDECREF(v);
1323 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001325 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001327
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 case STORE_SLICE+0:
1329 case STORE_SLICE+1:
1330 case STORE_SLICE+2:
1331 case STORE_SLICE+3:
1332 if ((opcode-STORE_SLICE) & 2)
1333 w = POP();
1334 else
1335 w = NULL;
1336 if ((opcode-STORE_SLICE) & 1)
1337 v = POP();
1338 else
1339 v = NULL;
1340 u = POP();
1341 t = POP();
1342 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 Py_DECREF(t);
1344 Py_DECREF(u);
1345 Py_XDECREF(v);
1346 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001347 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001349
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 case DELETE_SLICE+0:
1351 case DELETE_SLICE+1:
1352 case DELETE_SLICE+2:
1353 case DELETE_SLICE+3:
1354 if ((opcode-DELETE_SLICE) & 2)
1355 w = POP();
1356 else
1357 w = NULL;
1358 if ((opcode-DELETE_SLICE) & 1)
1359 v = POP();
1360 else
1361 v = NULL;
1362 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001365 Py_DECREF(u);
1366 Py_XDECREF(v);
1367 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001368 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001370
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 case STORE_SUBSCR:
1372 w = POP();
1373 v = POP();
1374 u = POP();
1375 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001376 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 Py_DECREF(u);
1378 Py_DECREF(v);
1379 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001380 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001382
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 case DELETE_SUBSCR:
1384 w = POP();
1385 v = POP();
1386 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001387 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001388 Py_DECREF(v);
1389 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001390 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001392
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 case PRINT_EXPR:
1394 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001395 w = PySys_GetObject("displayhook");
1396 if (w == NULL) {
1397 PyErr_SetString(PyExc_RuntimeError,
1398 "lost sys.displayhook");
1399 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001400 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001401 }
1402 if (err == 0) {
1403 x = Py_BuildValue("(O)", v);
1404 if (x == NULL)
1405 err = -1;
1406 }
1407 if (err == 0) {
1408 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001409 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001410 if (w == NULL)
1411 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001414 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001416
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001417 case PRINT_ITEM_TO:
1418 w = stream = POP();
1419 /* fall through to PRINT_ITEM */
1420
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 case PRINT_ITEM:
1422 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001423 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001424 w = PySys_GetObject("stdout");
1425 if (w == NULL) {
1426 PyErr_SetString(PyExc_RuntimeError,
1427 "lost sys.stdout");
1428 err = -1;
1429 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001430 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001431 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001432 err = PyFile_WriteString(" ", w);
1433 if (err == 0)
1434 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001435 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001436 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001437 if (PyString_Check(v)) {
1438 char *s = PyString_AS_STRING(v);
1439 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001440 if (len == 0 ||
1441 !isspace(Py_CHARMASK(s[len-1])) ||
1442 s[len-1] == ' ')
1443 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001444 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001445#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001446 else if (PyUnicode_Check(v)) {
1447 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1448 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001449 if (len == 0 ||
1450 !Py_UNICODE_ISSPACE(s[len-1]) ||
1451 s[len-1] == ' ')
1452 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001453 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001454#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001455 else
1456 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001458 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001459 Py_XDECREF(stream);
1460 stream = NULL;
1461 if (err == 0)
1462 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001464
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001465 case PRINT_NEWLINE_TO:
1466 w = stream = POP();
1467 /* fall through to PRINT_NEWLINE */
1468
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001470 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001471 w = PySys_GetObject("stdout");
1472 if (w == NULL)
1473 PyErr_SetString(PyExc_RuntimeError,
1474 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001475 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001476 if (w != NULL) {
1477 err = PyFile_WriteString("\n", w);
1478 if (err == 0)
1479 PyFile_SoftSpace(w, 0);
1480 }
1481 Py_XDECREF(stream);
1482 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001484
Thomas Wouters434d0822000-08-24 20:11:32 +00001485
1486#ifdef CASE_TOO_BIG
1487 default: switch (opcode) {
1488#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 case BREAK_LOOP:
1490 why = WHY_BREAK;
1491 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001492
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001493 case CONTINUE_LOOP:
1494 retval = PyInt_FromLong(oparg);
1495 why = WHY_CONTINUE;
1496 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001497
Guido van Rossumf10570b1995-07-07 22:53:21 +00001498 case RAISE_VARARGS:
1499 u = v = w = NULL;
1500 switch (oparg) {
1501 case 3:
1502 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001503 /* Fallthrough */
1504 case 2:
1505 v = POP(); /* value */
1506 /* Fallthrough */
1507 case 1:
1508 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001509 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001510 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001511 break;
1512 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001514 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001515 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001516 break;
1517 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001519
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001521 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001522 PyErr_SetString(PyExc_SystemError,
1523 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001524 break;
1525 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001527 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 case RETURN_VALUE:
1531 retval = POP();
1532 why = WHY_RETURN;
1533 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001534
Tim Peters5ca576e2001-06-18 22:08:13 +00001535 case YIELD_VALUE:
1536 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001537 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001538 why = WHY_YIELD;
1539 break;
1540
1541
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001542 case EXEC_STMT:
1543 w = POP();
1544 v = POP();
1545 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001546 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 Py_DECREF(u);
1548 Py_DECREF(v);
1549 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001550 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001551
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 case POP_BLOCK:
1553 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 while (STACK_LEVEL() > b->b_level) {
1556 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 }
1559 }
1560 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001561
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 case END_FINALLY:
1563 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 if (PyInt_Check(v)) {
1565 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001566 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001567 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001568 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 retval = POP();
1570 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001571 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001573 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001576 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 else if (v != Py_None) {
1579 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 "'finally' pops bad exception");
1581 why = WHY_EXCEPTION;
1582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001585
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001587 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001589 w = POP();
1590 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 Py_DECREF(u);
1593 Py_DECREF(v);
1594 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001596
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001598 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001601 PyErr_Format(PyExc_SystemError,
1602 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001603 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001604 break;
1605 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 err = PyDict_SetItem(x, w, v);
1607 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001611 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001613 PyErr_Format(PyExc_SystemError,
1614 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001615 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001616 break;
1617 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001618 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001619 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001620 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001622
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001623 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001624 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001625 if (PyTuple_Check(v)) {
1626 if (PyTuple_Size(v) != oparg) {
1627 PyErr_SetString(PyExc_ValueError,
1628 "unpack tuple of wrong size");
1629 why = WHY_EXCEPTION;
1630 }
1631 else {
1632 for (; --oparg >= 0; ) {
1633 w = PyTuple_GET_ITEM(v, oparg);
1634 Py_INCREF(w);
1635 PUSH(w);
1636 }
1637 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001639 else if (PyList_Check(v)) {
1640 if (PyList_Size(v) != oparg) {
1641 PyErr_SetString(PyExc_ValueError,
1642 "unpack list of wrong size");
1643 why = WHY_EXCEPTION;
1644 }
1645 else {
1646 for (; --oparg >= 0; ) {
1647 w = PyList_GET_ITEM(v, oparg);
1648 Py_INCREF(w);
1649 PUSH(w);
1650 }
1651 }
1652 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001653 else if (unpack_iterable(v, oparg,
1654 stack_pointer + oparg))
1655 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001656 else {
1657 if (PyErr_ExceptionMatches(PyExc_TypeError))
1658 PyErr_SetString(PyExc_TypeError,
1659 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001660 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001661 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001663 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001664
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001666 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 v = POP();
1668 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1670 Py_DECREF(v);
1671 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001673
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001675 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001677 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1678 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001679 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001681
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001682 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001683 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001684 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 err = PyDict_SetItem(f->f_globals, w, v);
1686 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001687 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001688
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001689 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001690 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001692 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001693 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001694 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001695
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001697 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001698 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001699 PyErr_Format(PyExc_SystemError,
1700 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001701 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001702 break;
1703 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001704 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001709 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001710 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001711 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001712 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 break;
1714 }
1715 }
1716 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001717 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 PUSH(x);
1719 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001720
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001722 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001723 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001724 /* Inline the PyDict_GetItem() calls.
1725 WARNING: this is an extreme speed hack.
1726 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001727 long hash = ((PyStringObject *)w)->ob_shash;
1728 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001729 PyDictObject *d;
1730 d = (PyDictObject *)(f->f_globals);
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 d = (PyDictObject *)(f->f_builtins);
1738 x = d->ma_lookup(d, w, hash)->me_value;
1739 if (x != NULL) {
1740 Py_INCREF(x);
1741 PUSH(x);
1742 continue;
1743 }
1744 goto load_global_error;
1745 }
1746 }
1747 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001750 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001752 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001753 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001754 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001755 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 break;
1757 }
1758 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 PUSH(x);
1761 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001762
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001763 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001764 x = GETLOCAL(oparg);
1765 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001766 format_exc_check_arg(
1767 PyExc_UnboundLocalError,
1768 UNBOUNDLOCAL_ERROR_MSG,
1769 PyTuple_GetItem(co->co_varnames, oparg)
1770 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001771 break;
1772 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001773 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001774 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001775
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001776 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001777 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001778 Py_INCREF(x);
1779 PUSH(x);
1780 break;
1781
1782 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001783 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001784 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001785 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001786 err = -1;
1787 /* Don't stomp existing exception */
1788 if (PyErr_Occurred())
1789 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001790 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001791 v = PyTuple_GetItem(co->co_cellvars,
1792 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001793 format_exc_check_arg(
1794 PyExc_UnboundLocalError,
1795 UNBOUNDLOCAL_ERROR_MSG,
1796 v);
1797 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001798 v = PyTuple_GetItem(
1799 co->co_freevars,
1800 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001801 format_exc_check_arg(
1802 PyExc_NameError,
1803 UNBOUNDFREE_ERROR_MSG,
1804 v);
1805 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001806 break;
1807 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001808 PUSH(w);
1809 break;
1810
1811 case STORE_DEREF:
1812 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001813 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001814 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001815 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001816 continue;
1817
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001819 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 if (x != NULL) {
1821 for (; --oparg >= 0;) {
1822 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001823 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 }
1825 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001826 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 }
1828 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001829
Guido van Rossum374a9221991-04-04 10:40:29 +00001830 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001831 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 if (x != NULL) {
1833 for (; --oparg >= 0;) {
1834 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001835 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001836 }
1837 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001838 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 }
1840 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001841
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001845 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001847
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001849 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 x = PyObject_GetAttr(v, w);
1852 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001854 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001856
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 case COMPARE_OP:
1858 w = POP();
1859 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001860 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001861 /* INLINE: cmp(int, int) */
1862 register long a, b;
1863 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001864 a = PyInt_AS_LONG(v);
1865 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001866 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001867 case PyCmp_LT: res = a < b; break;
1868 case PyCmp_LE: res = a <= b; break;
1869 case PyCmp_EQ: res = a == b; break;
1870 case PyCmp_NE: res = a != b; break;
1871 case PyCmp_GT: res = a > b; break;
1872 case PyCmp_GE: res = a >= b; break;
1873 case PyCmp_IS: res = v == w; break;
1874 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001875 default: goto slow_compare;
1876 }
1877 x = res ? Py_True : Py_False;
1878 Py_INCREF(x);
1879 }
1880 else {
1881 slow_compare:
1882 x = cmp_outcome(oparg, v, w);
1883 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001884 Py_DECREF(v);
1885 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001886 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001887 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001888 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001889
Guido van Rossum374a9221991-04-04 10:40:29 +00001890 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001891 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001892 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001893 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001894 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001895 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001896 break;
1897 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001898 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001899 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001900 w,
1901 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001902 f->f_locals == NULL ?
1903 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001904 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001905 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001906 if (w == NULL) {
1907 x = NULL;
1908 break;
1909 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001910 x = PyEval_CallObject(x, w);
1911 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001912 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001913 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001914 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001915
Thomas Wouters52152252000-08-17 22:55:00 +00001916 case IMPORT_STAR:
1917 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001918 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001919 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001920 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001921 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001922 break;
1923 }
Thomas Wouters52152252000-08-17 22:55:00 +00001924 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001925 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001926 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001927 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001928 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001929
Thomas Wouters52152252000-08-17 22:55:00 +00001930 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001931 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001932 v = TOP();
1933 x = import_from(v, w);
1934 PUSH(x);
1935 if (x != NULL) continue;
1936 break;
1937
Guido van Rossum374a9221991-04-04 10:40:29 +00001938 case JUMP_FORWARD:
1939 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001940 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001941
Guido van Rossum374a9221991-04-04 10:40:29 +00001942 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001943 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001944 if (err > 0)
1945 err = 0;
1946 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001947 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001948 else
1949 break;
1950 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001951
Guido van Rossum374a9221991-04-04 10:40:29 +00001952 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001953 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001954 if (err > 0) {
1955 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001956 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001957 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001958 else if (err == 0)
1959 ;
1960 else
1961 break;
1962 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001963
Guido van Rossum374a9221991-04-04 10:40:29 +00001964 case JUMP_ABSOLUTE:
1965 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001966 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001967
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001968 case GET_ITER:
1969 /* before: [obj]; after [getiter(obj)] */
1970 v = POP();
1971 x = PyObject_GetIter(v);
1972 Py_DECREF(v);
1973 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001974 PUSH(x);
1975 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001976 }
1977 break;
1978
1979 case FOR_ITER:
1980 /* before: [iter]; after: [iter, iter()] *or* [] */
1981 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001982 x = PyIter_Next(v);
1983 if (x != NULL) {
1984 PUSH(x);
1985 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001986 }
Tim Petersf4848da2001-05-05 00:14:56 +00001987 if (!PyErr_Occurred()) {
1988 /* iterator ended normally */
1989 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001990 Py_DECREF(v);
1991 JUMPBY(oparg);
1992 continue;
1993 }
1994 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001995
Guido van Rossum374a9221991-04-04 10:40:29 +00001996 case SETUP_LOOP:
1997 case SETUP_EXCEPT:
1998 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002000 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002001 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002002
Guido van Rossumf10570b1995-07-07 22:53:21 +00002003 case CALL_FUNCTION:
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002004 x = call_function(&stack_pointer, oparg);
2005 PUSH(x);
2006 if (x != NULL)
2007 continue;
2008 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002009
Jeremy Hylton76901512000-03-28 23:49:17 +00002010 case CALL_FUNCTION_VAR:
2011 case CALL_FUNCTION_KW:
2012 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002013 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002014 int na = oparg & 0xff;
2015 int nk = (oparg>>8) & 0xff;
2016 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002017 int n = na + 2 * nk;
2018 PyObject **pfunc, *func;
2019 if (flags & CALL_FLAG_VAR)
2020 n++;
2021 if (flags & CALL_FLAG_KW)
2022 n++;
2023 pfunc = stack_pointer - n - 1;
2024 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002025
Guido van Rossumac7be682001-01-17 15:42:30 +00002026 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002027 && PyMethod_GET_SELF(func) != NULL) {
2028 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002029 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002030 func = PyMethod_GET_FUNCTION(func);
2031 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002032 Py_DECREF(*pfunc);
2033 *pfunc = self;
2034 na++;
2035 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002036 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002037 Py_INCREF(func);
2038 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002039 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002040
Jeremy Hylton76901512000-03-28 23:49:17 +00002041 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002042 w = POP();
2043 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002044 }
2045 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002046 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002047 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002048 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002049 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002050
Guido van Rossum681d79a1995-07-18 14:51:37 +00002051 case MAKE_FUNCTION:
2052 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002053 x = PyFunction_New(v, f->f_globals);
2054 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002055 /* XXX Maybe this should be a separate opcode? */
2056 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002057 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002058 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 x = NULL;
2061 break;
2062 }
2063 while (--oparg >= 0) {
2064 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002065 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002066 }
2067 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002068 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002069 }
2070 PUSH(x);
2071 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002072
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002073 case MAKE_CLOSURE:
2074 {
2075 int nfree;
2076 v = POP(); /* code object */
2077 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002078 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002079 Py_DECREF(v);
2080 /* XXX Maybe this should be a separate opcode? */
2081 if (x != NULL && nfree > 0) {
2082 v = PyTuple_New(nfree);
2083 if (v == NULL) {
2084 Py_DECREF(x);
2085 x = NULL;
2086 break;
2087 }
2088 while (--nfree >= 0) {
2089 w = POP();
2090 PyTuple_SET_ITEM(v, nfree, w);
2091 }
2092 err = PyFunction_SetClosure(x, v);
2093 Py_DECREF(v);
2094 }
2095 if (x != NULL && oparg > 0) {
2096 v = PyTuple_New(oparg);
2097 if (v == NULL) {
2098 Py_DECREF(x);
2099 x = NULL;
2100 break;
2101 }
2102 while (--oparg >= 0) {
2103 w = POP();
2104 PyTuple_SET_ITEM(v, oparg, w);
2105 }
2106 err = PyFunction_SetDefaults(x, v);
2107 Py_DECREF(v);
2108 }
2109 PUSH(x);
2110 break;
2111 }
2112
Guido van Rossum8861b741996-07-30 16:49:37 +00002113 case BUILD_SLICE:
2114 if (oparg == 3)
2115 w = POP();
2116 else
2117 w = NULL;
2118 v = POP();
2119 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002120 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002121 Py_DECREF(u);
2122 Py_DECREF(v);
2123 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002124 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002125 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002126 break;
2127
Fred Drakeef8ace32000-08-24 00:32:09 +00002128 case EXTENDED_ARG:
2129 opcode = NEXTOP();
2130 oparg = oparg<<16 | NEXTARG();
2131 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002132
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 default:
2134 fprintf(stderr,
2135 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002136 PyCode_Addr2Line(f->f_code, f->f_lasti),
2137 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 why = WHY_EXCEPTION;
2140 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002141
2142#ifdef CASE_TOO_BIG
2143 }
2144#endif
2145
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 } /* switch */
2147
2148 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002149
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002151
Guido van Rossum374a9221991-04-04 10:40:29 +00002152 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153 if (err == 0 && x != NULL) {
2154#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002155 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002157 fprintf(stderr,
2158 "XXX undetected error\n");
2159 else
2160#endif
2161 continue; /* Normal, fast path */
2162 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 err = 0;
2166 }
2167
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002169
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002172 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002173 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 why = WHY_EXCEPTION;
2175 }
2176 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002177#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002179 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002181 fprintf(stderr,
2182 "XXX undetected error (why=%d)\n",
2183 why);
2184 why = WHY_EXCEPTION;
2185 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 }
2187#endif
2188
2189 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002190
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002193
Fred Drake8f51f542001-10-04 14:48:42 +00002194 if (tstate->c_tracefunc != NULL)
2195 call_exc_trace(tstate->c_tracefunc,
2196 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002197 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002198
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002200
Guido van Rossum374a9221991-04-04 10:40:29 +00002201 if (why == WHY_RERAISE)
2202 why = WHY_EXCEPTION;
2203
2204 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Tim Peters5ca576e2001-06-18 22:08:13 +00002206 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002208
2209 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2210 /* For a continue inside a try block,
2211 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002212 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2213 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002214 why = WHY_NOT;
2215 JUMPTO(PyInt_AS_LONG(retval));
2216 Py_DECREF(retval);
2217 break;
2218 }
2219
Guido van Rossum374a9221991-04-04 10:40:29 +00002220 while (STACK_LEVEL() > b->b_level) {
2221 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002223 }
2224 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2225 why = WHY_NOT;
2226 JUMPTO(b->b_handler);
2227 break;
2228 }
2229 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002230 (b->b_type == SETUP_EXCEPT &&
2231 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 PyObject *exc, *val, *tb;
2234 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002235 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002236 val = Py_None;
2237 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002239 /* Make the raw exception data
2240 available to the handler,
2241 so a program can emulate the
2242 Python main loop. Don't do
2243 this for 'finally'. */
2244 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002245 PyErr_NormalizeException(
2246 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002247 set_exc_info(tstate,
2248 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002249 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002250 if (tb == NULL) {
2251 Py_INCREF(Py_None);
2252 PUSH(Py_None);
2253 } else
2254 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002255 PUSH(val);
2256 PUSH(exc);
2257 }
2258 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002259 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002260 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002261 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002262 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002263 PUSH(v);
2264 }
2265 why = WHY_NOT;
2266 JUMPTO(b->b_handler);
2267 break;
2268 }
2269 } /* unwind stack */
2270
2271 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002272
Guido van Rossum374a9221991-04-04 10:40:29 +00002273 if (why != WHY_NOT)
2274 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002275
Guido van Rossum374a9221991-04-04 10:40:29 +00002276 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002277
Guido van Rossum35974fb2001-12-06 21:28:18 +00002278 if (why != WHY_YIELD) {
2279 /* Pop remaining stack entries -- but when yielding */
2280 while (!EMPTY()) {
2281 v = POP();
2282 Py_XDECREF(v);
2283 }
2284 }
2285
Tim Peters5ca576e2001-06-18 22:08:13 +00002286 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002287 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002288
Fred Drake9e3ad782001-07-03 23:39:52 +00002289 if (tstate->use_tracing) {
2290 if (tstate->c_tracefunc
2291 && (why == WHY_RETURN || why == WHY_YIELD)) {
2292 if (call_trace(tstate->c_tracefunc,
2293 tstate->c_traceobj, f,
2294 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002296 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002297 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002298 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002299 }
Fred Drake8f51f542001-10-04 14:48:42 +00002300 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002301 if (why == WHY_EXCEPTION)
2302 call_trace_protected(tstate->c_profilefunc,
2303 tstate->c_profileobj, f,
2304 PyTrace_RETURN);
2305 else if (call_trace(tstate->c_profilefunc,
2306 tstate->c_profileobj, f,
2307 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002308 Py_XDECREF(retval);
2309 retval = NULL;
2310 why = WHY_EXCEPTION;
2311 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002312 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002313 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002314
Guido van Rossuma027efa1997-05-05 20:56:21 +00002315 reset_exc_info(tstate);
2316
Tim Peters5ca576e2001-06-18 22:08:13 +00002317 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002318 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002319 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002320
Guido van Rossum96a42c81992-01-12 02:29:51 +00002321 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002322}
2323
Tim Peters6d6c1a32001-08-02 04:15:00 +00002324PyObject *
2325PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002326 PyObject **args, int argcount, PyObject **kws, int kwcount,
2327 PyObject **defs, int defcount, PyObject *closure)
2328{
2329 register PyFrameObject *f;
2330 register PyObject *retval = NULL;
2331 register PyObject **fastlocals, **freevars;
2332 PyThreadState *tstate = PyThreadState_GET();
2333 PyObject *x, *u;
2334
2335 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002336 PyErr_SetString(PyExc_SystemError,
2337 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002338 return NULL;
2339 }
2340
2341 f = PyFrame_New(tstate, /*back*/
2342 co, /*code*/
2343 globals, locals);
2344 if (f == NULL)
2345 return NULL;
2346
2347 fastlocals = f->f_localsplus;
2348 freevars = f->f_localsplus + f->f_nlocals;
2349
2350 if (co->co_argcount > 0 ||
2351 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2352 int i;
2353 int n = argcount;
2354 PyObject *kwdict = NULL;
2355 if (co->co_flags & CO_VARKEYWORDS) {
2356 kwdict = PyDict_New();
2357 if (kwdict == NULL)
2358 goto fail;
2359 i = co->co_argcount;
2360 if (co->co_flags & CO_VARARGS)
2361 i++;
2362 SETLOCAL(i, kwdict);
2363 }
2364 if (argcount > co->co_argcount) {
2365 if (!(co->co_flags & CO_VARARGS)) {
2366 PyErr_Format(PyExc_TypeError,
2367 "%.200s() takes %s %d "
2368 "%sargument%s (%d given)",
2369 PyString_AsString(co->co_name),
2370 defcount ? "at most" : "exactly",
2371 co->co_argcount,
2372 kwcount ? "non-keyword " : "",
2373 co->co_argcount == 1 ? "" : "s",
2374 argcount);
2375 goto fail;
2376 }
2377 n = co->co_argcount;
2378 }
2379 for (i = 0; i < n; i++) {
2380 x = args[i];
2381 Py_INCREF(x);
2382 SETLOCAL(i, x);
2383 }
2384 if (co->co_flags & CO_VARARGS) {
2385 u = PyTuple_New(argcount - n);
2386 if (u == NULL)
2387 goto fail;
2388 SETLOCAL(co->co_argcount, u);
2389 for (i = n; i < argcount; i++) {
2390 x = args[i];
2391 Py_INCREF(x);
2392 PyTuple_SET_ITEM(u, i-n, x);
2393 }
2394 }
2395 for (i = 0; i < kwcount; i++) {
2396 PyObject *keyword = kws[2*i];
2397 PyObject *value = kws[2*i + 1];
2398 int j;
2399 if (keyword == NULL || !PyString_Check(keyword)) {
2400 PyErr_Format(PyExc_TypeError,
2401 "%.200s() keywords must be strings",
2402 PyString_AsString(co->co_name));
2403 goto fail;
2404 }
2405 /* XXX slow -- speed up using dictionary? */
2406 for (j = 0; j < co->co_argcount; j++) {
2407 PyObject *nm = PyTuple_GET_ITEM(
2408 co->co_varnames, j);
2409 int cmp = PyObject_RichCompareBool(
2410 keyword, nm, Py_EQ);
2411 if (cmp > 0)
2412 break;
2413 else if (cmp < 0)
2414 goto fail;
2415 }
2416 /* Check errors from Compare */
2417 if (PyErr_Occurred())
2418 goto fail;
2419 if (j >= co->co_argcount) {
2420 if (kwdict == NULL) {
2421 PyErr_Format(PyExc_TypeError,
2422 "%.200s() got an unexpected "
2423 "keyword argument '%.400s'",
2424 PyString_AsString(co->co_name),
2425 PyString_AsString(keyword));
2426 goto fail;
2427 }
2428 PyDict_SetItem(kwdict, keyword, value);
2429 }
2430 else {
2431 if (GETLOCAL(j) != NULL) {
2432 PyErr_Format(PyExc_TypeError,
2433 "%.200s() got multiple "
2434 "values for keyword "
2435 "argument '%.400s'",
2436 PyString_AsString(co->co_name),
2437 PyString_AsString(keyword));
2438 goto fail;
2439 }
2440 Py_INCREF(value);
2441 SETLOCAL(j, value);
2442 }
2443 }
2444 if (argcount < co->co_argcount) {
2445 int m = co->co_argcount - defcount;
2446 for (i = argcount; i < m; i++) {
2447 if (GETLOCAL(i) == NULL) {
2448 PyErr_Format(PyExc_TypeError,
2449 "%.200s() takes %s %d "
2450 "%sargument%s (%d given)",
2451 PyString_AsString(co->co_name),
2452 ((co->co_flags & CO_VARARGS) ||
2453 defcount) ? "at least"
2454 : "exactly",
2455 m, kwcount ? "non-keyword " : "",
2456 m == 1 ? "" : "s", i);
2457 goto fail;
2458 }
2459 }
2460 if (n > m)
2461 i = n - m;
2462 else
2463 i = 0;
2464 for (; i < defcount; i++) {
2465 if (GETLOCAL(m+i) == NULL) {
2466 PyObject *def = defs[i];
2467 Py_INCREF(def);
2468 SETLOCAL(m+i, def);
2469 }
2470 }
2471 }
2472 }
2473 else {
2474 if (argcount > 0 || kwcount > 0) {
2475 PyErr_Format(PyExc_TypeError,
2476 "%.200s() takes no arguments (%d given)",
2477 PyString_AsString(co->co_name),
2478 argcount + kwcount);
2479 goto fail;
2480 }
2481 }
2482 /* Allocate and initialize storage for cell vars, and copy free
2483 vars into frame. This isn't too efficient right now. */
2484 if (f->f_ncells) {
2485 int i = 0, j = 0, nargs, found;
2486 char *cellname, *argname;
2487 PyObject *c;
2488
2489 nargs = co->co_argcount;
2490 if (co->co_flags & CO_VARARGS)
2491 nargs++;
2492 if (co->co_flags & CO_VARKEYWORDS)
2493 nargs++;
2494
2495 /* Check for cells that shadow args */
2496 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2497 cellname = PyString_AS_STRING(
2498 PyTuple_GET_ITEM(co->co_cellvars, i));
2499 found = 0;
2500 while (j < nargs) {
2501 argname = PyString_AS_STRING(
2502 PyTuple_GET_ITEM(co->co_varnames, j));
2503 if (strcmp(cellname, argname) == 0) {
2504 c = PyCell_New(GETLOCAL(j));
2505 if (c == NULL)
2506 goto fail;
2507 GETLOCAL(f->f_nlocals + i) = c;
2508 found = 1;
2509 break;
2510 }
2511 j++;
2512 }
2513 if (found == 0) {
2514 c = PyCell_New(NULL);
2515 if (c == NULL)
2516 goto fail;
2517 SETLOCAL(f->f_nlocals + i, c);
2518 }
2519 }
2520 /* Initialize any that are left */
2521 while (i < f->f_ncells) {
2522 c = PyCell_New(NULL);
2523 if (c == NULL)
2524 goto fail;
2525 SETLOCAL(f->f_nlocals + i, c);
2526 i++;
2527 }
2528 }
2529 if (f->f_nfreevars) {
2530 int i;
2531 for (i = 0; i < f->f_nfreevars; ++i) {
2532 PyObject *o = PyTuple_GET_ITEM(closure, i);
2533 Py_INCREF(o);
2534 freevars[f->f_ncells + i] = o;
2535 }
2536 }
2537
Tim Peters5ca576e2001-06-18 22:08:13 +00002538 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002539 /* Don't need to keep the reference to f_back, it will be set
2540 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002541 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002542 f->f_back = NULL;
2543
2544 /* Create a new generator that owns the ready to run frame
2545 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002546 return gen_new(f);
2547 }
2548
2549 retval = eval_frame(f);
2550
2551 fail: /* Jump here from prelude on failure */
2552
Tim Petersb13680b2001-11-27 23:29:29 +00002553 /* decref'ing the frame can cause __del__ methods to get invoked,
2554 which can call back into Python. While we're done with the
2555 current Python frame (f), the associated C stack is still in use,
2556 so recursion_depth must be boosted for the duration.
2557 */
2558 assert(tstate != NULL);
2559 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002560 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002561 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002562 return retval;
2563}
2564
2565
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002567set_exc_info(PyThreadState *tstate,
2568 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002569{
2570 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002571 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002572
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573 frame = tstate->frame;
2574 if (frame->f_exc_type == NULL) {
2575 /* This frame didn't catch an exception before */
2576 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 if (tstate->exc_type == NULL) {
2578 Py_INCREF(Py_None);
2579 tstate->exc_type = Py_None;
2580 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002581 tmp_type = frame->f_exc_type;
2582 tmp_value = frame->f_exc_value;
2583 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584 Py_XINCREF(tstate->exc_type);
2585 Py_XINCREF(tstate->exc_value);
2586 Py_XINCREF(tstate->exc_traceback);
2587 frame->f_exc_type = tstate->exc_type;
2588 frame->f_exc_value = tstate->exc_value;
2589 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002590 Py_XDECREF(tmp_type);
2591 Py_XDECREF(tmp_value);
2592 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002593 }
2594 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002595 tmp_type = tstate->exc_type;
2596 tmp_value = tstate->exc_value;
2597 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002598 Py_XINCREF(type);
2599 Py_XINCREF(value);
2600 Py_XINCREF(tb);
2601 tstate->exc_type = type;
2602 tstate->exc_value = value;
2603 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002604 Py_XDECREF(tmp_type);
2605 Py_XDECREF(tmp_value);
2606 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607 /* For b/w compatibility */
2608 PySys_SetObject("exc_type", type);
2609 PySys_SetObject("exc_value", value);
2610 PySys_SetObject("exc_traceback", tb);
2611}
2612
2613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002614reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002615{
2616 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002617 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002618 frame = tstate->frame;
2619 if (frame->f_exc_type != NULL) {
2620 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002621 tmp_type = tstate->exc_type;
2622 tmp_value = tstate->exc_value;
2623 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002624 Py_XINCREF(frame->f_exc_type);
2625 Py_XINCREF(frame->f_exc_value);
2626 Py_XINCREF(frame->f_exc_traceback);
2627 tstate->exc_type = frame->f_exc_type;
2628 tstate->exc_value = frame->f_exc_value;
2629 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002630 Py_XDECREF(tmp_type);
2631 Py_XDECREF(tmp_value);
2632 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002633 /* For b/w compatibility */
2634 PySys_SetObject("exc_type", frame->f_exc_type);
2635 PySys_SetObject("exc_value", frame->f_exc_value);
2636 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2637 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002638 tmp_type = frame->f_exc_type;
2639 tmp_value = frame->f_exc_value;
2640 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002641 frame->f_exc_type = NULL;
2642 frame->f_exc_value = NULL;
2643 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002644 Py_XDECREF(tmp_type);
2645 Py_XDECREF(tmp_value);
2646 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002647}
2648
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002649/* Logic for the raise statement (too complicated for inlining).
2650 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002651static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002652do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002653{
Guido van Rossumd295f121998-04-09 21:39:57 +00002654 if (type == NULL) {
2655 /* Reraise */
2656 PyThreadState *tstate = PyThreadState_Get();
2657 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2658 value = tstate->exc_value;
2659 tb = tstate->exc_traceback;
2660 Py_XINCREF(type);
2661 Py_XINCREF(value);
2662 Py_XINCREF(tb);
2663 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002664
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002665 /* We support the following forms of raise:
2666 raise <class>, <classinstance>
2667 raise <class>, <argument tuple>
2668 raise <class>, None
2669 raise <class>, <argument>
2670 raise <classinstance>, None
2671 raise <string>, <object>
2672 raise <string>, None
2673
2674 An omitted second argument is the same as None.
2675
2676 In addition, raise <tuple>, <anything> is the same as
2677 raising the tuple's first item (and it better have one!);
2678 this rule is applied recursively.
2679
2680 Finally, an optional third argument can be supplied, which
2681 gives the traceback to be substituted (useful when
2682 re-raising an exception after examining it). */
2683
2684 /* First, check the traceback argument, replacing None with
2685 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 if (tb == Py_None) {
2687 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002688 tb = NULL;
2689 }
2690 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002692 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 goto raise_error;
2694 }
2695
2696 /* Next, replace a missing value with None */
2697 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002698 value = Py_None;
2699 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002700 }
2701
2702 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2704 PyObject *tmp = type;
2705 type = PyTuple_GET_ITEM(type, 0);
2706 Py_INCREF(type);
2707 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002708 }
2709
Tim Petersafb2c802002-04-18 18:06:20 +00002710 if (PyString_CheckExact(type))
2711 /* Raising builtin string is deprecated but still allowed --
2712 * do nothing. Raising an instance of a new-style str
2713 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002714 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002715
2716 else if (PyClass_Check(type))
2717 PyErr_NormalizeException(&type, &value, &tb);
2718
Guido van Rossumb209a111997-04-29 18:18:01 +00002719 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002720 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002721 if (value != Py_None) {
2722 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002723 "instance exception may not have a separate value");
2724 goto raise_error;
2725 }
2726 else {
2727 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002729 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002730 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2731 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002732 }
2733 }
2734 else {
2735 /* Not something you can raise. You get an exception
2736 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002737 PyErr_Format(PyExc_TypeError,
2738 "exceptions must be strings, classes, or "
2739 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002740 goto raise_error;
2741 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002743 if (tb == NULL)
2744 return WHY_EXCEPTION;
2745 else
2746 return WHY_RERAISE;
2747 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 Py_XDECREF(value);
2749 Py_XDECREF(type);
2750 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002751 return WHY_EXCEPTION;
2752}
2753
Tim Petersd6d010b2001-06-21 02:49:55 +00002754/* Iterate v argcnt times and store the results on the stack (via decreasing
2755 sp). Return 1 for success, 0 if error. */
2756
Barry Warsawe42b18f1997-08-25 22:13:04 +00002757static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002758unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002759{
Tim Petersd6d010b2001-06-21 02:49:55 +00002760 int i = 0;
2761 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002762 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002763
Tim Petersd6d010b2001-06-21 02:49:55 +00002764 assert(v != NULL);
2765
2766 it = PyObject_GetIter(v);
2767 if (it == NULL)
2768 goto Error;
2769
2770 for (; i < argcnt; i++) {
2771 w = PyIter_Next(it);
2772 if (w == NULL) {
2773 /* Iterator done, via error or exhaustion. */
2774 if (!PyErr_Occurred()) {
2775 PyErr_Format(PyExc_ValueError,
2776 "need more than %d value%s to unpack",
2777 i, i == 1 ? "" : "s");
2778 }
2779 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002780 }
2781 *--sp = w;
2782 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002783
2784 /* We better have exhausted the iterator now. */
2785 w = PyIter_Next(it);
2786 if (w == NULL) {
2787 if (PyErr_Occurred())
2788 goto Error;
2789 Py_DECREF(it);
2790 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002791 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002792 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002793 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002794 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002795Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002796 for (; i > 0; i--, sp++)
2797 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002798 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002799 return 0;
2800}
2801
2802
Guido van Rossum96a42c81992-01-12 02:29:51 +00002803#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002804static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002805prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002807 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 if (PyObject_Print(v, stdout, 0) != 0)
2809 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002810 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002811 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002813#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002815static void
Fred Drake5755ce62001-06-27 19:19:46 +00002816call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002817{
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002819 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002821 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 value = Py_None;
2823 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002824 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002826 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002828 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002829 }
Fred Drake5755ce62001-06-27 19:19:46 +00002830 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002832 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002834 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002835 Py_XDECREF(type);
2836 Py_XDECREF(value);
2837 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002838 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002839}
2840
Fred Drake4ec5d562001-10-04 19:26:43 +00002841static void
2842call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2843 int what)
2844{
2845 PyObject *type, *value, *traceback;
2846 int err;
2847 PyErr_Fetch(&type, &value, &traceback);
2848 err = call_trace(func, obj, frame, what, NULL);
2849 if (err == 0)
2850 PyErr_Restore(type, value, traceback);
2851 else {
2852 Py_XDECREF(type);
2853 Py_XDECREF(value);
2854 Py_XDECREF(traceback);
2855 }
2856}
2857
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002858static int
Fred Drake5755ce62001-06-27 19:19:46 +00002859call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2860 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002861{
Fred Drake5755ce62001-06-27 19:19:46 +00002862 register PyThreadState *tstate = frame->f_tstate;
2863 int result;
2864 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002865 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002866 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002867 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002868 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002869 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2870 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002871 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002872 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002873}
2874
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002875static void
Michael W. Hudson019a78e2002-11-08 12:53:11 +00002876maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002877 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2878{
2879 /* The theory of SET_LINENO-less tracing.
2880
2881 In a nutshell, we use the co_lnotab field of the code object
2882 to tell when execution has moved onto a different line.
2883
2884 As mentioned above, the basic idea is so set things up so
2885 that
2886
2887 *instr_lb <= frame->f_lasti < *instr_ub
2888
2889 is true so long as execution does not change lines.
2890
2891 This is all fairly simple. Digging the information out of
2892 co_lnotab takes some work, but is conceptually clear.
2893
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002894 Somewhat harder to explain is why we don't *always* call the
2895 line trace function when the above test fails.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002896
2897 Consider this code:
2898
2899 1: def f(a):
2900 2: if a:
2901 3: print 1
2902 4: else:
2903 5: print 2
2904
2905 which compiles to this:
2906
2907 2 0 LOAD_FAST 0 (a)
2908 3 JUMP_IF_FALSE 9 (to 15)
2909 6 POP_TOP
2910
2911 3 7 LOAD_CONST 1 (1)
2912 10 PRINT_ITEM
2913 11 PRINT_NEWLINE
2914 12 JUMP_FORWARD 6 (to 21)
2915 >> 15 POP_TOP
2916
2917 5 16 LOAD_CONST 2 (2)
2918 19 PRINT_ITEM
2919 20 PRINT_NEWLINE
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002920 >> 21 LOAD_CONST 0 (None)
2921 24 RETURN_VALUE
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002922
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002923 If 'a' is false, execution will jump to instruction at offset
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002924 15 and the co_lnotab will claim that execution has moved to
2925 line 3. This is at best misleading. In this case we could
2926 associate the POP_TOP with line 4, but that doesn't make
2927 sense in all cases (I think).
2928
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002929 What we do is only call the line trace function if the co_lnotab
2930 indicates we have jumped to the *start* of a line, i.e. if the
2931 current instruction offset matches the offset given for the
2932 start of a line by the co_lnotab.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002933
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002934 This also takes care of the situation where 'a' is true.
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002935 Execution will jump from instruction offset 12 to offset 21.
2936 Then the co_lnotab would imply that execution has moved to line
2937 5, which is again misleading.
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002938
2939 Why do we set f_lineno when tracing? Well, consider the code
2940 above when 'a' is true. If stepping through this with 'n' in
2941 pdb, you would stop at line 1 with a "call" type event, then
2942 line events on lines 2 and 3, then a "return" type event -- but
2943 you would be shown line 5 during this event. This is a change
2944 from the behaviour in 2.2 and before, and I've found it
2945 confusing in practice. By setting and using f_lineno when
2946 tracing, one can report a line number different from that
2947 suggested by f_lasti on this one occasion where it's desirable.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002948 */
2949
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002950 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002951 PyCodeObject* co = frame->f_code;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002952 int size, addr, line;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002953 unsigned char* p;
2954
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002955 size = PyString_GET_SIZE(co->co_lnotab) / 2;
2956 p = (unsigned char*)PyString_AS_STRING(co->co_lnotab);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002957
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002958 addr = 0;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002959 line = co->co_firstlineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002960
2961 /* possible optimization: if f->f_lasti == instr_ub
2962 (likely to be a common case) then we already know
2963 instr_lb -- if we stored the matching value of p
2964 somwhere we could skip the first while loop. */
2965
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002966 /* see comments in compile.c for the description of
2967 co_lnotab. A point to remember: increments to p
2968 should come in pairs -- although we don't care about
2969 the line increments here, treating them as byte
2970 increments gets confusing, to say the least. */
2971
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002972 while (size > 0) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002973 if (addr + *p > frame->f_lasti)
2974 break;
2975 addr += *p++;
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002976 if (*p) *instr_lb = addr;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002977 line += *p++;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002978 --size;
2979 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002980
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002981 if (addr == frame->f_lasti) {
2982 frame->f_lineno = line;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002983 call_trace(func, obj, frame,
2984 PyTrace_LINE, Py_None);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002985 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002986
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002987 if (size > 0) {
2988 while (--size >= 0) {
2989 addr += *p++;
2990 if (*p++)
2991 break;
2992 }
2993 *instr_ub = addr;
2994 }
2995 else {
2996 *instr_ub = INT_MAX;
2997 }
2998 }
2999}
3000
Fred Drake5755ce62001-06-27 19:19:46 +00003001void
3002PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003003{
Fred Drake5755ce62001-06-27 19:19:46 +00003004 PyThreadState *tstate = PyThreadState_Get();
3005 PyObject *temp = tstate->c_profileobj;
3006 Py_XINCREF(arg);
3007 tstate->c_profilefunc = NULL;
3008 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003009 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003010 Py_XDECREF(temp);
3011 tstate->c_profilefunc = func;
3012 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003013 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003014}
3015
3016void
3017PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3018{
3019 PyThreadState *tstate = PyThreadState_Get();
3020 PyObject *temp = tstate->c_traceobj;
3021 Py_XINCREF(arg);
3022 tstate->c_tracefunc = NULL;
3023 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003024 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003025 Py_XDECREF(temp);
3026 tstate->c_tracefunc = func;
3027 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003028 tstate->use_tracing = ((func != NULL)
3029 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003030}
3031
Guido van Rossumb209a111997-04-29 18:18:01 +00003032PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003033PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003034{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003035 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003036 if (current_frame == NULL)
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003037 return PyThreadState_Get()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003038 else
3039 return current_frame->f_builtins;
3040}
3041
Guido van Rossumb209a111997-04-29 18:18:01 +00003042PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003044{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003045 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003046 if (current_frame == NULL)
3047 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003048 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003049 return current_frame->f_locals;
3050}
3051
Guido van Rossumb209a111997-04-29 18:18:01 +00003052PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003053PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003054{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003055 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003056 if (current_frame == NULL)
3057 return NULL;
3058 else
3059 return current_frame->f_globals;
3060}
3061
Guido van Rossumb209a111997-04-29 18:18:01 +00003062PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003063PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003064{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003065 PyThreadState *tstate = PyThreadState_Get();
3066 return _PyThreadState_GetFrame((PyObject *)tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003067}
3068
Guido van Rossum6135a871995-01-09 17:53:26 +00003069int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003070PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003071{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003072 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003073 return current_frame == NULL ? 0 : current_frame->f_restricted;
3074}
3075
Guido van Rossumbe270261997-05-22 22:26:18 +00003076int
Tim Peters5ba58662001-07-16 02:29:45 +00003077PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003078{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003079 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Tim Peters5ba58662001-07-16 02:29:45 +00003080 int result = 0;
3081
3082 if (current_frame != NULL) {
3083 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003084 const int compilerflags = codeflags & PyCF_MASK;
3085 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003086 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003087 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003088 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003089#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003090 if (codeflags & CO_GENERATOR_ALLOWED) {
3091 result = 1;
3092 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3093 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003094#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003095 }
3096 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003097}
3098
3099int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003100Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101{
Guido van Rossumb209a111997-04-29 18:18:01 +00003102 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003103 if (f == NULL)
3104 return 0;
3105 if (!PyFile_SoftSpace(f, 0))
3106 return 0;
3107 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108}
3109
Guido van Rossum3f5da241990-12-20 15:06:42 +00003110
Guido van Rossum681d79a1995-07-18 14:51:37 +00003111/* External interface to call any callable object.
3112 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003113
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003114#undef PyEval_CallObject
3115/* for backward compatibility: export this interface */
3116
Guido van Rossumb209a111997-04-29 18:18:01 +00003117PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003118PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003119{
Guido van Rossumb209a111997-04-29 18:18:01 +00003120 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003121}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003122#define PyEval_CallObject(func,arg) \
3123 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003124
Guido van Rossumb209a111997-04-29 18:18:01 +00003125PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003126PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003127{
Jeremy Hylton52820442001-01-03 23:52:36 +00003128 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003129
3130 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003131 arg = PyTuple_New(0);
3132 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003133 PyErr_SetString(PyExc_TypeError,
3134 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003135 return NULL;
3136 }
3137 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003138 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003139
Guido van Rossumb209a111997-04-29 18:18:01 +00003140 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003141 PyErr_SetString(PyExc_TypeError,
3142 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003143 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003144 return NULL;
3145 }
3146
Tim Peters6d6c1a32001-08-02 04:15:00 +00003147 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003148 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003149 return result;
3150}
3151
Tim Peters6d6c1a32001-08-02 04:15:00 +00003152char *
3153PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003154{
3155 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003156 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003157 else if (PyFunction_Check(func))
3158 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3159 else if (PyCFunction_Check(func))
3160 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3161 else if (PyClass_Check(func))
3162 return PyString_AsString(((PyClassObject*)func)->cl_name);
3163 else if (PyInstance_Check(func)) {
3164 return PyString_AsString(
3165 ((PyInstanceObject*)func)->in_class->cl_name);
3166 } else {
3167 return func->ob_type->tp_name;
3168 }
3169}
3170
Tim Peters6d6c1a32001-08-02 04:15:00 +00003171char *
3172PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003173{
3174 if (PyMethod_Check(func))
3175 return "()";
3176 else if (PyFunction_Check(func))
3177 return "()";
3178 else if (PyCFunction_Check(func))
3179 return "()";
3180 else if (PyClass_Check(func))
3181 return " constructor";
3182 else if (PyInstance_Check(func)) {
3183 return " instance";
3184 } else {
3185 return " object";
3186 }
3187}
3188
Jeremy Hylton52820442001-01-03 23:52:36 +00003189#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3190
Jeremy Hylton192690e2002-08-16 18:36:11 +00003191void
3192err_args(PyObject *func, int flags, int nargs)
3193{
3194 if (flags & METH_NOARGS)
3195 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003196 "%.200s() takes no arguments (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003197 ((PyCFunctionObject *)func)->m_ml->ml_name,
3198 nargs);
3199 else
3200 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003201 "%.200s() takes exactly one argument (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003202 ((PyCFunctionObject *)func)->m_ml->ml_name,
3203 nargs);
3204}
3205
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003206static PyObject *
3207call_function(PyObject ***pp_stack, int oparg)
3208{
3209 int na = oparg & 0xff;
3210 int nk = (oparg>>8) & 0xff;
3211 int n = na + 2 * nk;
3212 PyObject **pfunc = (*pp_stack) - n - 1;
3213 PyObject *func = *pfunc;
3214 PyObject *x, *w;
3215
3216 /* Always dispatch PyCFunction first, because
3217 these are presumed to be the most frequent
3218 callable object.
3219 */
3220 if (PyCFunction_Check(func) && nk == 0) {
3221 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003222 if (flags & (METH_NOARGS | METH_O)) {
3223 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3224 PyObject *self = PyCFunction_GET_SELF(func);
3225 if (flags & METH_NOARGS && na == 0)
3226 x = (*meth)(self, NULL);
3227 else if (flags & METH_O && na == 1) {
3228 PyObject *arg = EXT_POP(*pp_stack);
3229 x = (*meth)(self, arg);
3230 Py_DECREF(arg);
3231 }
3232 else {
3233 err_args(func, flags, na);
3234 x = NULL;
3235 }
3236 }
3237 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003238 PyObject *callargs;
3239 callargs = load_args(pp_stack, na);
3240 x = PyCFunction_Call(func, callargs, NULL);
3241 Py_XDECREF(callargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003242 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003243 } else {
3244 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3245 /* optimize access to bound methods */
3246 PyObject *self = PyMethod_GET_SELF(func);
3247 Py_INCREF(self);
3248 func = PyMethod_GET_FUNCTION(func);
3249 Py_INCREF(func);
3250 Py_DECREF(*pfunc);
3251 *pfunc = self;
3252 na++;
3253 n++;
3254 } else
3255 Py_INCREF(func);
3256 if (PyFunction_Check(func))
3257 x = fast_function(func, pp_stack, n, na, nk);
3258 else
3259 x = do_call(func, pp_stack, na, nk);
3260 Py_DECREF(func);
3261 }
3262
3263 while ((*pp_stack) > pfunc) {
3264 w = EXT_POP(*pp_stack);
3265 Py_DECREF(w);
3266 }
3267 return x;
3268}
3269
Jeremy Hylton192690e2002-08-16 18:36:11 +00003270/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003271 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton52820442001-01-03 23:52:36 +00003272*/
3273
3274static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003275fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003276{
3277 PyObject *co = PyFunction_GET_CODE(func);
3278 PyObject *globals = PyFunction_GET_GLOBALS(func);
3279 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003280 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003281 PyObject **d = NULL;
3282 int nd = 0;
3283
3284 if (argdefs != NULL) {
3285 d = &PyTuple_GET_ITEM(argdefs, 0);
3286 nd = ((PyTupleObject *)argdefs)->ob_size;
3287 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003288 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003289 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003290 (*pp_stack)-2*nk, nk, d, nd,
3291 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003292}
3293
3294static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003295update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3296 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003297{
3298 PyObject *kwdict = NULL;
3299 if (orig_kwdict == NULL)
3300 kwdict = PyDict_New();
3301 else {
3302 kwdict = PyDict_Copy(orig_kwdict);
3303 Py_DECREF(orig_kwdict);
3304 }
3305 if (kwdict == NULL)
3306 return NULL;
3307 while (--nk >= 0) {
3308 int err;
3309 PyObject *value = EXT_POP(*pp_stack);
3310 PyObject *key = EXT_POP(*pp_stack);
3311 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003312 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003313 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003314 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003315 PyEval_GetFuncName(func),
3316 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003317 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003318 Py_DECREF(key);
3319 Py_DECREF(value);
3320 Py_DECREF(kwdict);
3321 return NULL;
3322 }
3323 err = PyDict_SetItem(kwdict, key, value);
3324 Py_DECREF(key);
3325 Py_DECREF(value);
3326 if (err) {
3327 Py_DECREF(kwdict);
3328 return NULL;
3329 }
3330 }
3331 return kwdict;
3332}
3333
3334static PyObject *
3335update_star_args(int nstack, int nstar, PyObject *stararg,
3336 PyObject ***pp_stack)
3337{
3338 PyObject *callargs, *w;
3339
3340 callargs = PyTuple_New(nstack + nstar);
3341 if (callargs == NULL) {
3342 return NULL;
3343 }
3344 if (nstar) {
3345 int i;
3346 for (i = 0; i < nstar; i++) {
3347 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3348 Py_INCREF(a);
3349 PyTuple_SET_ITEM(callargs, nstack + i, a);
3350 }
3351 }
3352 while (--nstack >= 0) {
3353 w = EXT_POP(*pp_stack);
3354 PyTuple_SET_ITEM(callargs, nstack, w);
3355 }
3356 return callargs;
3357}
3358
3359static PyObject *
3360load_args(PyObject ***pp_stack, int na)
3361{
3362 PyObject *args = PyTuple_New(na);
3363 PyObject *w;
3364
3365 if (args == NULL)
3366 return NULL;
3367 while (--na >= 0) {
3368 w = EXT_POP(*pp_stack);
3369 PyTuple_SET_ITEM(args, na, w);
3370 }
3371 return args;
3372}
3373
3374static PyObject *
3375do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3376{
3377 PyObject *callargs = NULL;
3378 PyObject *kwdict = NULL;
3379 PyObject *result = NULL;
3380
3381 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003382 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003383 if (kwdict == NULL)
3384 goto call_fail;
3385 }
3386 callargs = load_args(pp_stack, na);
3387 if (callargs == NULL)
3388 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003389 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003390 call_fail:
3391 Py_XDECREF(callargs);
3392 Py_XDECREF(kwdict);
3393 return result;
3394}
3395
3396static PyObject *
3397ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3398{
3399 int nstar = 0;
3400 PyObject *callargs = NULL;
3401 PyObject *stararg = NULL;
3402 PyObject *kwdict = NULL;
3403 PyObject *result = NULL;
3404
3405 if (flags & CALL_FLAG_KW) {
3406 kwdict = EXT_POP(*pp_stack);
3407 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003408 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003409 "%s%s argument after ** "
3410 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003411 PyEval_GetFuncName(func),
3412 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003413 goto ext_call_fail;
3414 }
3415 }
3416 if (flags & CALL_FLAG_VAR) {
3417 stararg = EXT_POP(*pp_stack);
3418 if (!PyTuple_Check(stararg)) {
3419 PyObject *t = NULL;
3420 t = PySequence_Tuple(stararg);
3421 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003422 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3423 PyErr_Format(PyExc_TypeError,
3424 "%s%s argument after * "
3425 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003426 PyEval_GetFuncName(func),
3427 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003428 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003429 goto ext_call_fail;
3430 }
3431 Py_DECREF(stararg);
3432 stararg = t;
3433 }
3434 nstar = PyTuple_GET_SIZE(stararg);
3435 }
3436 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003437 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003438 if (kwdict == NULL)
3439 goto ext_call_fail;
3440 }
3441 callargs = update_star_args(na, nstar, stararg, pp_stack);
3442 if (callargs == NULL)
3443 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003444 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003445 ext_call_fail:
3446 Py_XDECREF(callargs);
3447 Py_XDECREF(kwdict);
3448 Py_XDECREF(stararg);
3449 return result;
3450}
3451
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003452#define SLICE_ERROR_MSG \
3453 "standard sequence type does not support step size other than one"
3454
Tim Peterscb479e72001-12-16 19:11:44 +00003455/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3456 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3457 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3458*/
Tim Petersb5196382001-12-16 19:44:20 +00003459/* Note: If v is NULL, return success without storing into *pi. This
3460 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3461 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003462*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003463int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003464_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465{
Tim Petersb5196382001-12-16 19:44:20 +00003466 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003467 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003468 if (PyInt_Check(v)) {
3469 x = PyInt_AsLong(v);
3470 } else if (PyLong_Check(v)) {
3471 x = PyLong_AsLong(v);
3472 if (x==-1 && PyErr_Occurred()) {
3473 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003474 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003475
Guido van Rossumac7be682001-01-17 15:42:30 +00003476 if (!PyErr_ExceptionMatches(
3477 PyExc_OverflowError)) {
3478 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003479 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003480 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003481 }
3482
Guido van Rossumac7be682001-01-17 15:42:30 +00003483 /* Clear the OverflowError */
3484 PyErr_Clear();
3485
3486 /* It's an overflow error, so we need to
3487 check the sign of the long integer,
3488 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003489 the error. */
3490
3491 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003492 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003493 if (long_zero == NULL)
3494 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003495
3496 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003497 cmp = PyObject_RichCompareBool(v, long_zero,
3498 Py_GT);
3499 Py_DECREF(long_zero);
3500 if (cmp < 0)
3501 return 0;
3502 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003503 x = INT_MAX;
3504 else
3505 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003506 }
3507 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003508 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003509 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003510 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003512 /* Truncate -- very long indices are truncated anyway */
3513 if (x > INT_MAX)
3514 x = INT_MAX;
3515 else if (x < -INT_MAX)
Michael W. Hudsoncbd6fb92002-11-06 15:17:32 +00003516 x = -INT_MAX;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003517 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003519 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520}
3521
Guido van Rossum50d756e2001-08-18 17:43:36 +00003522#undef ISINT
3523#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3524
Guido van Rossumb209a111997-04-29 18:18:01 +00003525static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003526apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003528 PyTypeObject *tp = u->ob_type;
3529 PySequenceMethods *sq = tp->tp_as_sequence;
3530
3531 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3532 int ilow = 0, ihigh = INT_MAX;
3533 if (!_PyEval_SliceIndex(v, &ilow))
3534 return NULL;
3535 if (!_PyEval_SliceIndex(w, &ihigh))
3536 return NULL;
3537 return PySequence_GetSlice(u, ilow, ihigh);
3538 }
3539 else {
3540 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003541 if (slice != NULL) {
3542 PyObject *res = PyObject_GetItem(u, slice);
3543 Py_DECREF(slice);
3544 return res;
3545 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003546 else
3547 return NULL;
3548 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003549}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003550
3551static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003552assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3553 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003554{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003555 PyTypeObject *tp = u->ob_type;
3556 PySequenceMethods *sq = tp->tp_as_sequence;
3557
3558 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3559 int ilow = 0, ihigh = INT_MAX;
3560 if (!_PyEval_SliceIndex(v, &ilow))
3561 return -1;
3562 if (!_PyEval_SliceIndex(w, &ihigh))
3563 return -1;
3564 if (x == NULL)
3565 return PySequence_DelSlice(u, ilow, ihigh);
3566 else
3567 return PySequence_SetSlice(u, ilow, ihigh, x);
3568 }
3569 else {
3570 PyObject *slice = PySlice_New(v, w, NULL);
3571 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003572 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003573 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003574 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003575 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003576 res = PyObject_DelItem(u, slice);
3577 Py_DECREF(slice);
3578 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003579 }
3580 else
3581 return -1;
3582 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583}
3584
Guido van Rossumb209a111997-04-29 18:18:01 +00003585static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003586cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587{
Guido van Rossumac7be682001-01-17 15:42:30 +00003588 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003589 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003590 case PyCmp_IS:
3591 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003592 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003593 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003594 res = !res;
3595 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003596 case PyCmp_IN:
3597 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003598 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003599 if (res < 0)
3600 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003601 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003602 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003604 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003605 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606 break;
3607 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003608 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003609 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003610 v = res ? Py_True : Py_False;
3611 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003612 return v;
3613}
3614
Thomas Wouters52152252000-08-17 22:55:00 +00003615static PyObject *
3616import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003617{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003618 PyObject *x;
3619
3620 x = PyObject_GetAttr(v, name);
3621 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003622 PyErr_Format(PyExc_ImportError,
3623 "cannot import name %.230s",
3624 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003625 }
Thomas Wouters52152252000-08-17 22:55:00 +00003626 return x;
3627}
Guido van Rossumac7be682001-01-17 15:42:30 +00003628
Thomas Wouters52152252000-08-17 22:55:00 +00003629static int
3630import_all_from(PyObject *locals, PyObject *v)
3631{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003632 PyObject *all = PyObject_GetAttrString(v, "__all__");
3633 PyObject *dict, *name, *value;
3634 int skip_leading_underscores = 0;
3635 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003636
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003637 if (all == NULL) {
3638 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3639 return -1; /* Unexpected error */
3640 PyErr_Clear();
3641 dict = PyObject_GetAttrString(v, "__dict__");
3642 if (dict == NULL) {
3643 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3644 return -1;
3645 PyErr_SetString(PyExc_ImportError,
3646 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003647 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003648 }
3649 all = PyMapping_Keys(dict);
3650 Py_DECREF(dict);
3651 if (all == NULL)
3652 return -1;
3653 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003654 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003655
3656 for (pos = 0, err = 0; ; pos++) {
3657 name = PySequence_GetItem(all, pos);
3658 if (name == NULL) {
3659 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3660 err = -1;
3661 else
3662 PyErr_Clear();
3663 break;
3664 }
3665 if (skip_leading_underscores &&
3666 PyString_Check(name) &&
3667 PyString_AS_STRING(name)[0] == '_')
3668 {
3669 Py_DECREF(name);
3670 continue;
3671 }
3672 value = PyObject_GetAttr(v, name);
3673 if (value == NULL)
3674 err = -1;
3675 else
3676 err = PyDict_SetItem(locals, name, value);
3677 Py_DECREF(name);
3678 Py_XDECREF(value);
3679 if (err != 0)
3680 break;
3681 }
3682 Py_DECREF(all);
3683 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003684}
3685
Guido van Rossumb209a111997-04-29 18:18:01 +00003686static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003687build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003688{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003689 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003690
3691 if (PyDict_Check(methods))
3692 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003693 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003694 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003695 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3696 base = PyTuple_GET_ITEM(bases, 0);
3697 metaclass = PyObject_GetAttrString(base, "__class__");
3698 if (metaclass == NULL) {
3699 PyErr_Clear();
3700 metaclass = (PyObject *)base->ob_type;
3701 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003702 }
3703 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003704 else {
3705 PyObject *g = PyEval_GetGlobals();
3706 if (g != NULL && PyDict_Check(g))
3707 metaclass = PyDict_GetItemString(g, "__metaclass__");
3708 if (metaclass == NULL)
3709 metaclass = (PyObject *) &PyClass_Type;
3710 Py_INCREF(metaclass);
3711 }
3712 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3713 Py_DECREF(metaclass);
3714 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003715}
3716
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003717static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003718exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3719 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003720{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003721 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003722 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003723 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003724
Guido van Rossumb209a111997-04-29 18:18:01 +00003725 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3726 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003727 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003728 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003729 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003730 locals = PyTuple_GetItem(prog, 2);
3731 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003732 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003733 if (globals == Py_None) {
3734 globals = PyEval_GetGlobals();
3735 if (locals == Py_None) {
3736 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003737 plain = 1;
3738 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003739 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003740 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003741 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003742 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003743 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003744 !PyCode_Check(prog) &&
3745 !PyFile_Check(prog)) {
3746 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003747 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003748 return -1;
3749 }
Fred Drake661ea262000-10-24 19:57:45 +00003750 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003751 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003752 "exec: arg 2 must be a dictionary or None");
3753 return -1;
3754 }
3755 if (!PyDict_Check(locals)) {
3756 PyErr_SetString(PyExc_TypeError,
3757 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003758 return -1;
3759 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003760 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003761 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003762 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003763 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3764 PyErr_SetString(PyExc_TypeError,
3765 "code object passed to exec may not contain free variables");
3766 return -1;
3767 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003768 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003769 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003770 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003771 FILE *fp = PyFile_AsFile(prog);
3772 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003773 PyCompilerFlags cf;
3774 cf.cf_flags = 0;
3775 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003776 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3777 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003778 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003779 v = PyRun_File(fp, name, Py_file_input, globals,
3780 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003781 }
3782 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003783 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003784 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003785 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003786 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003787 cf.cf_flags = 0;
3788 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003789 v = PyRun_StringFlags(str, Py_file_input, globals,
3790 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003791 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003792 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003793 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003794 if (plain)
3795 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003796 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003797 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003798 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003799 return 0;
3800}
Guido van Rossum24c13741995-02-14 09:42:43 +00003801
Guido van Rossumac7be682001-01-17 15:42:30 +00003802static void
Paul Prescode68140d2000-08-30 20:25:01 +00003803format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3804{
3805 char *obj_str;
3806
3807 if (!obj)
3808 return;
3809
3810 obj_str = PyString_AsString(obj);
3811 if (!obj_str)
3812 return;
3813
3814 PyErr_Format(exc, format_str, obj_str);
3815}
Guido van Rossum950361c1997-01-24 13:49:28 +00003816
3817#ifdef DYNAMIC_EXECUTION_PROFILE
3818
Skip Montanarof118cb12001-10-15 20:51:38 +00003819static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003820getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003821{
3822 int i;
3823 PyObject *l = PyList_New(256);
3824 if (l == NULL) return NULL;
3825 for (i = 0; i < 256; i++) {
3826 PyObject *x = PyInt_FromLong(a[i]);
3827 if (x == NULL) {
3828 Py_DECREF(l);
3829 return NULL;
3830 }
3831 PyList_SetItem(l, i, x);
3832 }
3833 for (i = 0; i < 256; i++)
3834 a[i] = 0;
3835 return l;
3836}
3837
3838PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003839_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003840{
3841#ifndef DXPAIRS
3842 return getarray(dxp);
3843#else
3844 int i;
3845 PyObject *l = PyList_New(257);
3846 if (l == NULL) return NULL;
3847 for (i = 0; i < 257; i++) {
3848 PyObject *x = getarray(dxpairs[i]);
3849 if (x == NULL) {
3850 Py_DECREF(l);
3851 return NULL;
3852 }
3853 PyList_SetItem(l, i, x);
3854 }
3855 return l;
3856#endif
3857}
3858
3859#endif