blob: 1fab1cca9e15178941f5fa8dcbb5cae88c78b882 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hyltone8c04322002-08-16 17:47:26 +000036static PyObject *call_function(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +000037static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
Jeremy Hylton52820442001-01-03 23:52:36 +000038static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Michael W. Hudson006c7522002-11-08 13:08:46 +000054static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Michael W. Hudsondd32a912002-08-15 14:59:02 +000055 PyFrameObject *, int *, int *);
56
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
58static int assign_slice(PyObject *, PyObject *,
59 PyObject *, PyObject *);
60static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000061static PyObject *import_from(PyObject *, PyObject *);
62static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static PyObject *build_class(PyObject *, PyObject *, PyObject *);
64static int exec_statement(PyFrameObject *,
65 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000066static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
67static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000068static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000069
Paul Prescode68140d2000-08-30 20:25:01 +000070#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000071 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000072#define GLOBAL_NAME_ERROR_MSG \
73 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000074#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000075 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000076#define UNBOUNDFREE_ERROR_MSG \
77 "free variable '%.200s' referenced before assignment" \
78 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000079
Guido van Rossum950361c1997-01-24 13:49:28 +000080/* Dynamic execution profile */
81#ifdef DYNAMIC_EXECUTION_PROFILE
82#ifdef DXPAIRS
83static long dxpairs[257][256];
84#define dxp dxpairs[256]
85#else
86static long dxp[256];
87#endif
88#endif
89
Jeremy Hylton938ace62002-07-17 16:30:39 +000090static PyTypeObject gentype;
Tim Peters5ca576e2001-06-18 22:08:13 +000091
92typedef struct {
93 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000094 /* The gi_ prefix is intended to remind of generator-iterator. */
95
96 PyFrameObject *gi_frame;
97
Tim Peterse77f2e22001-06-26 22:24:51 +000098 /* True if generator is being executed. */
99 int gi_running;
Fred Drake72bc4562002-08-09 18:35:52 +0000100
101 /* List of weak reference. */
102 PyObject *gi_weakreflist;
Tim Peters5ca576e2001-06-18 22:08:13 +0000103} genobject;
104
105static PyObject *
106gen_new(PyFrameObject *f)
107{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000108 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000109 if (gen == NULL) {
110 Py_DECREF(f);
111 return NULL;
112 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000113 gen->gi_frame = f;
114 gen->gi_running = 0;
Fred Drake72bc4562002-08-09 18:35:52 +0000115 gen->gi_weakreflist = NULL;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000116 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000117 return (PyObject *)gen;
118}
119
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000120static int
121gen_traverse(genobject *gen, visitproc visit, void *arg)
122{
123 return visit((PyObject *)gen->gi_frame, arg);
124}
125
Tim Peters5ca576e2001-06-18 22:08:13 +0000126static void
127gen_dealloc(genobject *gen)
128{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000129 _PyObject_GC_UNTRACK(gen);
Fred Drake72bc4562002-08-09 18:35:52 +0000130 if (gen->gi_weakreflist != NULL)
131 PyObject_ClearWeakRefs((PyObject *) gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000133 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000134}
135
136static PyObject *
137gen_iternext(genobject *gen)
138{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000139 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000140 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 PyObject *result;
142
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000143 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000144 PyErr_SetString(PyExc_ValueError,
145 "generator already executing");
146 return NULL;
147 }
Tim Peters8c963692001-06-23 05:26:56 +0000148 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000150
151 /* Generators always return to their most recent caller, not
152 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000153 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000154 assert(f->f_back == NULL);
155 f->f_back = tstate->frame;
156
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000157 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000158 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000159 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000160
161 /* Don't keep the reference to f_back any longer than necessary. It
162 * may keep a chain of frames alive or it could create a reference
163 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000164 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000165 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166
Tim Petersad1a18b2001-06-23 06:19:16 +0000167 /* If the generator just returned (as opposed to yielding), signal
168 * that the generator is exhausted. */
169 if (result == Py_None && f->f_stacktop == NULL) {
170 Py_DECREF(result);
171 result = NULL;
172 }
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000175}
176
177static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000178gen_getiter(PyObject *gen)
179{
180 Py_INCREF(gen);
181 return gen;
182}
183
Guido van Rossum6f799372001-09-20 20:46:19 +0000184static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000185 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
186 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
187 {NULL} /* Sentinel */
188};
Tim Peters5ca576e2001-06-18 22:08:13 +0000189
Tim Peters0c322792002-07-17 16:49:03 +0000190static PyTypeObject gentype = {
Tim Peters5ca576e2001-06-18 22:08:13 +0000191 PyObject_HEAD_INIT(&PyType_Type)
192 0, /* ob_size */
193 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000194 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000195 0, /* tp_itemsize */
196 /* methods */
197 (destructor)gen_dealloc, /* tp_dealloc */
198 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000199 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000200 0, /* tp_setattr */
201 0, /* tp_compare */
202 0, /* tp_repr */
203 0, /* tp_as_number */
204 0, /* tp_as_sequence */
205 0, /* tp_as_mapping */
206 0, /* tp_hash */
207 0, /* tp_call */
208 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000209 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000210 0, /* tp_setattro */
211 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000212 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000214 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000215 0, /* tp_clear */
216 0, /* tp_richcompare */
Fred Drake72bc4562002-08-09 18:35:52 +0000217 offsetof(genobject, gi_weakreflist), /* tp_weaklistoffset */
Tim Peters5ca576e2001-06-18 22:08:13 +0000218 (getiterfunc)gen_getiter, /* tp_iter */
219 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Petersa64295b2002-07-17 00:15:22 +0000220 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 gen_memberlist, /* tp_members */
222 0, /* tp_getset */
223 0, /* tp_base */
224 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225};
226
227
Guido van Rossume59214e1994-08-30 08:01:59 +0000228#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000229
Guido van Rossum2571cc81999-04-07 16:07:23 +0000230#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000231#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000232#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000233#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000234
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235extern int _PyThread_Started; /* Flag for Py_Exit */
236
Guido van Rossum65d5b571998-12-21 19:32:43 +0000237static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000238static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000239
240void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000242{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000244 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000246 interpreter_lock = PyThread_allocate_lock();
247 PyThread_acquire_lock(interpreter_lock, 1);
248 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000250
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000254 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255}
256
257void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000259{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000260 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261}
262
263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000265{
266 if (tstate == NULL)
267 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000269 if (PyThreadState_Swap(tstate) != NULL)
270 Py_FatalError(
271 "PyEval_AcquireThread: non-NULL old thread state");
272}
273
274void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000276{
277 if (tstate == NULL)
278 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
279 if (PyThreadState_Swap(NULL) != tstate)
280 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000283
284/* This function is called from PyOS_AfterFork to ensure that newly
285 created child processes don't hold locks referring to threads which
286 are not running in the child process. (This could also be done using
287 pthread_atfork mechanism, at least for the pthreads implementation.) */
288
289void
290PyEval_ReInitThreads(void)
291{
292 if (!interpreter_lock)
293 return;
294 /*XXX Can't use PyThread_free_lock here because it does too
295 much error-checking. Doing this cleanly would require
296 adding a new function to each thread_*.h. Instead, just
297 create a new lock and waste a little bit of memory */
298 interpreter_lock = PyThread_allocate_lock();
299 PyThread_acquire_lock(interpreter_lock, 1);
300 main_thread = PyThread_get_thread_ident();
301}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302#endif
303
Guido van Rossumff4949e1992-08-05 19:58:53 +0000304/* Functions save_thread and restore_thread are always defined so
305 dynamically loaded modules needn't be compiled separately for use
306 with and without threads: */
307
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000308PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000309PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000311 PyThreadState *tstate = PyThreadState_Swap(NULL);
312 if (tstate == NULL)
313 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000314#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000315 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000318 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319}
320
321void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 if (tstate == NULL)
325 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 }
332#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336
Guido van Rossuma9672091994-09-14 13:31:22 +0000337/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
338 signal handlers or Mac I/O completion routines) can schedule calls
339 to a function to be called synchronously.
340 The synchronous function is called with one void* argument.
341 It should return 0 for success or -1 for failure -- failure should
342 be accompanied by an exception.
343
344 If registry succeeds, the registry function returns 0; if it fails
345 (e.g. due to too many pending calls) it returns -1 (without setting
346 an exception condition).
347
348 Note that because registry may occur from within signal handlers,
349 or other asynchronous events, calling malloc() is unsafe!
350
351#ifdef WITH_THREAD
352 Any thread can schedule pending calls, but only the main thread
353 will execute them.
354#endif
355
356 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
357 There are two possible race conditions:
358 (1) nested asynchronous registry calls;
359 (2) registry calls made while pending calls are being processed.
360 While (1) is very unlikely, (2) is a real possibility.
361 The current code is safe against (2), but not against (1).
362 The safety against (2) is derived from the fact that only one
363 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000364
Guido van Rossuma027efa1997-05-05 20:56:21 +0000365 XXX Darn! With the advent of thread state, we should have an array
366 of pending calls per thread in the thread state! Later...
367*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000368
Guido van Rossuma9672091994-09-14 13:31:22 +0000369#define NPENDINGCALLS 32
370static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000371 int (*func)(void *);
372 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373} pendingcalls[NPENDINGCALLS];
374static volatile int pendingfirst = 0;
375static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
378int
Thomas Wouters334fb892000-07-25 12:56:38 +0000379Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000380{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 int i, j;
383 /* XXX Begin critical section */
384 /* XXX If you want this to be safe against nested
385 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 if (busy)
387 return -1;
388 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389 i = pendinglast;
390 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000391 if (j == pendingfirst) {
392 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000393 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000394 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 pendingcalls[i].func = func;
396 pendingcalls[i].arg = arg;
397 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000398
399 _Py_Ticker = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 /* XXX End critical section */
403 return 0;
404}
405
Guido van Rossum180d7b41994-09-29 09:45:57 +0000406int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000407Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000408{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000409 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000410#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000411 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000412 return 0;
413#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415 return 0;
416 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000417 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418 for (;;) {
419 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000420 int (*func)(void *);
421 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000422 i = pendingfirst;
423 if (i == pendinglast)
424 break; /* Queue empty */
425 func = pendingcalls[i].func;
426 arg = pendingcalls[i].arg;
427 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000428 if (func(arg) < 0) {
429 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000432 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000433 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000434 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000435 return 0;
436}
437
438
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000439/* The interpreter's recursion limit */
440
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000441static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000442
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000443int
444Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000445{
446 return recursion_limit;
447}
448
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000449void
450Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451{
452 recursion_limit = new_limit;
453}
454
Guido van Rossum374a9221991-04-04 10:40:29 +0000455/* Status code for main loop (reason for stack unwind) */
456
457enum why_code {
458 WHY_NOT, /* No error */
459 WHY_EXCEPTION, /* Exception occurred */
460 WHY_RERAISE, /* Exception re-raised by 'finally' */
461 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000462 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000463 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000464 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000465};
466
Tim Petersdbd9ba62000-07-09 03:09:57 +0000467static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000468static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000469
Skip Montanarod581d772002-09-03 20:10:45 +0000470/* for manipulating the thread switch and periodic "stuff" - used to be
471 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000472int _Py_CheckInterval = 100;
473volatile int _Py_Ticker = 100;
Guido van Rossum374a9221991-04-04 10:40:29 +0000474
Guido van Rossumb209a111997-04-29 18:18:01 +0000475PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000476PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000478 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 (PyObject **)NULL, 0,
481 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482 (PyObject **)NULL, 0,
483 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484}
485
486
487/* Interpreter main loop */
488
Tim Peters6d6c1a32001-08-02 04:15:00 +0000489static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000490eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000491{
Guido van Rossum950361c1997-01-24 13:49:28 +0000492#ifdef DXPAIRS
493 int lastopcode = 0;
494#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000495 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000496 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000497 register int opcode=0; /* Current opcode */
498 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000499 register enum why_code why; /* Reason for block stack unwind */
500 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000501 register PyObject *x; /* Result object -- NULL if error */
502 register PyObject *v; /* Temporary objects popped off stack */
503 register PyObject *w;
504 register PyObject *u;
505 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000506 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000507 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000508 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000509 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000510 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000511
512 /* when tracing we set things up so that
513
514 not (instr_lb <= current_bytecode_offset < instr_ub)
515
516 is true when the line being executed has changed. The
517 initial values are such as to make this false the first
518 time it is tested. */
519 int instr_ub = -1, instr_lb = 0;
520
Guido van Rossumd076c731998-10-07 19:42:25 +0000521 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000522 PyObject *names;
523 PyObject *consts;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000524#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000525 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000526#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000527#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000529 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000530#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000531
Neal Norwitza81d2202002-07-14 00:27:26 +0000532/* Tuple access macros */
533
534#ifndef Py_DEBUG
535#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
536#else
537#define GETITEM(v, i) PyTuple_GetItem((v), (i))
538#endif
539
Guido van Rossum374a9221991-04-04 10:40:29 +0000540/* Code access macros */
541
Guido van Rossumd076c731998-10-07 19:42:25 +0000542#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000543#define NEXTOP() (*next_instr++)
544#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000545#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000546#define JUMPBY(x) (next_instr += (x))
547
548/* Stack manipulation macros */
549
550#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
551#define EMPTY() (STACK_LEVEL() == 0)
552#define TOP() (stack_pointer[-1])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000553#define SECOND() (stack_pointer[-2])
554#define THIRD() (stack_pointer[-3])
555#define FOURTH() (stack_pointer[-4])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000556#define SET_TOP(v) (stack_pointer[-1] = (v))
557#define SET_SECOND(v) (stack_pointer[-2] = (v))
558#define SET_THIRD(v) (stack_pointer[-3] = (v))
559#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Raymond Hettinger663004b2003-01-09 15:24:30 +0000560#define BASIC_STACKADJ(n) (stack_pointer += n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000561#define BASIC_PUSH(v) (*stack_pointer++ = (v))
562#define BASIC_POP() (*--stack_pointer)
563
Guido van Rossum96a42c81992-01-12 02:29:51 +0000564#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000565#define PUSH(v) { (void)(BASIC_PUSH(v), \
566 lltrace && prtrace(TOP(), "push")); \
567 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000568#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Raymond Hettinger663004b2003-01-09 15:24:30 +0000569#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
570 lltrace && prtrace(TOP(), "stackadj")); \
571 assert(STACK_LEVEL() <= f->f_stacksize); }
Guido van Rossum374a9221991-04-04 10:40:29 +0000572#else
573#define PUSH(v) BASIC_PUSH(v)
574#define POP() BASIC_POP()
Raymond Hettinger663004b2003-01-09 15:24:30 +0000575#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000576#endif
577
Guido van Rossum681d79a1995-07-18 14:51:37 +0000578/* Local variable macros */
579
580#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000581
582/* The SETLOCAL() macro must not DECREF the local variable in-place and
583 then store the new value; it must copy the old value to a temporary
584 value, then store the new value, and then DECREF the temporary value.
585 This is because it is possible that during the DECREF the frame is
586 accessed by other code (e.g. a __del__ method or gc.collect()) and the
587 variable would be pointing to already-freed memory. */
588#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
589 GETLOCAL(i) = value; \
590 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000591
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592/* Start of code */
593
Tim Peters5ca576e2001-06-18 22:08:13 +0000594 if (f == NULL)
595 return NULL;
596
Guido van Rossum8861b741996-07-30 16:49:37 +0000597#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000598 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000599 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000600 return NULL;
601 }
602#endif
603
Tim Peters5ca576e2001-06-18 22:08:13 +0000604 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000605 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000606 --tstate->recursion_depth;
607 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000608 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000610 return NULL;
611 }
612
Tim Peters5ca576e2001-06-18 22:08:13 +0000613 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000614
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000615 if (tstate->use_tracing) {
616 if (tstate->c_tracefunc != NULL) {
617 /* tstate->c_tracefunc, if defined, is a
618 function that will be called on *every* entry
619 to a code block. Its return value, if not
620 None, is a function that will be called at
621 the start of each executed line of code.
622 (Actually, the function must return itself
623 in order to continue tracing.) The trace
624 functions are called with three arguments:
625 a pointer to the current frame, a string
626 indicating why the function is called, and
627 an argument which depends on the situation.
628 The global trace function is also called
629 whenever an exception is detected. */
630 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
631 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000632 /* Trace 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 if (tstate->c_profilefunc != NULL) {
639 /* Similar for c_profilefunc, except it needn't
640 return itself and isn't called for "line" events */
641 if (call_trace(tstate->c_profilefunc,
642 tstate->c_profileobj,
643 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000644 /* Profile function raised an error */
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000645 --tstate->recursion_depth;
646 tstate->frame = f->f_back;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000647 return NULL;
648 }
649 }
650 }
651
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000652 co = f->f_code;
653 names = co->co_names;
654 consts = co->co_consts;
655 fastlocals = f->f_localsplus;
656 freevars = f->f_localsplus + f->f_nlocals;
657 _PyCode_GETCODEPTR(co, &first_instr);
658 /* An explanation is in order for the next line.
659
660 f->f_lasti now refers to the index of the last instruction
661 executed. You might think this was obvious from the name, but
662 this wasn't always true before 2.3! PyFrame_New now sets
663 f->f_lasti to -1 (i.e. the index *before* the first instruction)
664 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
665 does work. Promise. */
666 next_instr = first_instr + f->f_lasti + 1;
667 stack_pointer = f->f_stacktop;
668 assert(stack_pointer != NULL);
669 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
670
Tim Peters5ca576e2001-06-18 22:08:13 +0000671#ifdef LLTRACE
672 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
673#endif
674#if defined(Py_DEBUG) || defined(LLTRACE)
675 filename = PyString_AsString(co->co_filename);
676#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000677
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 why = WHY_NOT;
679 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000680 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000681 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 for (;;) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000684 assert(stack_pointer >= f->f_valuestack); /* else underflow */
685 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
686
Guido van Rossuma027efa1997-05-05 20:56:21 +0000687 /* Do periodic things. Doing this every time through
688 the loop would add too much overhead, so we do it
689 only every Nth instruction. We also do it if
690 ``things_to_do'' is set, i.e. when an asynchronous
691 event needs attention (e.g. a signal handler or
692 async I/O handler); see Py_AddPendingCall() and
693 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000694
Skip Montanarod581d772002-09-03 20:10:45 +0000695 if (--_Py_Ticker < 0) {
696 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000697 tstate->tick_counter++;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000698 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000699 if (Py_MakePendingCalls() < 0) {
700 why = WHY_EXCEPTION;
701 goto on_error;
702 }
703 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000704#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000705 /* If we have true signals, the signal handler
706 will call Py_AddPendingCall() so we don't
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000707 have to call PyErr_CheckSignals(). On the
708 Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000709 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 goto on_error;
712 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000713#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000714
Guido van Rossume59214e1994-08-30 08:01:59 +0000715#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000716 if (interpreter_lock) {
717 /* Give another thread a chance */
718
Guido van Rossum25ce5661997-08-02 03:10:38 +0000719 if (PyThreadState_Swap(NULL) != tstate)
720 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000721 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000722
723 /* Other threads may run now */
724
Guido van Rossum65d5b571998-12-21 19:32:43 +0000725 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000726 if (PyThreadState_Swap(tstate) != NULL)
727 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000728 }
729#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000731
Neil Schemenauer63543862002-02-17 19:10:14 +0000732 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000733 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000734
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000735 /* line-by-line tracing support */
736
737 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
738 /* see maybe_call_line_trace
739 for expository comments */
740 f->f_stacktop = stack_pointer;
Michael W. Hudson006c7522002-11-08 13:08:46 +0000741
742 if (maybe_call_line_trace(tstate->c_tracefunc,
743 tstate->c_traceobj,
744 f, &instr_lb, &instr_ub)) {
745 /* trace function raised an exception */
746 why = WHY_EXCEPTION;
747 goto on_error;
748 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000749 /* Reload possibly changed frame fields */
750 JUMPTO(f->f_lasti);
751 stack_pointer = f->f_stacktop;
752 assert(stack_pointer != NULL);
753 f->f_stacktop = NULL;
754 }
755
756 /* Extract opcode and argument */
757
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 opcode = NEXTOP();
759 if (HAS_ARG(opcode))
760 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000761 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000762#ifdef DYNAMIC_EXECUTION_PROFILE
763#ifdef DXPAIRS
764 dxpairs[lastopcode][opcode]++;
765 lastopcode = opcode;
766#endif
767 dxp[opcode]++;
768#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000769
Guido van Rossum96a42c81992-01-12 02:29:51 +0000770#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000772
Guido van Rossum96a42c81992-01-12 02:29:51 +0000773 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 if (HAS_ARG(opcode)) {
775 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000776 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 }
778 else {
779 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000780 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 }
782 }
783#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000784
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000786
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000788
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 /* BEWARE!
790 It is essential that any operation that fails sets either
791 x to NULL, err to nonzero, or why to anything but WHY_NOT,
792 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000793
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000795
Neil Schemenauer63543862002-02-17 19:10:14 +0000796 case LOAD_FAST:
797 x = GETLOCAL(oparg);
798 if (x != NULL) {
799 Py_INCREF(x);
800 PUSH(x);
801 goto fast_next_opcode;
802 }
803 format_exc_check_arg(PyExc_UnboundLocalError,
804 UNBOUNDLOCAL_ERROR_MSG,
805 PyTuple_GetItem(co->co_varnames, oparg));
806 break;
807
808 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000809 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000810 Py_INCREF(x);
811 PUSH(x);
812 goto fast_next_opcode;
813
814 case STORE_FAST:
815 v = POP();
816 SETLOCAL(oparg, v);
817 goto fast_next_opcode;
818
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 case POP_TOP:
820 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000821 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000822 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000823
Guido van Rossum374a9221991-04-04 10:40:29 +0000824 case ROT_TWO:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000825 v = TOP();
826 w = SECOND();
827 SET_TOP(w);
828 SET_SECOND(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000829 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000830
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 case ROT_THREE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000832 v = TOP();
833 w = SECOND();
834 x = THIRD();
835 SET_TOP(w);
836 SET_SECOND(x);
837 SET_THIRD(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 ROT_FOUR:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000841 u = TOP();
842 v = SECOND();
843 w = THIRD();
844 x = FOURTH();
845 SET_TOP(v);
846 SET_SECOND(w);
847 SET_THIRD(x);
848 SET_FOURTH(u);
Thomas Wouters434d0822000-08-24 20:11:32 +0000849 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000850
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 case DUP_TOP:
852 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000854 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000855 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000856
Thomas Wouters434d0822000-08-24 20:11:32 +0000857 case DUP_TOPX:
858 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000859 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000860 x = TOP();
861 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000862 STACKADJ(1);
863 SET_TOP(x);
Tim Peters35ba6892000-10-11 07:04:49 +0000864 continue;
865 case 2:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000866 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000867 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000868 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +0000869 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000870 STACKADJ(2);
871 SET_TOP(x);
872 SET_SECOND(w);
Tim Peters35ba6892000-10-11 07:04:49 +0000873 continue;
874 case 3:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000875 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000876 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000877 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +0000878 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000879 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +0000880 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000881 STACKADJ(3);
882 SET_TOP(x);
883 SET_SECOND(w);
884 SET_THIRD(v);
Tim Peters35ba6892000-10-11 07:04:49 +0000885 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000886 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000887 Py_FatalError("invalid argument to DUP_TOPX"
888 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000889 }
Tim Peters35ba6892000-10-11 07:04:49 +0000890 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000891
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000893 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000894 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000895 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000896 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000897 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000899
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000901 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000902 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000903 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000904 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000905 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000907
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 case UNARY_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000909 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000910 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000911 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000912 if (err == 0) {
913 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000914 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +0000915 continue;
916 }
917 else if (err > 0) {
918 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000919 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +0000920 err = 0;
921 continue;
922 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +0000923 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000925
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 case UNARY_CONVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000927 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 x = PyObject_Repr(v);
929 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000930 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000931 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000933
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000935 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000936 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000937 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000938 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000939 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000940 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000941
Guido van Rossum50564e81996-01-12 01:13:16 +0000942 case BINARY_POWER:
943 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000944 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000945 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000946 Py_DECREF(v);
947 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000948 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000949 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000950 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000951
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 case BINARY_MULTIPLY:
953 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000954 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000955 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000956 Py_DECREF(v);
957 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000958 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000959 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000961
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000963 if (!_Py_QnewFlag) {
964 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000965 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +0000966 x = PyNumber_Divide(v, w);
967 Py_DECREF(v);
968 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000969 SET_TOP(x);
Tim Peters3caca232001-12-06 06:23:26 +0000970 if (x != NULL) continue;
971 break;
972 }
Raymond Hettinger663004b2003-01-09 15:24:30 +0000973 /* -Qnew is in effect: fall through to
Tim Peters3caca232001-12-06 06:23:26 +0000974 BINARY_TRUE_DIVIDE */
975 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000977 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +0000978 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 Py_DECREF(v);
980 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000981 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000982 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000984
Guido van Rossum4668b002001-08-08 05:00:18 +0000985 case BINARY_FLOOR_DIVIDE:
986 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000987 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +0000988 x = PyNumber_FloorDivide(v, w);
989 Py_DECREF(v);
990 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000991 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +0000992 if (x != NULL) continue;
993 break;
994
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 case BINARY_MODULO:
996 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000997 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000998 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000999 Py_DECREF(v);
1000 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001001 SET_TOP(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 Rossum374a9221991-04-04 10:40:29 +00001005 case BINARY_ADD:
1006 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001007 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001008 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 /* INLINE: int + int */
1010 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001011 a = PyInt_AS_LONG(v);
1012 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001013 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001014 if ((i^a) < 0 && (i^b) < 0)
1015 goto slow_add;
1016 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001017 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001018 else {
1019 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001020 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001021 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001022 Py_DECREF(v);
1023 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001024 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001025 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001027
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 case BINARY_SUBTRACT:
1029 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001030 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001031 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001032 /* INLINE: int - int */
1033 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001034 a = PyInt_AS_LONG(v);
1035 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001036 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001037 if ((i^a) < 0 && (i^~b) < 0)
1038 goto slow_sub;
1039 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001040 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001041 else {
1042 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001043 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001044 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001045 Py_DECREF(v);
1046 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001047 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001048 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001050
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 case BINARY_SUBSCR:
1052 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001053 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001054 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001055 /* INLINE: list[int] */
1056 long i = PyInt_AsLong(w);
1057 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001058 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001059 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001060 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001061 PyErr_SetString(PyExc_IndexError,
1062 "list index out of range");
1063 x = NULL;
1064 }
1065 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001066 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001067 Py_INCREF(x);
1068 }
1069 }
1070 else
1071 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001072 Py_DECREF(v);
1073 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001074 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001075 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001077
Guido van Rossum7928cd71991-10-24 14:59:31 +00001078 case BINARY_LSHIFT:
1079 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001080 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001081 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001082 Py_DECREF(v);
1083 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001084 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001085 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001086 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001087
Guido van Rossum7928cd71991-10-24 14:59:31 +00001088 case BINARY_RSHIFT:
1089 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001090 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001091 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001092 Py_DECREF(v);
1093 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001094 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001095 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001096 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001097
Guido van Rossum7928cd71991-10-24 14:59:31 +00001098 case BINARY_AND:
1099 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001100 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001101 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001102 Py_DECREF(v);
1103 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001104 SET_TOP(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_XOR:
1109 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001110 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001111 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001112 Py_DECREF(v);
1113 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001114 SET_TOP(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_OR:
1119 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001120 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001121 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001122 Py_DECREF(v);
1123 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001124 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001125 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001126 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001127
1128 case INPLACE_POWER:
1129 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001130 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001131 x = PyNumber_InPlacePower(v, w, Py_None);
1132 Py_DECREF(v);
1133 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001134 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 if (x != NULL) continue;
1136 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001137
Thomas Wouters434d0822000-08-24 20:11:32 +00001138 case INPLACE_MULTIPLY:
1139 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001140 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001141 x = PyNumber_InPlaceMultiply(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001144 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001145 if (x != NULL) continue;
1146 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001147
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001149 if (!_Py_QnewFlag) {
1150 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001151 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001152 x = PyNumber_InPlaceDivide(v, w);
1153 Py_DECREF(v);
1154 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001155 SET_TOP(x);
Tim Peters54b11912001-12-25 18:49:11 +00001156 if (x != NULL) continue;
1157 break;
1158 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001159 /* -Qnew is in effect: fall through to
Tim Peters54b11912001-12-25 18:49:11 +00001160 INPLACE_TRUE_DIVIDE */
1161 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001162 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001163 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001164 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001165 Py_DECREF(v);
1166 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001167 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 if (x != NULL) continue;
1169 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001170
Guido van Rossum4668b002001-08-08 05:00:18 +00001171 case INPLACE_FLOOR_DIVIDE:
1172 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001173 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001174 x = PyNumber_InPlaceFloorDivide(v, w);
1175 Py_DECREF(v);
1176 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001177 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001178 if (x != NULL) continue;
1179 break;
1180
Thomas Wouters434d0822000-08-24 20:11:32 +00001181 case INPLACE_MODULO:
1182 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001183 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001184 x = PyNumber_InPlaceRemainder(v, w);
1185 Py_DECREF(v);
1186 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001187 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001188 if (x != NULL) continue;
1189 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001190
Thomas Wouters434d0822000-08-24 20:11:32 +00001191 case INPLACE_ADD:
1192 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001193 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001194 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001195 /* INLINE: int + int */
1196 register long a, b, i;
1197 a = PyInt_AS_LONG(v);
1198 b = PyInt_AS_LONG(w);
1199 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001200 if ((i^a) < 0 && (i^b) < 0)
1201 goto slow_iadd;
1202 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001203 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001204 else {
1205 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001206 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001207 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001208 Py_DECREF(v);
1209 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001210 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001211 if (x != NULL) continue;
1212 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001213
Thomas Wouters434d0822000-08-24 20:11:32 +00001214 case INPLACE_SUBTRACT:
1215 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001216 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001217 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001218 /* INLINE: int - int */
1219 register long a, b, i;
1220 a = PyInt_AS_LONG(v);
1221 b = PyInt_AS_LONG(w);
1222 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001223 if ((i^a) < 0 && (i^~b) < 0)
1224 goto slow_isub;
1225 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001226 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001227 else {
1228 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001229 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001230 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001231 Py_DECREF(v);
1232 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001233 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001234 if (x != NULL) continue;
1235 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001236
Thomas Wouters434d0822000-08-24 20:11:32 +00001237 case INPLACE_LSHIFT:
1238 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001239 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001240 x = PyNumber_InPlaceLshift(v, w);
1241 Py_DECREF(v);
1242 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001243 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001244 if (x != NULL) continue;
1245 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001246
Thomas Wouters434d0822000-08-24 20:11:32 +00001247 case INPLACE_RSHIFT:
1248 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001249 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001250 x = PyNumber_InPlaceRshift(v, w);
1251 Py_DECREF(v);
1252 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001253 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001254 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_AND:
1258 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001259 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001260 x = PyNumber_InPlaceAnd(v, w);
1261 Py_DECREF(v);
1262 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001263 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001264 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_XOR:
1268 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001269 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001270 x = PyNumber_InPlaceXor(v, w);
1271 Py_DECREF(v);
1272 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001273 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001274 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_OR:
1278 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001279 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001280 x = PyNumber_InPlaceOr(v, w);
1281 Py_DECREF(v);
1282 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001283 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001284 if (x != NULL) continue;
1285 break;
1286
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 case SLICE+0:
1288 case SLICE+1:
1289 case SLICE+2:
1290 case SLICE+3:
1291 if ((opcode-SLICE) & 2)
1292 w = POP();
1293 else
1294 w = NULL;
1295 if ((opcode-SLICE) & 1)
1296 v = POP();
1297 else
1298 v = NULL;
Raymond Hettinger663004b2003-01-09 15:24:30 +00001299 u = TOP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 Py_DECREF(u);
1302 Py_XDECREF(v);
1303 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001304 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001305 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001306 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001307
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 case STORE_SLICE+0:
1309 case STORE_SLICE+1:
1310 case STORE_SLICE+2:
1311 case STORE_SLICE+3:
1312 if ((opcode-STORE_SLICE) & 2)
1313 w = POP();
1314 else
1315 w = NULL;
1316 if ((opcode-STORE_SLICE) & 1)
1317 v = POP();
1318 else
1319 v = NULL;
1320 u = POP();
1321 t = POP();
1322 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001323 Py_DECREF(t);
1324 Py_DECREF(u);
1325 Py_XDECREF(v);
1326 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001327 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001329
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 case DELETE_SLICE+0:
1331 case DELETE_SLICE+1:
1332 case DELETE_SLICE+2:
1333 case DELETE_SLICE+3:
1334 if ((opcode-DELETE_SLICE) & 2)
1335 w = POP();
1336 else
1337 w = NULL;
1338 if ((opcode-DELETE_SLICE) & 1)
1339 v = POP();
1340 else
1341 v = NULL;
1342 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001345 Py_DECREF(u);
1346 Py_XDECREF(v);
1347 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001348 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001350
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001352 w = TOP();
1353 v = SECOND();
1354 u = THIRD();
1355 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001357 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 Py_DECREF(u);
1359 Py_DECREF(v);
1360 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001361 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001363
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001365 w = TOP();
1366 v = SECOND();
1367 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001369 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 Py_DECREF(v);
1371 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001372 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001374
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 case PRINT_EXPR:
1376 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001377 w = PySys_GetObject("displayhook");
1378 if (w == NULL) {
1379 PyErr_SetString(PyExc_RuntimeError,
1380 "lost sys.displayhook");
1381 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001382 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001383 }
1384 if (err == 0) {
1385 x = Py_BuildValue("(O)", v);
1386 if (x == NULL)
1387 err = -1;
1388 }
1389 if (err == 0) {
1390 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001391 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001392 if (w == NULL)
1393 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001394 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001396 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001398
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001399 case PRINT_ITEM_TO:
1400 w = stream = POP();
1401 /* fall through to PRINT_ITEM */
1402
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 case PRINT_ITEM:
1404 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001405 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001406 w = PySys_GetObject("stdout");
1407 if (w == NULL) {
1408 PyErr_SetString(PyExc_RuntimeError,
1409 "lost sys.stdout");
1410 err = -1;
1411 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001412 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001413 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001414 err = PyFile_WriteString(" ", w);
1415 if (err == 0)
1416 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001417 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001418 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001419 if (PyString_Check(v)) {
1420 char *s = PyString_AS_STRING(v);
1421 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001422 if (len == 0 ||
1423 !isspace(Py_CHARMASK(s[len-1])) ||
1424 s[len-1] == ' ')
1425 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001426 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001427#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001428 else if (PyUnicode_Check(v)) {
1429 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1430 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001431 if (len == 0 ||
1432 !Py_UNICODE_ISSPACE(s[len-1]) ||
1433 s[len-1] == ' ')
1434 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001435 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001436#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001437 else
1438 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001441 Py_XDECREF(stream);
1442 stream = NULL;
1443 if (err == 0)
1444 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001446
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001447 case PRINT_NEWLINE_TO:
1448 w = stream = POP();
1449 /* fall through to PRINT_NEWLINE */
1450
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001452 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001453 w = PySys_GetObject("stdout");
1454 if (w == NULL)
1455 PyErr_SetString(PyExc_RuntimeError,
1456 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001457 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001458 if (w != NULL) {
1459 err = PyFile_WriteString("\n", w);
1460 if (err == 0)
1461 PyFile_SoftSpace(w, 0);
1462 }
1463 Py_XDECREF(stream);
1464 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001466
Thomas Wouters434d0822000-08-24 20:11:32 +00001467
1468#ifdef CASE_TOO_BIG
1469 default: switch (opcode) {
1470#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 case BREAK_LOOP:
1472 why = WHY_BREAK;
1473 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001474
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001475 case CONTINUE_LOOP:
1476 retval = PyInt_FromLong(oparg);
1477 why = WHY_CONTINUE;
1478 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001479
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480 case RAISE_VARARGS:
1481 u = v = w = NULL;
1482 switch (oparg) {
1483 case 3:
1484 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001485 /* Fallthrough */
1486 case 2:
1487 v = POP(); /* value */
1488 /* Fallthrough */
1489 case 1:
1490 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001491 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001492 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001493 break;
1494 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001496 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001497 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001498 break;
1499 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001501
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001503 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001504 PyErr_SetString(PyExc_SystemError,
1505 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001506 break;
1507 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001508 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001509 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001511
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 case RETURN_VALUE:
1513 retval = POP();
1514 why = WHY_RETURN;
1515 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001516
Tim Peters5ca576e2001-06-18 22:08:13 +00001517 case YIELD_VALUE:
1518 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001519 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001520 why = WHY_YIELD;
1521 break;
1522
1523
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001524 case EXEC_STMT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001525 w = TOP();
1526 v = SECOND();
1527 u = THIRD();
1528 STACKADJ(-3);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001529 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 Py_DECREF(u);
1531 Py_DECREF(v);
1532 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001533 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001534
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 case POP_BLOCK:
1536 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 while (STACK_LEVEL() > b->b_level) {
1539 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001540 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 }
1542 }
1543 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001544
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 case END_FINALLY:
1546 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 if (PyInt_Check(v)) {
1548 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001549 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001550 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001551 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 retval = POP();
1553 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001559 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001561 else if (v != Py_None) {
1562 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 "'finally' pops bad exception");
1564 why = WHY_EXCEPTION;
1565 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001566 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001568
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 case BUILD_CLASS:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001570 u = TOP();
1571 v = SECOND();
1572 w = THIRD();
1573 STACKADJ(-2);
Guido van Rossum25831651993-05-19 14:50:45 +00001574 x = build_class(u, v, w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001575 SET_TOP(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 Py_DECREF(u);
1577 Py_DECREF(v);
1578 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001580
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001582 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001585 PyErr_Format(PyExc_SystemError,
1586 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001587 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 break;
1589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 err = PyDict_SetItem(x, w, v);
1591 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001593
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001595 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001596 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001597 PyErr_Format(PyExc_SystemError,
1598 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001599 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 break;
1601 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001603 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001604 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001606
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001607 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001609 if (PyTuple_Check(v)) {
1610 if (PyTuple_Size(v) != oparg) {
1611 PyErr_SetString(PyExc_ValueError,
1612 "unpack tuple of wrong size");
1613 why = WHY_EXCEPTION;
1614 }
1615 else {
1616 for (; --oparg >= 0; ) {
1617 w = PyTuple_GET_ITEM(v, oparg);
1618 Py_INCREF(w);
1619 PUSH(w);
1620 }
1621 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001622 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001623 else if (PyList_Check(v)) {
1624 if (PyList_Size(v) != oparg) {
1625 PyErr_SetString(PyExc_ValueError,
1626 "unpack list of wrong size");
1627 why = WHY_EXCEPTION;
1628 }
1629 else {
1630 for (; --oparg >= 0; ) {
1631 w = PyList_GET_ITEM(v, oparg);
1632 Py_INCREF(w);
1633 PUSH(w);
1634 }
1635 }
1636 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001637 else if (unpack_iterable(v, oparg,
1638 stack_pointer + oparg))
1639 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001640 else {
1641 if (PyErr_ExceptionMatches(PyExc_TypeError))
1642 PyErr_SetString(PyExc_TypeError,
1643 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001644 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001645 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001647 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001648
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001650 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001651 v = TOP();
1652 u = SECOND();
1653 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1655 Py_DECREF(v);
1656 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001658
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001660 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001662 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1663 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001664 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001666
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001667 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001668 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001669 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001670 err = PyDict_SetItem(f->f_globals, w, v);
1671 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001672 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001673
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001674 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001675 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001677 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001678 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001679 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001680
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001682 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001683 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001684 PyErr_Format(PyExc_SystemError,
1685 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001686 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001687 break;
1688 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001695 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001696 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001697 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 break;
1699 }
1700 }
1701 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001702 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 PUSH(x);
1704 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001705
Guido van Rossum374a9221991-04-04 10:40:29 +00001706 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001707 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001708 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001709 /* Inline the PyDict_GetItem() calls.
1710 WARNING: this is an extreme speed hack.
1711 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001712 long hash = ((PyStringObject *)w)->ob_shash;
1713 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001714 PyDictObject *d;
1715 d = (PyDictObject *)(f->f_globals);
1716 x = d->ma_lookup(d, w, hash)->me_value;
1717 if (x != NULL) {
1718 Py_INCREF(x);
1719 PUSH(x);
1720 continue;
1721 }
1722 d = (PyDictObject *)(f->f_builtins);
1723 x = d->ma_lookup(d, w, hash)->me_value;
1724 if (x != NULL) {
1725 Py_INCREF(x);
1726 PUSH(x);
1727 continue;
1728 }
1729 goto load_global_error;
1730 }
1731 }
1732 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001737 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001738 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001739 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001740 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 break;
1742 }
1743 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001744 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 PUSH(x);
1746 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001747
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001748 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001749 x = GETLOCAL(oparg);
1750 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001751 format_exc_check_arg(
1752 PyExc_UnboundLocalError,
1753 UNBOUNDLOCAL_ERROR_MSG,
1754 PyTuple_GetItem(co->co_varnames, oparg)
1755 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001756 break;
1757 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001758 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001759 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001760
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001761 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001762 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001763 Py_INCREF(x);
1764 PUSH(x);
1765 break;
1766
1767 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001768 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001769 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001770 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001771 err = -1;
1772 /* Don't stomp existing exception */
1773 if (PyErr_Occurred())
1774 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001775 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001776 v = PyTuple_GetItem(co->co_cellvars,
1777 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001778 format_exc_check_arg(
1779 PyExc_UnboundLocalError,
1780 UNBOUNDLOCAL_ERROR_MSG,
1781 v);
1782 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001783 v = PyTuple_GetItem(
1784 co->co_freevars,
1785 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001786 format_exc_check_arg(
1787 PyExc_NameError,
1788 UNBOUNDFREE_ERROR_MSG,
1789 v);
1790 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001791 break;
1792 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001793 PUSH(w);
1794 break;
1795
1796 case STORE_DEREF:
1797 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001798 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001799 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001800 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001801 continue;
1802
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001804 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 if (x != NULL) {
1806 for (; --oparg >= 0;) {
1807 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 }
1810 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001811 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001812 }
1813 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001814
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001816 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001817 if (x != NULL) {
1818 for (; --oparg >= 0;) {
1819 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001820 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 }
1822 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001823 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 }
1825 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001826
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001830 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001832
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001834 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001835 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 x = PyObject_GetAttr(v, w);
1837 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001838 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001839 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001841
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 case COMPARE_OP:
1843 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001844 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001845 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001846 /* INLINE: cmp(int, int) */
1847 register long a, b;
1848 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001849 a = PyInt_AS_LONG(v);
1850 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001851 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001852 case PyCmp_LT: res = a < b; break;
1853 case PyCmp_LE: res = a <= b; break;
1854 case PyCmp_EQ: res = a == b; break;
1855 case PyCmp_NE: res = a != b; break;
1856 case PyCmp_GT: res = a > b; break;
1857 case PyCmp_GE: res = a >= b; break;
1858 case PyCmp_IS: res = v == w; break;
1859 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001860 default: goto slow_compare;
1861 }
1862 x = res ? Py_True : Py_False;
1863 Py_INCREF(x);
1864 }
1865 else {
1866 slow_compare:
1867 x = cmp_outcome(oparg, v, w);
1868 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001869 Py_DECREF(v);
1870 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001871 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001872 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001873 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001874
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001876 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001877 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001878 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001879 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001880 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881 break;
1882 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001883 u = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001884 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001885 w,
1886 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001887 f->f_locals == NULL ?
1888 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001889 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001890 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001891 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001892 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001893 x = NULL;
1894 break;
1895 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001896 x = PyEval_CallObject(x, w);
1897 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001898 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001899 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001900 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001901
Thomas Wouters52152252000-08-17 22:55:00 +00001902 case IMPORT_STAR:
1903 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001904 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001905 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001906 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001907 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001908 break;
1909 }
Thomas Wouters52152252000-08-17 22:55:00 +00001910 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001911 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001912 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001913 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001914 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001915
Thomas Wouters52152252000-08-17 22:55:00 +00001916 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001917 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001918 v = TOP();
1919 x = import_from(v, w);
1920 PUSH(x);
1921 if (x != NULL) continue;
1922 break;
1923
Guido van Rossum374a9221991-04-04 10:40:29 +00001924 case JUMP_FORWARD:
1925 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001926 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001927
Guido van Rossum374a9221991-04-04 10:40:29 +00001928 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001929 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001930 if (err > 0)
1931 err = 0;
1932 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001934 else
1935 break;
1936 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001937
Guido van Rossum374a9221991-04-04 10:40:29 +00001938 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001939 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001940 if (err > 0) {
1941 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001942 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001943 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001944 else if (err == 0)
1945 ;
1946 else
1947 break;
1948 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001949
Guido van Rossum374a9221991-04-04 10:40:29 +00001950 case JUMP_ABSOLUTE:
1951 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001952 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001953
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001954 case GET_ITER:
1955 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00001956 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001957 x = PyObject_GetIter(v);
1958 Py_DECREF(v);
1959 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001960 SET_TOP(x);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001961 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001962 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001963 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001964 break;
1965
1966 case FOR_ITER:
1967 /* before: [iter]; after: [iter, iter()] *or* [] */
1968 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001969 x = PyIter_Next(v);
1970 if (x != NULL) {
1971 PUSH(x);
1972 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001973 }
Tim Petersf4848da2001-05-05 00:14:56 +00001974 if (!PyErr_Occurred()) {
1975 /* iterator ended normally */
1976 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001977 Py_DECREF(v);
1978 JUMPBY(oparg);
1979 continue;
1980 }
1981 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001982
Guido van Rossum374a9221991-04-04 10:40:29 +00001983 case SETUP_LOOP:
1984 case SETUP_EXCEPT:
1985 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001986 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001987 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001988 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001989
Guido van Rossumf10570b1995-07-07 22:53:21 +00001990 case CALL_FUNCTION:
Jeremy Hyltone8c04322002-08-16 17:47:26 +00001991 x = call_function(&stack_pointer, oparg);
1992 PUSH(x);
1993 if (x != NULL)
1994 continue;
1995 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001996
Jeremy Hylton76901512000-03-28 23:49:17 +00001997 case CALL_FUNCTION_VAR:
1998 case CALL_FUNCTION_KW:
1999 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002000 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002001 int na = oparg & 0xff;
2002 int nk = (oparg>>8) & 0xff;
2003 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002004 int n = na + 2 * nk;
2005 PyObject **pfunc, *func;
2006 if (flags & CALL_FLAG_VAR)
2007 n++;
2008 if (flags & CALL_FLAG_KW)
2009 n++;
2010 pfunc = stack_pointer - n - 1;
2011 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002012
Guido van Rossumac7be682001-01-17 15:42:30 +00002013 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002014 && PyMethod_GET_SELF(func) != NULL) {
2015 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002016 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002017 func = PyMethod_GET_FUNCTION(func);
2018 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002019 Py_DECREF(*pfunc);
2020 *pfunc = self;
2021 na++;
2022 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002023 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002024 Py_INCREF(func);
2025 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002026 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002027
Jeremy Hylton76901512000-03-28 23:49:17 +00002028 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002029 w = POP();
2030 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002031 }
2032 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002033 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002034 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002035 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002036 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002037
Guido van Rossum681d79a1995-07-18 14:51:37 +00002038 case MAKE_FUNCTION:
2039 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 x = PyFunction_New(v, f->f_globals);
2041 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002042 /* XXX Maybe this should be a separate opcode? */
2043 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002045 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002046 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002047 x = NULL;
2048 break;
2049 }
2050 while (--oparg >= 0) {
2051 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002053 }
2054 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002055 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002056 }
2057 PUSH(x);
2058 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002059
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002060 case MAKE_CLOSURE:
2061 {
2062 int nfree;
2063 v = POP(); /* code object */
2064 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002065 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002066 Py_DECREF(v);
2067 /* XXX Maybe this should be a separate opcode? */
2068 if (x != NULL && nfree > 0) {
2069 v = PyTuple_New(nfree);
2070 if (v == NULL) {
2071 Py_DECREF(x);
2072 x = NULL;
2073 break;
2074 }
2075 while (--nfree >= 0) {
2076 w = POP();
2077 PyTuple_SET_ITEM(v, nfree, w);
2078 }
2079 err = PyFunction_SetClosure(x, v);
2080 Py_DECREF(v);
2081 }
2082 if (x != NULL && oparg > 0) {
2083 v = PyTuple_New(oparg);
2084 if (v == NULL) {
2085 Py_DECREF(x);
2086 x = NULL;
2087 break;
2088 }
2089 while (--oparg >= 0) {
2090 w = POP();
2091 PyTuple_SET_ITEM(v, oparg, w);
2092 }
2093 err = PyFunction_SetDefaults(x, v);
2094 Py_DECREF(v);
2095 }
2096 PUSH(x);
2097 break;
2098 }
2099
Guido van Rossum8861b741996-07-30 16:49:37 +00002100 case BUILD_SLICE:
2101 if (oparg == 3)
2102 w = POP();
2103 else
2104 w = NULL;
2105 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002106 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002107 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 Py_DECREF(u);
2109 Py_DECREF(v);
2110 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002111 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002112 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002113 break;
2114
Fred Drakeef8ace32000-08-24 00:32:09 +00002115 case EXTENDED_ARG:
2116 opcode = NEXTOP();
2117 oparg = oparg<<16 | NEXTARG();
2118 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002119
Guido van Rossum374a9221991-04-04 10:40:29 +00002120 default:
2121 fprintf(stderr,
2122 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002123 PyCode_Addr2Line(f->f_code, f->f_lasti),
2124 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002126 why = WHY_EXCEPTION;
2127 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002128
2129#ifdef CASE_TOO_BIG
2130 }
2131#endif
2132
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 } /* switch */
2134
2135 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002136
Guido van Rossum374a9221991-04-04 10:40:29 +00002137 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002138
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002140 if (err == 0 && x != NULL) {
2141#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002142 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002144 fprintf(stderr,
2145 "XXX undetected error\n");
2146 else
2147#endif
2148 continue; /* Normal, fast path */
2149 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002152 err = 0;
2153 }
2154
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002156
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002159 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002160 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 why = WHY_EXCEPTION;
2162 }
2163 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002164#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002166 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002168 fprintf(stderr,
2169 "XXX undetected error (why=%d)\n",
2170 why);
2171 why = WHY_EXCEPTION;
2172 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 }
2174#endif
2175
2176 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002177
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002180
Fred Drake8f51f542001-10-04 14:48:42 +00002181 if (tstate->c_tracefunc != NULL)
2182 call_exc_trace(tstate->c_tracefunc,
2183 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002184 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002185
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002187
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 if (why == WHY_RERAISE)
2189 why = WHY_EXCEPTION;
2190
2191 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002192
Tim Peters5ca576e2001-06-18 22:08:13 +00002193 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002194 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002195
2196 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2197 /* For a continue inside a try block,
2198 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002199 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2200 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002201 why = WHY_NOT;
2202 JUMPTO(PyInt_AS_LONG(retval));
2203 Py_DECREF(retval);
2204 break;
2205 }
2206
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 while (STACK_LEVEL() > b->b_level) {
2208 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 }
2211 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2212 why = WHY_NOT;
2213 JUMPTO(b->b_handler);
2214 break;
2215 }
2216 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002217 (b->b_type == SETUP_EXCEPT &&
2218 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002219 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002220 PyObject *exc, *val, *tb;
2221 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002222 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002223 val = Py_None;
2224 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002226 /* Make the raw exception data
2227 available to the handler,
2228 so a program can emulate the
2229 Python main loop. Don't do
2230 this for 'finally'. */
2231 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002232 PyErr_NormalizeException(
2233 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002234 set_exc_info(tstate,
2235 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002236 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002237 if (tb == NULL) {
2238 Py_INCREF(Py_None);
2239 PUSH(Py_None);
2240 } else
2241 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002242 PUSH(val);
2243 PUSH(exc);
2244 }
2245 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002246 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002247 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002249 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002250 PUSH(v);
2251 }
2252 why = WHY_NOT;
2253 JUMPTO(b->b_handler);
2254 break;
2255 }
2256 } /* unwind stack */
2257
2258 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002259
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 if (why != WHY_NOT)
2261 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002262
Guido van Rossum374a9221991-04-04 10:40:29 +00002263 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002264
Guido van Rossum35974fb2001-12-06 21:28:18 +00002265 if (why != WHY_YIELD) {
2266 /* Pop remaining stack entries -- but when yielding */
2267 while (!EMPTY()) {
2268 v = POP();
2269 Py_XDECREF(v);
2270 }
2271 }
2272
Tim Peters5ca576e2001-06-18 22:08:13 +00002273 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002274 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002275
Fred Drake9e3ad782001-07-03 23:39:52 +00002276 if (tstate->use_tracing) {
2277 if (tstate->c_tracefunc
2278 && (why == WHY_RETURN || why == WHY_YIELD)) {
2279 if (call_trace(tstate->c_tracefunc,
2280 tstate->c_traceobj, f,
2281 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002282 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002283 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002284 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002285 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002286 }
Fred Drake8f51f542001-10-04 14:48:42 +00002287 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002288 if (why == WHY_EXCEPTION)
2289 call_trace_protected(tstate->c_profilefunc,
2290 tstate->c_profileobj, f,
2291 PyTrace_RETURN);
2292 else if (call_trace(tstate->c_profilefunc,
2293 tstate->c_profileobj, f,
2294 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002295 Py_XDECREF(retval);
2296 retval = NULL;
2297 why = WHY_EXCEPTION;
2298 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002299 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002300 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002301
Guido van Rossuma027efa1997-05-05 20:56:21 +00002302 reset_exc_info(tstate);
2303
Tim Peters5ca576e2001-06-18 22:08:13 +00002304 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002305 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002306 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002307
Guido van Rossum96a42c81992-01-12 02:29:51 +00002308 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002309}
2310
Tim Peters6d6c1a32001-08-02 04:15:00 +00002311PyObject *
2312PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002313 PyObject **args, int argcount, PyObject **kws, int kwcount,
2314 PyObject **defs, int defcount, PyObject *closure)
2315{
2316 register PyFrameObject *f;
2317 register PyObject *retval = NULL;
2318 register PyObject **fastlocals, **freevars;
2319 PyThreadState *tstate = PyThreadState_GET();
2320 PyObject *x, *u;
2321
2322 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002323 PyErr_SetString(PyExc_SystemError,
2324 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002325 return NULL;
2326 }
2327
2328 f = PyFrame_New(tstate, /*back*/
2329 co, /*code*/
2330 globals, locals);
2331 if (f == NULL)
2332 return NULL;
2333
2334 fastlocals = f->f_localsplus;
2335 freevars = f->f_localsplus + f->f_nlocals;
2336
2337 if (co->co_argcount > 0 ||
2338 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2339 int i;
2340 int n = argcount;
2341 PyObject *kwdict = NULL;
2342 if (co->co_flags & CO_VARKEYWORDS) {
2343 kwdict = PyDict_New();
2344 if (kwdict == NULL)
2345 goto fail;
2346 i = co->co_argcount;
2347 if (co->co_flags & CO_VARARGS)
2348 i++;
2349 SETLOCAL(i, kwdict);
2350 }
2351 if (argcount > co->co_argcount) {
2352 if (!(co->co_flags & CO_VARARGS)) {
2353 PyErr_Format(PyExc_TypeError,
2354 "%.200s() takes %s %d "
2355 "%sargument%s (%d given)",
2356 PyString_AsString(co->co_name),
2357 defcount ? "at most" : "exactly",
2358 co->co_argcount,
2359 kwcount ? "non-keyword " : "",
2360 co->co_argcount == 1 ? "" : "s",
2361 argcount);
2362 goto fail;
2363 }
2364 n = co->co_argcount;
2365 }
2366 for (i = 0; i < n; i++) {
2367 x = args[i];
2368 Py_INCREF(x);
2369 SETLOCAL(i, x);
2370 }
2371 if (co->co_flags & CO_VARARGS) {
2372 u = PyTuple_New(argcount - n);
2373 if (u == NULL)
2374 goto fail;
2375 SETLOCAL(co->co_argcount, u);
2376 for (i = n; i < argcount; i++) {
2377 x = args[i];
2378 Py_INCREF(x);
2379 PyTuple_SET_ITEM(u, i-n, x);
2380 }
2381 }
2382 for (i = 0; i < kwcount; i++) {
2383 PyObject *keyword = kws[2*i];
2384 PyObject *value = kws[2*i + 1];
2385 int j;
2386 if (keyword == NULL || !PyString_Check(keyword)) {
2387 PyErr_Format(PyExc_TypeError,
2388 "%.200s() keywords must be strings",
2389 PyString_AsString(co->co_name));
2390 goto fail;
2391 }
2392 /* XXX slow -- speed up using dictionary? */
2393 for (j = 0; j < co->co_argcount; j++) {
2394 PyObject *nm = PyTuple_GET_ITEM(
2395 co->co_varnames, j);
2396 int cmp = PyObject_RichCompareBool(
2397 keyword, nm, Py_EQ);
2398 if (cmp > 0)
2399 break;
2400 else if (cmp < 0)
2401 goto fail;
2402 }
2403 /* Check errors from Compare */
2404 if (PyErr_Occurred())
2405 goto fail;
2406 if (j >= co->co_argcount) {
2407 if (kwdict == NULL) {
2408 PyErr_Format(PyExc_TypeError,
2409 "%.200s() got an unexpected "
2410 "keyword argument '%.400s'",
2411 PyString_AsString(co->co_name),
2412 PyString_AsString(keyword));
2413 goto fail;
2414 }
2415 PyDict_SetItem(kwdict, keyword, value);
2416 }
2417 else {
2418 if (GETLOCAL(j) != NULL) {
2419 PyErr_Format(PyExc_TypeError,
2420 "%.200s() got multiple "
2421 "values for keyword "
2422 "argument '%.400s'",
2423 PyString_AsString(co->co_name),
2424 PyString_AsString(keyword));
2425 goto fail;
2426 }
2427 Py_INCREF(value);
2428 SETLOCAL(j, value);
2429 }
2430 }
2431 if (argcount < co->co_argcount) {
2432 int m = co->co_argcount - defcount;
2433 for (i = argcount; i < m; i++) {
2434 if (GETLOCAL(i) == NULL) {
2435 PyErr_Format(PyExc_TypeError,
2436 "%.200s() takes %s %d "
2437 "%sargument%s (%d given)",
2438 PyString_AsString(co->co_name),
2439 ((co->co_flags & CO_VARARGS) ||
2440 defcount) ? "at least"
2441 : "exactly",
2442 m, kwcount ? "non-keyword " : "",
2443 m == 1 ? "" : "s", i);
2444 goto fail;
2445 }
2446 }
2447 if (n > m)
2448 i = n - m;
2449 else
2450 i = 0;
2451 for (; i < defcount; i++) {
2452 if (GETLOCAL(m+i) == NULL) {
2453 PyObject *def = defs[i];
2454 Py_INCREF(def);
2455 SETLOCAL(m+i, def);
2456 }
2457 }
2458 }
2459 }
2460 else {
2461 if (argcount > 0 || kwcount > 0) {
2462 PyErr_Format(PyExc_TypeError,
2463 "%.200s() takes no arguments (%d given)",
2464 PyString_AsString(co->co_name),
2465 argcount + kwcount);
2466 goto fail;
2467 }
2468 }
2469 /* Allocate and initialize storage for cell vars, and copy free
2470 vars into frame. This isn't too efficient right now. */
2471 if (f->f_ncells) {
2472 int i = 0, j = 0, nargs, found;
2473 char *cellname, *argname;
2474 PyObject *c;
2475
2476 nargs = co->co_argcount;
2477 if (co->co_flags & CO_VARARGS)
2478 nargs++;
2479 if (co->co_flags & CO_VARKEYWORDS)
2480 nargs++;
2481
2482 /* Check for cells that shadow args */
2483 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2484 cellname = PyString_AS_STRING(
2485 PyTuple_GET_ITEM(co->co_cellvars, i));
2486 found = 0;
2487 while (j < nargs) {
2488 argname = PyString_AS_STRING(
2489 PyTuple_GET_ITEM(co->co_varnames, j));
2490 if (strcmp(cellname, argname) == 0) {
2491 c = PyCell_New(GETLOCAL(j));
2492 if (c == NULL)
2493 goto fail;
2494 GETLOCAL(f->f_nlocals + i) = c;
2495 found = 1;
2496 break;
2497 }
2498 j++;
2499 }
2500 if (found == 0) {
2501 c = PyCell_New(NULL);
2502 if (c == NULL)
2503 goto fail;
2504 SETLOCAL(f->f_nlocals + i, c);
2505 }
2506 }
2507 /* Initialize any that are left */
2508 while (i < f->f_ncells) {
2509 c = PyCell_New(NULL);
2510 if (c == NULL)
2511 goto fail;
2512 SETLOCAL(f->f_nlocals + i, c);
2513 i++;
2514 }
2515 }
2516 if (f->f_nfreevars) {
2517 int i;
2518 for (i = 0; i < f->f_nfreevars; ++i) {
2519 PyObject *o = PyTuple_GET_ITEM(closure, i);
2520 Py_INCREF(o);
2521 freevars[f->f_ncells + i] = o;
2522 }
2523 }
2524
Tim Peters5ca576e2001-06-18 22:08:13 +00002525 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002526 /* Don't need to keep the reference to f_back, it will be set
2527 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002528 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002529 f->f_back = NULL;
2530
2531 /* Create a new generator that owns the ready to run frame
2532 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002533 return gen_new(f);
2534 }
2535
2536 retval = eval_frame(f);
2537
2538 fail: /* Jump here from prelude on failure */
2539
Tim Petersb13680b2001-11-27 23:29:29 +00002540 /* decref'ing the frame can cause __del__ methods to get invoked,
2541 which can call back into Python. While we're done with the
2542 current Python frame (f), the associated C stack is still in use,
2543 so recursion_depth must be boosted for the duration.
2544 */
2545 assert(tstate != NULL);
2546 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002547 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002548 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002549 return retval;
2550}
2551
2552
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002554set_exc_info(PyThreadState *tstate,
2555 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002556{
2557 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002558 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002559
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 frame = tstate->frame;
2561 if (frame->f_exc_type == NULL) {
2562 /* This frame didn't catch an exception before */
2563 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002564 if (tstate->exc_type == NULL) {
2565 Py_INCREF(Py_None);
2566 tstate->exc_type = Py_None;
2567 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002568 tmp_type = frame->f_exc_type;
2569 tmp_value = frame->f_exc_value;
2570 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002571 Py_XINCREF(tstate->exc_type);
2572 Py_XINCREF(tstate->exc_value);
2573 Py_XINCREF(tstate->exc_traceback);
2574 frame->f_exc_type = tstate->exc_type;
2575 frame->f_exc_value = tstate->exc_value;
2576 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002577 Py_XDECREF(tmp_type);
2578 Py_XDECREF(tmp_value);
2579 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002580 }
2581 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002582 tmp_type = tstate->exc_type;
2583 tmp_value = tstate->exc_value;
2584 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002585 Py_XINCREF(type);
2586 Py_XINCREF(value);
2587 Py_XINCREF(tb);
2588 tstate->exc_type = type;
2589 tstate->exc_value = value;
2590 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002591 Py_XDECREF(tmp_type);
2592 Py_XDECREF(tmp_value);
2593 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594 /* For b/w compatibility */
2595 PySys_SetObject("exc_type", type);
2596 PySys_SetObject("exc_value", value);
2597 PySys_SetObject("exc_traceback", tb);
2598}
2599
2600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002601reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002602{
2603 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002604 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605 frame = tstate->frame;
2606 if (frame->f_exc_type != NULL) {
2607 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002608 tmp_type = tstate->exc_type;
2609 tmp_value = tstate->exc_value;
2610 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 Py_XINCREF(frame->f_exc_type);
2612 Py_XINCREF(frame->f_exc_value);
2613 Py_XINCREF(frame->f_exc_traceback);
2614 tstate->exc_type = frame->f_exc_type;
2615 tstate->exc_value = frame->f_exc_value;
2616 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002617 Py_XDECREF(tmp_type);
2618 Py_XDECREF(tmp_value);
2619 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002620 /* For b/w compatibility */
2621 PySys_SetObject("exc_type", frame->f_exc_type);
2622 PySys_SetObject("exc_value", frame->f_exc_value);
2623 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2624 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002625 tmp_type = frame->f_exc_type;
2626 tmp_value = frame->f_exc_value;
2627 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002628 frame->f_exc_type = NULL;
2629 frame->f_exc_value = NULL;
2630 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 Py_XDECREF(tmp_type);
2632 Py_XDECREF(tmp_value);
2633 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634}
2635
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002636/* Logic for the raise statement (too complicated for inlining).
2637 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002638static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002639do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002640{
Guido van Rossumd295f121998-04-09 21:39:57 +00002641 if (type == NULL) {
2642 /* Reraise */
2643 PyThreadState *tstate = PyThreadState_Get();
2644 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2645 value = tstate->exc_value;
2646 tb = tstate->exc_traceback;
2647 Py_XINCREF(type);
2648 Py_XINCREF(value);
2649 Py_XINCREF(tb);
2650 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002651
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002652 /* We support the following forms of raise:
2653 raise <class>, <classinstance>
2654 raise <class>, <argument tuple>
2655 raise <class>, None
2656 raise <class>, <argument>
2657 raise <classinstance>, None
2658 raise <string>, <object>
2659 raise <string>, None
2660
2661 An omitted second argument is the same as None.
2662
2663 In addition, raise <tuple>, <anything> is the same as
2664 raising the tuple's first item (and it better have one!);
2665 this rule is applied recursively.
2666
2667 Finally, an optional third argument can be supplied, which
2668 gives the traceback to be substituted (useful when
2669 re-raising an exception after examining it). */
2670
2671 /* First, check the traceback argument, replacing None with
2672 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 if (tb == Py_None) {
2674 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002675 tb = NULL;
2676 }
2677 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002679 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002680 goto raise_error;
2681 }
2682
2683 /* Next, replace a missing value with None */
2684 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 value = Py_None;
2686 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002687 }
2688
2689 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2691 PyObject *tmp = type;
2692 type = PyTuple_GET_ITEM(type, 0);
2693 Py_INCREF(type);
2694 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002695 }
2696
Tim Petersafb2c802002-04-18 18:06:20 +00002697 if (PyString_CheckExact(type))
2698 /* Raising builtin string is deprecated but still allowed --
2699 * do nothing. Raising an instance of a new-style str
2700 * subclass is right out. */
Neal Norwitz37aa0662003-01-10 15:31:15 +00002701 PyErr_Warn(PyExc_PendingDeprecationWarning,
2702 "raising a string exception is deprecated");
Barry Warsaw4249f541997-08-22 21:26:19 +00002703
2704 else if (PyClass_Check(type))
2705 PyErr_NormalizeException(&type, &value, &tb);
2706
Guido van Rossumb209a111997-04-29 18:18:01 +00002707 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002708 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 if (value != Py_None) {
2710 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002711 "instance exception may not have a separate value");
2712 goto raise_error;
2713 }
2714 else {
2715 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002717 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2719 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002720 }
2721 }
2722 else {
2723 /* Not something you can raise. You get an exception
2724 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002725 PyErr_Format(PyExc_TypeError,
Neal Norwitz37aa0662003-01-10 15:31:15 +00002726 "exceptions must be classes, instances, or "
2727 "strings (deprecated), not %s",
2728 type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002729 goto raise_error;
2730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002732 if (tb == NULL)
2733 return WHY_EXCEPTION;
2734 else
2735 return WHY_RERAISE;
2736 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 Py_XDECREF(value);
2738 Py_XDECREF(type);
2739 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002740 return WHY_EXCEPTION;
2741}
2742
Tim Petersd6d010b2001-06-21 02:49:55 +00002743/* Iterate v argcnt times and store the results on the stack (via decreasing
2744 sp). Return 1 for success, 0 if error. */
2745
Barry Warsawe42b18f1997-08-25 22:13:04 +00002746static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002747unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002748{
Tim Petersd6d010b2001-06-21 02:49:55 +00002749 int i = 0;
2750 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002751 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002752
Tim Petersd6d010b2001-06-21 02:49:55 +00002753 assert(v != NULL);
2754
2755 it = PyObject_GetIter(v);
2756 if (it == NULL)
2757 goto Error;
2758
2759 for (; i < argcnt; i++) {
2760 w = PyIter_Next(it);
2761 if (w == NULL) {
2762 /* Iterator done, via error or exhaustion. */
2763 if (!PyErr_Occurred()) {
2764 PyErr_Format(PyExc_ValueError,
2765 "need more than %d value%s to unpack",
2766 i, i == 1 ? "" : "s");
2767 }
2768 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002769 }
2770 *--sp = w;
2771 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002772
2773 /* We better have exhausted the iterator now. */
2774 w = PyIter_Next(it);
2775 if (w == NULL) {
2776 if (PyErr_Occurred())
2777 goto Error;
2778 Py_DECREF(it);
2779 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002780 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002781 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002782 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002783 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002784Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002785 for (; i > 0; i--, sp++)
2786 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002787 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002788 return 0;
2789}
2790
2791
Guido van Rossum96a42c81992-01-12 02:29:51 +00002792#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002796 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 if (PyObject_Print(v, stdout, 0) != 0)
2798 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002799 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002800 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002802#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804static void
Fred Drake5755ce62001-06-27 19:19:46 +00002805call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002806{
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002810 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 value = Py_None;
2812 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002813 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002815 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002817 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002818 }
Fred Drake5755ce62001-06-27 19:19:46 +00002819 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 Py_XDECREF(type);
2825 Py_XDECREF(value);
2826 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002828}
2829
Fred Drake4ec5d562001-10-04 19:26:43 +00002830static void
2831call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2832 int what)
2833{
2834 PyObject *type, *value, *traceback;
2835 int err;
2836 PyErr_Fetch(&type, &value, &traceback);
2837 err = call_trace(func, obj, frame, what, NULL);
2838 if (err == 0)
2839 PyErr_Restore(type, value, traceback);
2840 else {
2841 Py_XDECREF(type);
2842 Py_XDECREF(value);
2843 Py_XDECREF(traceback);
2844 }
2845}
2846
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002847static int
Fred Drake5755ce62001-06-27 19:19:46 +00002848call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2849 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002850{
Fred Drake5755ce62001-06-27 19:19:46 +00002851 register PyThreadState *tstate = frame->f_tstate;
2852 int result;
2853 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002854 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002855 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002856 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002857 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002858 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2859 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002860 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002861 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002862}
2863
Michael W. Hudson006c7522002-11-08 13:08:46 +00002864static int
Michael W. Hudson019a78e2002-11-08 12:53:11 +00002865maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002866 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2867{
2868 /* The theory of SET_LINENO-less tracing.
2869
2870 In a nutshell, we use the co_lnotab field of the code object
2871 to tell when execution has moved onto a different line.
2872
2873 As mentioned above, the basic idea is so set things up so
2874 that
2875
2876 *instr_lb <= frame->f_lasti < *instr_ub
2877
2878 is true so long as execution does not change lines.
2879
2880 This is all fairly simple. Digging the information out of
2881 co_lnotab takes some work, but is conceptually clear.
2882
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002883 Somewhat harder to explain is why we don't *always* call the
2884 line trace function when the above test fails.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002885
2886 Consider this code:
2887
2888 1: def f(a):
2889 2: if a:
2890 3: print 1
2891 4: else:
2892 5: print 2
2893
2894 which compiles to this:
2895
2896 2 0 LOAD_FAST 0 (a)
2897 3 JUMP_IF_FALSE 9 (to 15)
2898 6 POP_TOP
2899
2900 3 7 LOAD_CONST 1 (1)
2901 10 PRINT_ITEM
2902 11 PRINT_NEWLINE
2903 12 JUMP_FORWARD 6 (to 21)
2904 >> 15 POP_TOP
2905
2906 5 16 LOAD_CONST 2 (2)
2907 19 PRINT_ITEM
2908 20 PRINT_NEWLINE
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002909 >> 21 LOAD_CONST 0 (None)
2910 24 RETURN_VALUE
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002911
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002912 If 'a' is false, execution will jump to instruction at offset
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002913 15 and the co_lnotab will claim that execution has moved to
2914 line 3. This is at best misleading. In this case we could
2915 associate the POP_TOP with line 4, but that doesn't make
2916 sense in all cases (I think).
2917
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002918 What we do is only call the line trace function if the co_lnotab
2919 indicates we have jumped to the *start* of a line, i.e. if the
2920 current instruction offset matches the offset given for the
2921 start of a line by the co_lnotab.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002922
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002923 This also takes care of the situation where 'a' is true.
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002924 Execution will jump from instruction offset 12 to offset 21.
2925 Then the co_lnotab would imply that execution has moved to line
2926 5, which is again misleading.
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002927
2928 Why do we set f_lineno when tracing? Well, consider the code
2929 above when 'a' is true. If stepping through this with 'n' in
2930 pdb, you would stop at line 1 with a "call" type event, then
2931 line events on lines 2 and 3, then a "return" type event -- but
2932 you would be shown line 5 during this event. This is a change
2933 from the behaviour in 2.2 and before, and I've found it
2934 confusing in practice. By setting and using f_lineno when
2935 tracing, one can report a line number different from that
2936 suggested by f_lasti on this one occasion where it's desirable.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002937 */
2938
Michael W. Hudson006c7522002-11-08 13:08:46 +00002939 int result = 0;
2940
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002941 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002942 PyCodeObject* co = frame->f_code;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002943 int size, addr, line;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002944 unsigned char* p;
2945
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002946 size = PyString_GET_SIZE(co->co_lnotab) / 2;
2947 p = (unsigned char*)PyString_AS_STRING(co->co_lnotab);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002948
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002949 addr = 0;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002950 line = co->co_firstlineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002951
2952 /* possible optimization: if f->f_lasti == instr_ub
2953 (likely to be a common case) then we already know
2954 instr_lb -- if we stored the matching value of p
2955 somwhere we could skip the first while loop. */
2956
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002957 /* see comments in compile.c for the description of
2958 co_lnotab. A point to remember: increments to p
2959 should come in pairs -- although we don't care about
2960 the line increments here, treating them as byte
2961 increments gets confusing, to say the least. */
2962
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002963 while (size > 0) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002964 if (addr + *p > frame->f_lasti)
2965 break;
2966 addr += *p++;
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002967 if (*p) *instr_lb = addr;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002968 line += *p++;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002969 --size;
2970 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002971
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002972 if (addr == frame->f_lasti) {
2973 frame->f_lineno = line;
Michael W. Hudson006c7522002-11-08 13:08:46 +00002974 result = call_trace(func, obj, frame,
2975 PyTrace_LINE, Py_None);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002976 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002977
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002978 if (size > 0) {
2979 while (--size >= 0) {
2980 addr += *p++;
2981 if (*p++)
2982 break;
2983 }
2984 *instr_ub = addr;
2985 }
2986 else {
2987 *instr_ub = INT_MAX;
2988 }
2989 }
Michael W. Hudson006c7522002-11-08 13:08:46 +00002990
2991 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002992}
2993
Fred Drake5755ce62001-06-27 19:19:46 +00002994void
2995PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002996{
Fred Drake5755ce62001-06-27 19:19:46 +00002997 PyThreadState *tstate = PyThreadState_Get();
2998 PyObject *temp = tstate->c_profileobj;
2999 Py_XINCREF(arg);
3000 tstate->c_profilefunc = NULL;
3001 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003002 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003003 Py_XDECREF(temp);
3004 tstate->c_profilefunc = func;
3005 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003006 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003007}
3008
3009void
3010PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3011{
3012 PyThreadState *tstate = PyThreadState_Get();
3013 PyObject *temp = tstate->c_traceobj;
3014 Py_XINCREF(arg);
3015 tstate->c_tracefunc = NULL;
3016 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003017 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003018 Py_XDECREF(temp);
3019 tstate->c_tracefunc = func;
3020 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003021 tstate->use_tracing = ((func != NULL)
3022 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003023}
3024
Guido van Rossumb209a111997-04-29 18:18:01 +00003025PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003026PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003027{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003028 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003029 if (current_frame == NULL)
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003030 return PyThreadState_Get()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003031 else
3032 return current_frame->f_builtins;
3033}
3034
Guido van Rossumb209a111997-04-29 18:18:01 +00003035PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003036PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003037{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003038 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003039 if (current_frame == NULL)
3040 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003041 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003042 return current_frame->f_locals;
3043}
3044
Guido van Rossumb209a111997-04-29 18:18:01 +00003045PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003046PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003047{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003048 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003049 if (current_frame == NULL)
3050 return NULL;
3051 else
3052 return current_frame->f_globals;
3053}
3054
Guido van Rossumb209a111997-04-29 18:18:01 +00003055PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003056PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003057{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003058 PyThreadState *tstate = PyThreadState_Get();
3059 return _PyThreadState_GetFrame((PyObject *)tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003060}
3061
Guido van Rossum6135a871995-01-09 17:53:26 +00003062int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003063PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003064{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003065 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003066 return current_frame == NULL ? 0 : current_frame->f_restricted;
3067}
3068
Guido van Rossumbe270261997-05-22 22:26:18 +00003069int
Tim Peters5ba58662001-07-16 02:29:45 +00003070PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003071{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003072 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Tim Peters5ba58662001-07-16 02:29:45 +00003073 int result = 0;
3074
3075 if (current_frame != NULL) {
3076 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003077 const int compilerflags = codeflags & PyCF_MASK;
3078 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003079 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003080 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003081 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003082#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003083 if (codeflags & CO_GENERATOR_ALLOWED) {
3084 result = 1;
3085 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3086 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003087#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003088 }
3089 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003090}
3091
3092int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003093Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094{
Guido van Rossumb209a111997-04-29 18:18:01 +00003095 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003096 if (f == NULL)
3097 return 0;
3098 if (!PyFile_SoftSpace(f, 0))
3099 return 0;
3100 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101}
3102
Guido van Rossum3f5da241990-12-20 15:06:42 +00003103
Guido van Rossum681d79a1995-07-18 14:51:37 +00003104/* External interface to call any callable object.
3105 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003106
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003107#undef PyEval_CallObject
3108/* for backward compatibility: export this interface */
3109
Guido van Rossumb209a111997-04-29 18:18:01 +00003110PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003111PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003112{
Guido van Rossumb209a111997-04-29 18:18:01 +00003113 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003114}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003115#define PyEval_CallObject(func,arg) \
3116 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003117
Guido van Rossumb209a111997-04-29 18:18:01 +00003118PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003119PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003120{
Jeremy Hylton52820442001-01-03 23:52:36 +00003121 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003122
3123 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003124 arg = PyTuple_New(0);
3125 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003126 PyErr_SetString(PyExc_TypeError,
3127 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003128 return NULL;
3129 }
3130 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003131 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003132
Guido van Rossumb209a111997-04-29 18:18:01 +00003133 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003134 PyErr_SetString(PyExc_TypeError,
3135 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003136 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003137 return NULL;
3138 }
3139
Tim Peters6d6c1a32001-08-02 04:15:00 +00003140 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003141 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003142 return result;
3143}
3144
Tim Peters6d6c1a32001-08-02 04:15:00 +00003145char *
3146PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003147{
3148 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003149 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003150 else if (PyFunction_Check(func))
3151 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3152 else if (PyCFunction_Check(func))
3153 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3154 else if (PyClass_Check(func))
3155 return PyString_AsString(((PyClassObject*)func)->cl_name);
3156 else if (PyInstance_Check(func)) {
3157 return PyString_AsString(
3158 ((PyInstanceObject*)func)->in_class->cl_name);
3159 } else {
3160 return func->ob_type->tp_name;
3161 }
3162}
3163
Tim Peters6d6c1a32001-08-02 04:15:00 +00003164char *
3165PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003166{
3167 if (PyMethod_Check(func))
3168 return "()";
3169 else if (PyFunction_Check(func))
3170 return "()";
3171 else if (PyCFunction_Check(func))
3172 return "()";
3173 else if (PyClass_Check(func))
3174 return " constructor";
3175 else if (PyInstance_Check(func)) {
3176 return " instance";
3177 } else {
3178 return " object";
3179 }
3180}
3181
Jeremy Hylton52820442001-01-03 23:52:36 +00003182#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3183
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003184static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003185err_args(PyObject *func, int flags, int nargs)
3186{
3187 if (flags & METH_NOARGS)
3188 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003189 "%.200s() takes no arguments (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003190 ((PyCFunctionObject *)func)->m_ml->ml_name,
3191 nargs);
3192 else
3193 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003194 "%.200s() takes exactly one argument (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003195 ((PyCFunctionObject *)func)->m_ml->ml_name,
3196 nargs);
3197}
3198
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003199static PyObject *
3200call_function(PyObject ***pp_stack, int oparg)
3201{
3202 int na = oparg & 0xff;
3203 int nk = (oparg>>8) & 0xff;
3204 int n = na + 2 * nk;
3205 PyObject **pfunc = (*pp_stack) - n - 1;
3206 PyObject *func = *pfunc;
3207 PyObject *x, *w;
3208
3209 /* Always dispatch PyCFunction first, because
3210 these are presumed to be the most frequent
3211 callable object.
3212 */
3213 if (PyCFunction_Check(func) && nk == 0) {
3214 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003215 if (flags & (METH_NOARGS | METH_O)) {
3216 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3217 PyObject *self = PyCFunction_GET_SELF(func);
3218 if (flags & METH_NOARGS && na == 0)
3219 x = (*meth)(self, NULL);
3220 else if (flags & METH_O && na == 1) {
3221 PyObject *arg = EXT_POP(*pp_stack);
3222 x = (*meth)(self, arg);
3223 Py_DECREF(arg);
3224 }
3225 else {
3226 err_args(func, flags, na);
3227 x = NULL;
3228 }
3229 }
3230 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003231 PyObject *callargs;
3232 callargs = load_args(pp_stack, na);
3233 x = PyCFunction_Call(func, callargs, NULL);
3234 Py_XDECREF(callargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003235 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003236 } else {
3237 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3238 /* optimize access to bound methods */
3239 PyObject *self = PyMethod_GET_SELF(func);
3240 Py_INCREF(self);
3241 func = PyMethod_GET_FUNCTION(func);
3242 Py_INCREF(func);
3243 Py_DECREF(*pfunc);
3244 *pfunc = self;
3245 na++;
3246 n++;
3247 } else
3248 Py_INCREF(func);
3249 if (PyFunction_Check(func))
3250 x = fast_function(func, pp_stack, n, na, nk);
3251 else
3252 x = do_call(func, pp_stack, na, nk);
3253 Py_DECREF(func);
3254 }
3255
3256 while ((*pp_stack) > pfunc) {
3257 w = EXT_POP(*pp_stack);
3258 Py_DECREF(w);
3259 }
3260 return x;
3261}
3262
Jeremy Hylton192690e2002-08-16 18:36:11 +00003263/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003264 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton52820442001-01-03 23:52:36 +00003265*/
3266
3267static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003268fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003269{
3270 PyObject *co = PyFunction_GET_CODE(func);
3271 PyObject *globals = PyFunction_GET_GLOBALS(func);
3272 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003273 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003274 PyObject **d = NULL;
3275 int nd = 0;
3276
3277 if (argdefs != NULL) {
3278 d = &PyTuple_GET_ITEM(argdefs, 0);
3279 nd = ((PyTupleObject *)argdefs)->ob_size;
3280 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003281 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003282 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003283 (*pp_stack)-2*nk, nk, d, nd,
3284 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003285}
3286
3287static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003288update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3289 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003290{
3291 PyObject *kwdict = NULL;
3292 if (orig_kwdict == NULL)
3293 kwdict = PyDict_New();
3294 else {
3295 kwdict = PyDict_Copy(orig_kwdict);
3296 Py_DECREF(orig_kwdict);
3297 }
3298 if (kwdict == NULL)
3299 return NULL;
3300 while (--nk >= 0) {
3301 int err;
3302 PyObject *value = EXT_POP(*pp_stack);
3303 PyObject *key = EXT_POP(*pp_stack);
3304 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003305 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003306 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003307 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003308 PyEval_GetFuncName(func),
3309 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003310 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003311 Py_DECREF(key);
3312 Py_DECREF(value);
3313 Py_DECREF(kwdict);
3314 return NULL;
3315 }
3316 err = PyDict_SetItem(kwdict, key, value);
3317 Py_DECREF(key);
3318 Py_DECREF(value);
3319 if (err) {
3320 Py_DECREF(kwdict);
3321 return NULL;
3322 }
3323 }
3324 return kwdict;
3325}
3326
3327static PyObject *
3328update_star_args(int nstack, int nstar, PyObject *stararg,
3329 PyObject ***pp_stack)
3330{
3331 PyObject *callargs, *w;
3332
3333 callargs = PyTuple_New(nstack + nstar);
3334 if (callargs == NULL) {
3335 return NULL;
3336 }
3337 if (nstar) {
3338 int i;
3339 for (i = 0; i < nstar; i++) {
3340 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3341 Py_INCREF(a);
3342 PyTuple_SET_ITEM(callargs, nstack + i, a);
3343 }
3344 }
3345 while (--nstack >= 0) {
3346 w = EXT_POP(*pp_stack);
3347 PyTuple_SET_ITEM(callargs, nstack, w);
3348 }
3349 return callargs;
3350}
3351
3352static PyObject *
3353load_args(PyObject ***pp_stack, int na)
3354{
3355 PyObject *args = PyTuple_New(na);
3356 PyObject *w;
3357
3358 if (args == NULL)
3359 return NULL;
3360 while (--na >= 0) {
3361 w = EXT_POP(*pp_stack);
3362 PyTuple_SET_ITEM(args, na, w);
3363 }
3364 return args;
3365}
3366
3367static PyObject *
3368do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3369{
3370 PyObject *callargs = NULL;
3371 PyObject *kwdict = NULL;
3372 PyObject *result = NULL;
3373
3374 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003375 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003376 if (kwdict == NULL)
3377 goto call_fail;
3378 }
3379 callargs = load_args(pp_stack, na);
3380 if (callargs == NULL)
3381 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003382 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003383 call_fail:
3384 Py_XDECREF(callargs);
3385 Py_XDECREF(kwdict);
3386 return result;
3387}
3388
3389static PyObject *
3390ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3391{
3392 int nstar = 0;
3393 PyObject *callargs = NULL;
3394 PyObject *stararg = NULL;
3395 PyObject *kwdict = NULL;
3396 PyObject *result = NULL;
3397
3398 if (flags & CALL_FLAG_KW) {
3399 kwdict = EXT_POP(*pp_stack);
3400 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003401 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003402 "%s%s argument after ** "
3403 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003404 PyEval_GetFuncName(func),
3405 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003406 goto ext_call_fail;
3407 }
3408 }
3409 if (flags & CALL_FLAG_VAR) {
3410 stararg = EXT_POP(*pp_stack);
3411 if (!PyTuple_Check(stararg)) {
3412 PyObject *t = NULL;
3413 t = PySequence_Tuple(stararg);
3414 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003415 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3416 PyErr_Format(PyExc_TypeError,
3417 "%s%s argument after * "
3418 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003419 PyEval_GetFuncName(func),
3420 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003421 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003422 goto ext_call_fail;
3423 }
3424 Py_DECREF(stararg);
3425 stararg = t;
3426 }
3427 nstar = PyTuple_GET_SIZE(stararg);
3428 }
3429 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003430 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003431 if (kwdict == NULL)
3432 goto ext_call_fail;
3433 }
3434 callargs = update_star_args(na, nstar, stararg, pp_stack);
3435 if (callargs == NULL)
3436 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003437 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003438 ext_call_fail:
3439 Py_XDECREF(callargs);
3440 Py_XDECREF(kwdict);
3441 Py_XDECREF(stararg);
3442 return result;
3443}
3444
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003445#define SLICE_ERROR_MSG \
3446 "standard sequence type does not support step size other than one"
3447
Tim Peterscb479e72001-12-16 19:11:44 +00003448/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3449 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3450 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3451*/
Tim Petersb5196382001-12-16 19:44:20 +00003452/* Note: If v is NULL, return success without storing into *pi. This
3453 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3454 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003455*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003456int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003457_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458{
Tim Petersb5196382001-12-16 19:44:20 +00003459 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003460 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003461 if (PyInt_Check(v)) {
3462 x = PyInt_AsLong(v);
3463 } else if (PyLong_Check(v)) {
3464 x = PyLong_AsLong(v);
3465 if (x==-1 && PyErr_Occurred()) {
3466 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003467 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003468
Guido van Rossumac7be682001-01-17 15:42:30 +00003469 if (!PyErr_ExceptionMatches(
3470 PyExc_OverflowError)) {
3471 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003472 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003473 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003474 }
3475
Guido van Rossumac7be682001-01-17 15:42:30 +00003476 /* Clear the OverflowError */
3477 PyErr_Clear();
3478
3479 /* It's an overflow error, so we need to
3480 check the sign of the long integer,
3481 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003482 the error. */
3483
3484 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003485 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003486 if (long_zero == NULL)
3487 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003488
3489 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003490 cmp = PyObject_RichCompareBool(v, long_zero,
3491 Py_GT);
3492 Py_DECREF(long_zero);
3493 if (cmp < 0)
3494 return 0;
3495 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003496 x = INT_MAX;
3497 else
3498 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003499 }
3500 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003501 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003502 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003503 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003505 /* Truncate -- very long indices are truncated anyway */
3506 if (x > INT_MAX)
3507 x = INT_MAX;
3508 else if (x < -INT_MAX)
Michael W. Hudsoncbd6fb92002-11-06 15:17:32 +00003509 x = -INT_MAX;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003510 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003512 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003513}
3514
Guido van Rossum50d756e2001-08-18 17:43:36 +00003515#undef ISINT
3516#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3517
Guido van Rossumb209a111997-04-29 18:18:01 +00003518static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003519apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003521 PyTypeObject *tp = u->ob_type;
3522 PySequenceMethods *sq = tp->tp_as_sequence;
3523
3524 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3525 int ilow = 0, ihigh = INT_MAX;
3526 if (!_PyEval_SliceIndex(v, &ilow))
3527 return NULL;
3528 if (!_PyEval_SliceIndex(w, &ihigh))
3529 return NULL;
3530 return PySequence_GetSlice(u, ilow, ihigh);
3531 }
3532 else {
3533 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003534 if (slice != NULL) {
3535 PyObject *res = PyObject_GetItem(u, slice);
3536 Py_DECREF(slice);
3537 return res;
3538 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003539 else
3540 return NULL;
3541 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003543
3544static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003545assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3546 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003548 PyTypeObject *tp = u->ob_type;
3549 PySequenceMethods *sq = tp->tp_as_sequence;
3550
3551 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3552 int ilow = 0, ihigh = INT_MAX;
3553 if (!_PyEval_SliceIndex(v, &ilow))
3554 return -1;
3555 if (!_PyEval_SliceIndex(w, &ihigh))
3556 return -1;
3557 if (x == NULL)
3558 return PySequence_DelSlice(u, ilow, ihigh);
3559 else
3560 return PySequence_SetSlice(u, ilow, ihigh, x);
3561 }
3562 else {
3563 PyObject *slice = PySlice_New(v, w, NULL);
3564 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003565 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003566 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003567 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003568 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003569 res = PyObject_DelItem(u, slice);
3570 Py_DECREF(slice);
3571 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003572 }
3573 else
3574 return -1;
3575 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576}
3577
Guido van Rossumb209a111997-04-29 18:18:01 +00003578static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003579cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003580{
Guido van Rossumac7be682001-01-17 15:42:30 +00003581 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003582 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003583 case PyCmp_IS:
3584 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003585 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003586 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003587 res = !res;
3588 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003589 case PyCmp_IN:
3590 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003591 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003592 if (res < 0)
3593 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003594 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003595 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003597 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003598 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003599 break;
3600 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003601 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003603 v = res ? Py_True : Py_False;
3604 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003605 return v;
3606}
3607
Thomas Wouters52152252000-08-17 22:55:00 +00003608static PyObject *
3609import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003610{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003611 PyObject *x;
3612
3613 x = PyObject_GetAttr(v, name);
3614 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003615 PyErr_Format(PyExc_ImportError,
3616 "cannot import name %.230s",
3617 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003618 }
Thomas Wouters52152252000-08-17 22:55:00 +00003619 return x;
3620}
Guido van Rossumac7be682001-01-17 15:42:30 +00003621
Thomas Wouters52152252000-08-17 22:55:00 +00003622static int
3623import_all_from(PyObject *locals, PyObject *v)
3624{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003625 PyObject *all = PyObject_GetAttrString(v, "__all__");
3626 PyObject *dict, *name, *value;
3627 int skip_leading_underscores = 0;
3628 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003629
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003630 if (all == NULL) {
3631 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3632 return -1; /* Unexpected error */
3633 PyErr_Clear();
3634 dict = PyObject_GetAttrString(v, "__dict__");
3635 if (dict == NULL) {
3636 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3637 return -1;
3638 PyErr_SetString(PyExc_ImportError,
3639 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003640 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003641 }
3642 all = PyMapping_Keys(dict);
3643 Py_DECREF(dict);
3644 if (all == NULL)
3645 return -1;
3646 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003647 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003648
3649 for (pos = 0, err = 0; ; pos++) {
3650 name = PySequence_GetItem(all, pos);
3651 if (name == NULL) {
3652 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3653 err = -1;
3654 else
3655 PyErr_Clear();
3656 break;
3657 }
3658 if (skip_leading_underscores &&
3659 PyString_Check(name) &&
3660 PyString_AS_STRING(name)[0] == '_')
3661 {
3662 Py_DECREF(name);
3663 continue;
3664 }
3665 value = PyObject_GetAttr(v, name);
3666 if (value == NULL)
3667 err = -1;
3668 else
3669 err = PyDict_SetItem(locals, name, value);
3670 Py_DECREF(name);
3671 Py_XDECREF(value);
3672 if (err != 0)
3673 break;
3674 }
3675 Py_DECREF(all);
3676 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003677}
3678
Guido van Rossumb209a111997-04-29 18:18:01 +00003679static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003680build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003681{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003682 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003683
3684 if (PyDict_Check(methods))
3685 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003686 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003687 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003688 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3689 base = PyTuple_GET_ITEM(bases, 0);
3690 metaclass = PyObject_GetAttrString(base, "__class__");
3691 if (metaclass == NULL) {
3692 PyErr_Clear();
3693 metaclass = (PyObject *)base->ob_type;
3694 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003695 }
3696 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003697 else {
3698 PyObject *g = PyEval_GetGlobals();
3699 if (g != NULL && PyDict_Check(g))
3700 metaclass = PyDict_GetItemString(g, "__metaclass__");
3701 if (metaclass == NULL)
3702 metaclass = (PyObject *) &PyClass_Type;
3703 Py_INCREF(metaclass);
3704 }
3705 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3706 Py_DECREF(metaclass);
3707 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003708}
3709
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003710static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003711exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3712 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003713{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003714 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003715 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003716 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003717
Guido van Rossumb209a111997-04-29 18:18:01 +00003718 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3719 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003720 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003721 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003722 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003723 locals = PyTuple_GetItem(prog, 2);
3724 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003725 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003726 if (globals == Py_None) {
3727 globals = PyEval_GetGlobals();
3728 if (locals == Py_None) {
3729 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003730 plain = 1;
3731 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003732 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003733 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003734 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003735 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003736 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003737 !PyCode_Check(prog) &&
3738 !PyFile_Check(prog)) {
3739 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003740 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003741 return -1;
3742 }
Fred Drake661ea262000-10-24 19:57:45 +00003743 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003744 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003745 "exec: arg 2 must be a dictionary or None");
3746 return -1;
3747 }
3748 if (!PyDict_Check(locals)) {
3749 PyErr_SetString(PyExc_TypeError,
3750 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003751 return -1;
3752 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003753 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003754 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003755 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003756 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3757 PyErr_SetString(PyExc_TypeError,
3758 "code object passed to exec may not contain free variables");
3759 return -1;
3760 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003761 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003762 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003763 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003764 FILE *fp = PyFile_AsFile(prog);
3765 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003766 PyCompilerFlags cf;
3767 cf.cf_flags = 0;
3768 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003769 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3770 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003771 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003772 v = PyRun_File(fp, name, Py_file_input, globals,
3773 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003774 }
3775 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003776 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003777 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003778 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003779 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003780 cf.cf_flags = 0;
3781 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003782 v = PyRun_StringFlags(str, Py_file_input, globals,
3783 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003784 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003785 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003786 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003787 if (plain)
3788 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003789 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003790 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003791 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003792 return 0;
3793}
Guido van Rossum24c13741995-02-14 09:42:43 +00003794
Guido van Rossumac7be682001-01-17 15:42:30 +00003795static void
Paul Prescode68140d2000-08-30 20:25:01 +00003796format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3797{
3798 char *obj_str;
3799
3800 if (!obj)
3801 return;
3802
3803 obj_str = PyString_AsString(obj);
3804 if (!obj_str)
3805 return;
3806
3807 PyErr_Format(exc, format_str, obj_str);
3808}
Guido van Rossum950361c1997-01-24 13:49:28 +00003809
3810#ifdef DYNAMIC_EXECUTION_PROFILE
3811
Skip Montanarof118cb12001-10-15 20:51:38 +00003812static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003813getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003814{
3815 int i;
3816 PyObject *l = PyList_New(256);
3817 if (l == NULL) return NULL;
3818 for (i = 0; i < 256; i++) {
3819 PyObject *x = PyInt_FromLong(a[i]);
3820 if (x == NULL) {
3821 Py_DECREF(l);
3822 return NULL;
3823 }
3824 PyList_SetItem(l, i, x);
3825 }
3826 for (i = 0; i < 256; i++)
3827 a[i] = 0;
3828 return l;
3829}
3830
3831PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003832_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003833{
3834#ifndef DXPAIRS
3835 return getarray(dxp);
3836#else
3837 int i;
3838 PyObject *l = PyList_New(257);
3839 if (l == NULL) return NULL;
3840 for (i = 0; i < 257; i++) {
3841 PyObject *x = getarray(dxpairs[i]);
3842 if (x == NULL) {
3843 Py_DECREF(l);
3844 return NULL;
3845 }
3846 PyList_SetItem(l, i, x);
3847 }
3848 return l;
3849#endif
3850}
3851
3852#endif