blob: 8547f85c1fb3cc1503d9cf17eed2a22a7c145c6e [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:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000858 if (oparg == 2) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000859 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000860 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000861 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +0000862 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000863 STACKADJ(2);
864 SET_TOP(x);
865 SET_SECOND(w);
Tim Peters35ba6892000-10-11 07:04:49 +0000866 continue;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000867 } else if (oparg == 3) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000868 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000869 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000870 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +0000871 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000872 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +0000873 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000874 STACKADJ(3);
875 SET_TOP(x);
876 SET_SECOND(w);
877 SET_THIRD(v);
Tim Peters35ba6892000-10-11 07:04:49 +0000878 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000879 }
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000880 Py_FatalError("invalid argument to DUP_TOPX"
881 " (bytecode corruption?)");
Tim Peters35ba6892000-10-11 07:04:49 +0000882 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000883
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000885 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000888 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000889 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000891
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000893 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000894 x = PyNumber_Negative(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_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000901 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000902 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000903 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000904 if (err == 0) {
905 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000906 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 continue;
908 }
909 else if (err > 0) {
910 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000911 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +0000912 err = 0;
913 continue;
914 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +0000915 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000917
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 case UNARY_CONVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000919 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000920 x = PyObject_Repr(v);
921 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000922 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000923 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000925
Guido van Rossum7928cd71991-10-24 14:59:31 +0000926 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000927 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000928 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000929 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 Rossum7928cd71991-10-24 14:59:31 +0000932 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000933
Guido van Rossum50564e81996-01-12 01:13:16 +0000934 case BINARY_POWER:
935 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000936 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000937 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000938 Py_DECREF(v);
939 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000940 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000941 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000942 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000943
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 case BINARY_MULTIPLY:
945 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000946 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000947 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000948 Py_DECREF(v);
949 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000950 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000951 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000953
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000955 if (!_Py_QnewFlag) {
956 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000957 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +0000958 x = PyNumber_Divide(v, w);
959 Py_DECREF(v);
960 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000961 SET_TOP(x);
Tim Peters3caca232001-12-06 06:23:26 +0000962 if (x != NULL) continue;
963 break;
964 }
Raymond Hettinger663004b2003-01-09 15:24:30 +0000965 /* -Qnew is in effect: fall through to
Tim Peters3caca232001-12-06 06:23:26 +0000966 BINARY_TRUE_DIVIDE */
967 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000969 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +0000970 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000971 Py_DECREF(v);
972 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000973 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000974 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000975 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000976
Guido van Rossum4668b002001-08-08 05:00:18 +0000977 case BINARY_FLOOR_DIVIDE:
978 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000979 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +0000980 x = PyNumber_FloorDivide(v, w);
981 Py_DECREF(v);
982 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000983 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +0000984 if (x != NULL) continue;
985 break;
986
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 case BINARY_MODULO:
988 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000989 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000990 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000991 Py_DECREF(v);
992 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000993 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000994 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000996
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 case BINARY_ADD:
998 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +0000999 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001000 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001001 /* INLINE: int + int */
1002 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001003 a = PyInt_AS_LONG(v);
1004 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001005 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001006 if ((i^a) < 0 && (i^b) < 0)
1007 goto slow_add;
1008 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001010 else {
1011 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001012 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001013 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001014 Py_DECREF(v);
1015 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001016 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001017 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001018 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001019
Guido van Rossum374a9221991-04-04 10:40:29 +00001020 case BINARY_SUBTRACT:
1021 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001022 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001023 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001024 /* INLINE: int - int */
1025 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001026 a = PyInt_AS_LONG(v);
1027 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001028 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001029 if ((i^a) < 0 && (i^~b) < 0)
1030 goto slow_sub;
1031 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001032 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001033 else {
1034 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001035 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001036 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 Py_DECREF(v);
1038 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001039 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001040 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001042
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 case BINARY_SUBSCR:
1044 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001045 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001046 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001047 /* INLINE: list[int] */
1048 long i = PyInt_AsLong(w);
1049 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001050 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001051 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001052 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001053 PyErr_SetString(PyExc_IndexError,
1054 "list index out of range");
1055 x = NULL;
1056 }
1057 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001058 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001059 Py_INCREF(x);
1060 }
1061 }
1062 else
1063 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001064 Py_DECREF(v);
1065 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001066 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001067 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001068 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001069
Guido van Rossum7928cd71991-10-24 14:59:31 +00001070 case BINARY_LSHIFT:
1071 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001072 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001073 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001074 Py_DECREF(v);
1075 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001076 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001077 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001078 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001079
Guido van Rossum7928cd71991-10-24 14:59:31 +00001080 case BINARY_RSHIFT:
1081 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001082 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001083 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001084 Py_DECREF(v);
1085 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001086 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001087 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001088 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001089
Guido van Rossum7928cd71991-10-24 14:59:31 +00001090 case BINARY_AND:
1091 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001092 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001093 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001094 Py_DECREF(v);
1095 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001096 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001097 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001098 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001099
Guido van Rossum7928cd71991-10-24 14:59:31 +00001100 case BINARY_XOR:
1101 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001102 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001103 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001104 Py_DECREF(v);
1105 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001106 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001107 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001108 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001109
Guido van Rossum7928cd71991-10-24 14:59:31 +00001110 case BINARY_OR:
1111 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001112 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001113 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001114 Py_DECREF(v);
1115 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001116 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001117 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001118 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001119
1120 case INPLACE_POWER:
1121 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001122 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001123 x = PyNumber_InPlacePower(v, w, Py_None);
1124 Py_DECREF(v);
1125 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001126 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001127 if (x != NULL) continue;
1128 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001129
Thomas Wouters434d0822000-08-24 20:11:32 +00001130 case INPLACE_MULTIPLY:
1131 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001132 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001133 x = PyNumber_InPlaceMultiply(v, w);
1134 Py_DECREF(v);
1135 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001136 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001137 if (x != NULL) continue;
1138 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001139
Thomas Wouters434d0822000-08-24 20:11:32 +00001140 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001141 if (!_Py_QnewFlag) {
1142 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001143 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001144 x = PyNumber_InPlaceDivide(v, w);
1145 Py_DECREF(v);
1146 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001147 SET_TOP(x);
Tim Peters54b11912001-12-25 18:49:11 +00001148 if (x != NULL) continue;
1149 break;
1150 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001151 /* -Qnew is in effect: fall through to
Tim Peters54b11912001-12-25 18:49:11 +00001152 INPLACE_TRUE_DIVIDE */
1153 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001154 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001155 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001156 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001157 Py_DECREF(v);
1158 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001159 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001160 if (x != NULL) continue;
1161 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001162
Guido van Rossum4668b002001-08-08 05:00:18 +00001163 case INPLACE_FLOOR_DIVIDE:
1164 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001165 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001166 x = PyNumber_InPlaceFloorDivide(v, w);
1167 Py_DECREF(v);
1168 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001169 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001170 if (x != NULL) continue;
1171 break;
1172
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 case INPLACE_MODULO:
1174 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001175 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001176 x = PyNumber_InPlaceRemainder(v, w);
1177 Py_DECREF(v);
1178 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001179 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001180 if (x != NULL) continue;
1181 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001182
Thomas Wouters434d0822000-08-24 20:11:32 +00001183 case INPLACE_ADD:
1184 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001185 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001186 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001187 /* INLINE: int + int */
1188 register long a, b, i;
1189 a = PyInt_AS_LONG(v);
1190 b = PyInt_AS_LONG(w);
1191 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001192 if ((i^a) < 0 && (i^b) < 0)
1193 goto slow_iadd;
1194 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001195 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001196 else {
1197 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001198 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001199 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001200 Py_DECREF(v);
1201 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001202 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001203 if (x != NULL) continue;
1204 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001205
Thomas Wouters434d0822000-08-24 20:11:32 +00001206 case INPLACE_SUBTRACT:
1207 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001208 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001209 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001210 /* INLINE: int - int */
1211 register long a, b, i;
1212 a = PyInt_AS_LONG(v);
1213 b = PyInt_AS_LONG(w);
1214 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001215 if ((i^a) < 0 && (i^~b) < 0)
1216 goto slow_isub;
1217 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001218 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001219 else {
1220 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001221 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001222 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001223 Py_DECREF(v);
1224 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001225 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001226 if (x != NULL) continue;
1227 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001228
Thomas Wouters434d0822000-08-24 20:11:32 +00001229 case INPLACE_LSHIFT:
1230 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001231 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001232 x = PyNumber_InPlaceLshift(v, w);
1233 Py_DECREF(v);
1234 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001235 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001236 if (x != NULL) continue;
1237 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001238
Thomas Wouters434d0822000-08-24 20:11:32 +00001239 case INPLACE_RSHIFT:
1240 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001241 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001242 x = PyNumber_InPlaceRshift(v, w);
1243 Py_DECREF(v);
1244 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001245 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001246 if (x != NULL) continue;
1247 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001248
Thomas Wouters434d0822000-08-24 20:11:32 +00001249 case INPLACE_AND:
1250 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001251 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001252 x = PyNumber_InPlaceAnd(v, w);
1253 Py_DECREF(v);
1254 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001255 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001256 if (x != NULL) continue;
1257 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001258
Thomas Wouters434d0822000-08-24 20:11:32 +00001259 case INPLACE_XOR:
1260 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001261 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001262 x = PyNumber_InPlaceXor(v, w);
1263 Py_DECREF(v);
1264 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001265 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001266 if (x != NULL) continue;
1267 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001268
Thomas Wouters434d0822000-08-24 20:11:32 +00001269 case INPLACE_OR:
1270 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001271 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001272 x = PyNumber_InPlaceOr(v, w);
1273 Py_DECREF(v);
1274 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001275 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001276 if (x != NULL) continue;
1277 break;
1278
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 case SLICE+0:
1280 case SLICE+1:
1281 case SLICE+2:
1282 case SLICE+3:
1283 if ((opcode-SLICE) & 2)
1284 w = POP();
1285 else
1286 w = NULL;
1287 if ((opcode-SLICE) & 1)
1288 v = POP();
1289 else
1290 v = NULL;
Raymond Hettinger663004b2003-01-09 15:24:30 +00001291 u = TOP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 Py_DECREF(u);
1294 Py_XDECREF(v);
1295 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001296 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001297 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001299
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 case STORE_SLICE+0:
1301 case STORE_SLICE+1:
1302 case STORE_SLICE+2:
1303 case STORE_SLICE+3:
1304 if ((opcode-STORE_SLICE) & 2)
1305 w = POP();
1306 else
1307 w = NULL;
1308 if ((opcode-STORE_SLICE) & 1)
1309 v = POP();
1310 else
1311 v = NULL;
1312 u = POP();
1313 t = POP();
1314 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001315 Py_DECREF(t);
1316 Py_DECREF(u);
1317 Py_XDECREF(v);
1318 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001319 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001321
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 case DELETE_SLICE+0:
1323 case DELETE_SLICE+1:
1324 case DELETE_SLICE+2:
1325 case DELETE_SLICE+3:
1326 if ((opcode-DELETE_SLICE) & 2)
1327 w = POP();
1328 else
1329 w = NULL;
1330 if ((opcode-DELETE_SLICE) & 1)
1331 v = POP();
1332 else
1333 v = NULL;
1334 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001335 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001337 Py_DECREF(u);
1338 Py_XDECREF(v);
1339 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001340 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001342
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001344 w = TOP();
1345 v = SECOND();
1346 u = THIRD();
1347 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001349 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 Py_DECREF(u);
1351 Py_DECREF(v);
1352 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001353 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001355
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001357 w = TOP();
1358 v = SECOND();
1359 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001361 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001362 Py_DECREF(v);
1363 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001364 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001366
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 case PRINT_EXPR:
1368 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001369 w = PySys_GetObject("displayhook");
1370 if (w == NULL) {
1371 PyErr_SetString(PyExc_RuntimeError,
1372 "lost sys.displayhook");
1373 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001374 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001375 }
1376 if (err == 0) {
1377 x = Py_BuildValue("(O)", v);
1378 if (x == NULL)
1379 err = -1;
1380 }
1381 if (err == 0) {
1382 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001383 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001384 if (w == NULL)
1385 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001387 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001388 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001390
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001391 case PRINT_ITEM_TO:
1392 w = stream = POP();
1393 /* fall through to PRINT_ITEM */
1394
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 case PRINT_ITEM:
1396 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001397 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001398 w = PySys_GetObject("stdout");
1399 if (w == NULL) {
1400 PyErr_SetString(PyExc_RuntimeError,
1401 "lost sys.stdout");
1402 err = -1;
1403 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001404 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001405 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001406 err = PyFile_WriteString(" ", w);
1407 if (err == 0)
1408 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001409 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001410 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001411 if (PyString_Check(v)) {
1412 char *s = PyString_AS_STRING(v);
1413 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001414 if (len == 0 ||
1415 !isspace(Py_CHARMASK(s[len-1])) ||
1416 s[len-1] == ' ')
1417 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001418 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001419#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001420 else if (PyUnicode_Check(v)) {
1421 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1422 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001423 if (len == 0 ||
1424 !Py_UNICODE_ISSPACE(s[len-1]) ||
1425 s[len-1] == ' ')
1426 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001427 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001428#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001429 else
1430 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001433 Py_XDECREF(stream);
1434 stream = NULL;
1435 if (err == 0)
1436 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001438
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001439 case PRINT_NEWLINE_TO:
1440 w = stream = POP();
1441 /* fall through to PRINT_NEWLINE */
1442
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001444 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001445 w = PySys_GetObject("stdout");
1446 if (w == NULL)
1447 PyErr_SetString(PyExc_RuntimeError,
1448 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001449 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001450 if (w != NULL) {
1451 err = PyFile_WriteString("\n", w);
1452 if (err == 0)
1453 PyFile_SoftSpace(w, 0);
1454 }
1455 Py_XDECREF(stream);
1456 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001458
Thomas Wouters434d0822000-08-24 20:11:32 +00001459
1460#ifdef CASE_TOO_BIG
1461 default: switch (opcode) {
1462#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 case BREAK_LOOP:
1464 why = WHY_BREAK;
1465 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001466
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001467 case CONTINUE_LOOP:
1468 retval = PyInt_FromLong(oparg);
1469 why = WHY_CONTINUE;
1470 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001471
Guido van Rossumf10570b1995-07-07 22:53:21 +00001472 case RAISE_VARARGS:
1473 u = v = w = NULL;
1474 switch (oparg) {
1475 case 3:
1476 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001477 /* Fallthrough */
1478 case 2:
1479 v = POP(); /* value */
1480 /* Fallthrough */
1481 case 1:
1482 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001483 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001484 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001485 break;
1486 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001487 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001488 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001489 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001490 break;
1491 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001493
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001495 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001496 PyErr_SetString(PyExc_SystemError,
1497 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001498 break;
1499 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001500 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001501 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001503
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 case RETURN_VALUE:
1505 retval = POP();
1506 why = WHY_RETURN;
1507 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001508
Tim Peters5ca576e2001-06-18 22:08:13 +00001509 case YIELD_VALUE:
1510 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001511 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001512 why = WHY_YIELD;
1513 break;
1514
1515
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001516 case EXEC_STMT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001517 w = TOP();
1518 v = SECOND();
1519 u = THIRD();
1520 STACKADJ(-3);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001521 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 Py_DECREF(u);
1523 Py_DECREF(v);
1524 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001525 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001526
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 case POP_BLOCK:
1528 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 while (STACK_LEVEL() > b->b_level) {
1531 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 }
1534 }
1535 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001536
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 case END_FINALLY:
1538 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 if (PyInt_Check(v)) {
1540 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001541 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001542 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001543 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 retval = POP();
1545 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001548 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001550 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001551 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 else if (v != Py_None) {
1554 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 "'finally' pops bad exception");
1556 why = WHY_EXCEPTION;
1557 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001558 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001560
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 case BUILD_CLASS:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001562 u = TOP();
1563 v = SECOND();
1564 w = THIRD();
1565 STACKADJ(-2);
Guido van Rossum25831651993-05-19 14:50:45 +00001566 x = build_class(u, v, w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001567 SET_TOP(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 Py_DECREF(u);
1569 Py_DECREF(v);
1570 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001572
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001574 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001576 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001577 PyErr_Format(PyExc_SystemError,
1578 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001579 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001580 break;
1581 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 err = PyDict_SetItem(x, w, v);
1583 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001585
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001587 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001589 PyErr_Format(PyExc_SystemError,
1590 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001591 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001592 break;
1593 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001594 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001595 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001596 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001598
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001599 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001601 if (PyTuple_Check(v)) {
1602 if (PyTuple_Size(v) != oparg) {
1603 PyErr_SetString(PyExc_ValueError,
1604 "unpack tuple of wrong size");
1605 why = WHY_EXCEPTION;
1606 }
1607 else {
1608 for (; --oparg >= 0; ) {
1609 w = PyTuple_GET_ITEM(v, oparg);
1610 Py_INCREF(w);
1611 PUSH(w);
1612 }
1613 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001614 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001615 else if (PyList_Check(v)) {
1616 if (PyList_Size(v) != oparg) {
1617 PyErr_SetString(PyExc_ValueError,
1618 "unpack list of wrong size");
1619 why = WHY_EXCEPTION;
1620 }
1621 else {
1622 for (; --oparg >= 0; ) {
1623 w = PyList_GET_ITEM(v, oparg);
1624 Py_INCREF(w);
1625 PUSH(w);
1626 }
1627 }
1628 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001629 else if (unpack_iterable(v, oparg,
1630 stack_pointer + oparg))
1631 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001632 else {
1633 if (PyErr_ExceptionMatches(PyExc_TypeError))
1634 PyErr_SetString(PyExc_TypeError,
1635 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001636 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001637 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001640
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001642 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001643 v = TOP();
1644 u = SECOND();
1645 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1647 Py_DECREF(v);
1648 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001650
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001652 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001654 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1655 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001658
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001659 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001660 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001661 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 err = PyDict_SetItem(f->f_globals, w, v);
1663 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001664 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001665
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001666 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001667 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001669 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001670 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001671 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001672
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001674 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001675 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001676 PyErr_Format(PyExc_SystemError,
1677 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001678 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 break;
1680 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001683 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001687 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001688 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001689 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 break;
1691 }
1692 }
1693 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001694 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 PUSH(x);
1696 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001697
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001699 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001700 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001701 /* Inline the PyDict_GetItem() calls.
1702 WARNING: this is an extreme speed hack.
1703 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001704 long hash = ((PyStringObject *)w)->ob_shash;
1705 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001706 PyDictObject *d;
1707 d = (PyDictObject *)(f->f_globals);
1708 x = d->ma_lookup(d, w, hash)->me_value;
1709 if (x != NULL) {
1710 Py_INCREF(x);
1711 PUSH(x);
1712 continue;
1713 }
1714 d = (PyDictObject *)(f->f_builtins);
1715 x = d->ma_lookup(d, w, hash)->me_value;
1716 if (x != NULL) {
1717 Py_INCREF(x);
1718 PUSH(x);
1719 continue;
1720 }
1721 goto load_global_error;
1722 }
1723 }
1724 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001725 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001727 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001729 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001730 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001731 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001732 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 break;
1734 }
1735 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 PUSH(x);
1738 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001739
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001740 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001741 x = GETLOCAL(oparg);
1742 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001743 format_exc_check_arg(
1744 PyExc_UnboundLocalError,
1745 UNBOUNDLOCAL_ERROR_MSG,
1746 PyTuple_GetItem(co->co_varnames, oparg)
1747 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001748 break;
1749 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001750 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001751 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001752
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001753 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001754 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001755 Py_INCREF(x);
1756 PUSH(x);
1757 break;
1758
1759 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001760 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001761 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001762 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001763 err = -1;
1764 /* Don't stomp existing exception */
1765 if (PyErr_Occurred())
1766 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001767 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001768 v = PyTuple_GetItem(co->co_cellvars,
1769 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001770 format_exc_check_arg(
1771 PyExc_UnboundLocalError,
1772 UNBOUNDLOCAL_ERROR_MSG,
1773 v);
1774 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001775 v = PyTuple_GetItem(
1776 co->co_freevars,
1777 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001778 format_exc_check_arg(
1779 PyExc_NameError,
1780 UNBOUNDFREE_ERROR_MSG,
1781 v);
1782 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001783 break;
1784 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001785 PUSH(w);
1786 break;
1787
1788 case STORE_DEREF:
1789 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001790 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001791 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001792 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001793 continue;
1794
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001796 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 if (x != NULL) {
1798 for (; --oparg >= 0;) {
1799 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 }
1802 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001803 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 }
1805 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001806
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 if (x != NULL) {
1810 for (; --oparg >= 0;) {
1811 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001812 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 }
1814 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001815 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 }
1817 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001818
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001822 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001823 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001824
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001826 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001827 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 x = PyObject_GetAttr(v, w);
1829 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001830 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001831 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001833
Guido van Rossum374a9221991-04-04 10:40:29 +00001834 case COMPARE_OP:
1835 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001836 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001837 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001838 /* INLINE: cmp(int, int) */
1839 register long a, b;
1840 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001841 a = PyInt_AS_LONG(v);
1842 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001843 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001844 case PyCmp_LT: res = a < b; break;
1845 case PyCmp_LE: res = a <= b; break;
1846 case PyCmp_EQ: res = a == b; break;
1847 case PyCmp_NE: res = a != b; break;
1848 case PyCmp_GT: res = a > b; break;
1849 case PyCmp_GE: res = a >= b; break;
1850 case PyCmp_IS: res = v == w; break;
1851 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001852 default: goto slow_compare;
1853 }
1854 x = res ? Py_True : Py_False;
1855 Py_INCREF(x);
1856 }
1857 else {
1858 slow_compare:
1859 x = cmp_outcome(oparg, v, w);
1860 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 Py_DECREF(v);
1862 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001863 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001864 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001866
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001868 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001869 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001870 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001871 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001872 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001873 break;
1874 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001875 u = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001877 w,
1878 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001879 f->f_locals == NULL ?
1880 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001881 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001882 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001883 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001884 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001885 x = NULL;
1886 break;
1887 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001888 x = PyEval_CallObject(x, w);
1889 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001890 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001891 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001892 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001893
Thomas Wouters52152252000-08-17 22:55:00 +00001894 case IMPORT_STAR:
1895 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001896 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001897 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001898 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001899 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001900 break;
1901 }
Thomas Wouters52152252000-08-17 22:55:00 +00001902 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001903 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001904 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001905 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001906 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001907
Thomas Wouters52152252000-08-17 22:55:00 +00001908 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001909 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001910 v = TOP();
1911 x = import_from(v, w);
1912 PUSH(x);
1913 if (x != NULL) continue;
1914 break;
1915
Guido van Rossum374a9221991-04-04 10:40:29 +00001916 case JUMP_FORWARD:
1917 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001918 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001919
Guido van Rossum374a9221991-04-04 10:40:29 +00001920 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001921 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001922 if (err > 0)
1923 err = 0;
1924 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001925 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001926 else
1927 break;
1928 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001929
Guido van Rossum374a9221991-04-04 10:40:29 +00001930 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001931 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001932 if (err > 0) {
1933 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001934 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001935 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001936 else if (err == 0)
1937 ;
1938 else
1939 break;
1940 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001941
Guido van Rossum374a9221991-04-04 10:40:29 +00001942 case JUMP_ABSOLUTE:
1943 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001944 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001945
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001946 case GET_ITER:
1947 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00001948 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001949 x = PyObject_GetIter(v);
1950 Py_DECREF(v);
1951 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001952 SET_TOP(x);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001953 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001954 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001955 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001956 break;
1957
1958 case FOR_ITER:
1959 /* before: [iter]; after: [iter, iter()] *or* [] */
1960 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001961 x = PyIter_Next(v);
1962 if (x != NULL) {
1963 PUSH(x);
1964 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001965 }
Tim Petersf4848da2001-05-05 00:14:56 +00001966 if (!PyErr_Occurred()) {
1967 /* iterator ended normally */
1968 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001969 Py_DECREF(v);
1970 JUMPBY(oparg);
1971 continue;
1972 }
1973 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001974
Guido van Rossum374a9221991-04-04 10:40:29 +00001975 case SETUP_LOOP:
1976 case SETUP_EXCEPT:
1977 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001978 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001979 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001980 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001981
Guido van Rossumf10570b1995-07-07 22:53:21 +00001982 case CALL_FUNCTION:
Jeremy Hyltone8c04322002-08-16 17:47:26 +00001983 x = call_function(&stack_pointer, oparg);
1984 PUSH(x);
1985 if (x != NULL)
1986 continue;
1987 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001988
Jeremy Hylton76901512000-03-28 23:49:17 +00001989 case CALL_FUNCTION_VAR:
1990 case CALL_FUNCTION_KW:
1991 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001992 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001993 int na = oparg & 0xff;
1994 int nk = (oparg>>8) & 0xff;
1995 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 int n = na + 2 * nk;
1997 PyObject **pfunc, *func;
1998 if (flags & CALL_FLAG_VAR)
1999 n++;
2000 if (flags & CALL_FLAG_KW)
2001 n++;
2002 pfunc = stack_pointer - n - 1;
2003 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002004
Guido van Rossumac7be682001-01-17 15:42:30 +00002005 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002006 && PyMethod_GET_SELF(func) != NULL) {
2007 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002008 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002009 func = PyMethod_GET_FUNCTION(func);
2010 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002011 Py_DECREF(*pfunc);
2012 *pfunc = self;
2013 na++;
2014 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002015 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002016 Py_INCREF(func);
2017 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002018 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002019
Jeremy Hylton76901512000-03-28 23:49:17 +00002020 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002021 w = POP();
2022 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002023 }
2024 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002025 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002026 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002027 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002028 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002029
Guido van Rossum681d79a1995-07-18 14:51:37 +00002030 case MAKE_FUNCTION:
2031 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002032 x = PyFunction_New(v, f->f_globals);
2033 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002034 /* XXX Maybe this should be a separate opcode? */
2035 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002037 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002038 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002039 x = NULL;
2040 break;
2041 }
2042 while (--oparg >= 0) {
2043 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002045 }
2046 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002047 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002048 }
2049 PUSH(x);
2050 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002051
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002052 case MAKE_CLOSURE:
2053 {
2054 int nfree;
2055 v = POP(); /* code object */
2056 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002057 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002058 Py_DECREF(v);
2059 /* XXX Maybe this should be a separate opcode? */
2060 if (x != NULL && nfree > 0) {
2061 v = PyTuple_New(nfree);
2062 if (v == NULL) {
2063 Py_DECREF(x);
2064 x = NULL;
2065 break;
2066 }
2067 while (--nfree >= 0) {
2068 w = POP();
2069 PyTuple_SET_ITEM(v, nfree, w);
2070 }
2071 err = PyFunction_SetClosure(x, v);
2072 Py_DECREF(v);
2073 }
2074 if (x != NULL && oparg > 0) {
2075 v = PyTuple_New(oparg);
2076 if (v == NULL) {
2077 Py_DECREF(x);
2078 x = NULL;
2079 break;
2080 }
2081 while (--oparg >= 0) {
2082 w = POP();
2083 PyTuple_SET_ITEM(v, oparg, w);
2084 }
2085 err = PyFunction_SetDefaults(x, v);
2086 Py_DECREF(v);
2087 }
2088 PUSH(x);
2089 break;
2090 }
2091
Guido van Rossum8861b741996-07-30 16:49:37 +00002092 case BUILD_SLICE:
2093 if (oparg == 3)
2094 w = POP();
2095 else
2096 w = NULL;
2097 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002098 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002099 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 Py_DECREF(u);
2101 Py_DECREF(v);
2102 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002103 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002104 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002105 break;
2106
Fred Drakeef8ace32000-08-24 00:32:09 +00002107 case EXTENDED_ARG:
2108 opcode = NEXTOP();
2109 oparg = oparg<<16 | NEXTARG();
2110 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002111
Guido van Rossum374a9221991-04-04 10:40:29 +00002112 default:
2113 fprintf(stderr,
2114 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002115 PyCode_Addr2Line(f->f_code, f->f_lasti),
2116 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002117 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002118 why = WHY_EXCEPTION;
2119 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002120
2121#ifdef CASE_TOO_BIG
2122 }
2123#endif
2124
Guido van Rossum374a9221991-04-04 10:40:29 +00002125 } /* switch */
2126
2127 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002128
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002130
Guido van Rossum374a9221991-04-04 10:40:29 +00002131 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002132 if (err == 0 && x != NULL) {
2133#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002134 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002136 fprintf(stderr,
2137 "XXX undetected error\n");
2138 else
2139#endif
2140 continue; /* Normal, fast path */
2141 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 err = 0;
2145 }
2146
Guido van Rossum374a9221991-04-04 10:40:29 +00002147 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002148
Guido van Rossum374a9221991-04-04 10:40:29 +00002149 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002151 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002152 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 why = WHY_EXCEPTION;
2154 }
2155 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002156#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002158 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002160 fprintf(stderr,
2161 "XXX undetected error (why=%d)\n",
2162 why);
2163 why = WHY_EXCEPTION;
2164 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 }
2166#endif
2167
2168 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002169
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002172
Fred Drake8f51f542001-10-04 14:48:42 +00002173 if (tstate->c_tracefunc != NULL)
2174 call_exc_trace(tstate->c_tracefunc,
2175 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002176 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002177
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002179
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 if (why == WHY_RERAISE)
2181 why = WHY_EXCEPTION;
2182
2183 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002184
Tim Peters5ca576e2001-06-18 22:08:13 +00002185 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002187
2188 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2189 /* For a continue inside a try block,
2190 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002191 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2192 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002193 why = WHY_NOT;
2194 JUMPTO(PyInt_AS_LONG(retval));
2195 Py_DECREF(retval);
2196 break;
2197 }
2198
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 while (STACK_LEVEL() > b->b_level) {
2200 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002201 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 }
2203 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2204 why = WHY_NOT;
2205 JUMPTO(b->b_handler);
2206 break;
2207 }
2208 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002209 (b->b_type == SETUP_EXCEPT &&
2210 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 PyObject *exc, *val, *tb;
2213 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002214 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 val = Py_None;
2216 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002217 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002218 /* Make the raw exception data
2219 available to the handler,
2220 so a program can emulate the
2221 Python main loop. Don't do
2222 this for 'finally'. */
2223 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002224 PyErr_NormalizeException(
2225 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002226 set_exc_info(tstate,
2227 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002229 if (tb == NULL) {
2230 Py_INCREF(Py_None);
2231 PUSH(Py_None);
2232 } else
2233 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002234 PUSH(val);
2235 PUSH(exc);
2236 }
2237 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002238 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002239 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002240 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002242 PUSH(v);
2243 }
2244 why = WHY_NOT;
2245 JUMPTO(b->b_handler);
2246 break;
2247 }
2248 } /* unwind stack */
2249
2250 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002251
Guido van Rossum374a9221991-04-04 10:40:29 +00002252 if (why != WHY_NOT)
2253 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002254
Guido van Rossum374a9221991-04-04 10:40:29 +00002255 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002256
Guido van Rossum35974fb2001-12-06 21:28:18 +00002257 if (why != WHY_YIELD) {
2258 /* Pop remaining stack entries -- but when yielding */
2259 while (!EMPTY()) {
2260 v = POP();
2261 Py_XDECREF(v);
2262 }
2263 }
2264
Tim Peters5ca576e2001-06-18 22:08:13 +00002265 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002266 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002267
Fred Drake9e3ad782001-07-03 23:39:52 +00002268 if (tstate->use_tracing) {
2269 if (tstate->c_tracefunc
2270 && (why == WHY_RETURN || why == WHY_YIELD)) {
2271 if (call_trace(tstate->c_tracefunc,
2272 tstate->c_traceobj, f,
2273 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002274 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002275 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002276 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002277 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002278 }
Fred Drake8f51f542001-10-04 14:48:42 +00002279 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002280 if (why == WHY_EXCEPTION)
2281 call_trace_protected(tstate->c_profilefunc,
2282 tstate->c_profileobj, f,
2283 PyTrace_RETURN);
2284 else if (call_trace(tstate->c_profilefunc,
2285 tstate->c_profileobj, f,
2286 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002287 Py_XDECREF(retval);
2288 retval = NULL;
2289 why = WHY_EXCEPTION;
2290 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002291 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002292 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002293
Guido van Rossuma027efa1997-05-05 20:56:21 +00002294 reset_exc_info(tstate);
2295
Tim Peters5ca576e2001-06-18 22:08:13 +00002296 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002297 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002298 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002299
Guido van Rossum96a42c81992-01-12 02:29:51 +00002300 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002301}
2302
Tim Peters6d6c1a32001-08-02 04:15:00 +00002303PyObject *
2304PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002305 PyObject **args, int argcount, PyObject **kws, int kwcount,
2306 PyObject **defs, int defcount, PyObject *closure)
2307{
2308 register PyFrameObject *f;
2309 register PyObject *retval = NULL;
2310 register PyObject **fastlocals, **freevars;
2311 PyThreadState *tstate = PyThreadState_GET();
2312 PyObject *x, *u;
2313
2314 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002315 PyErr_SetString(PyExc_SystemError,
2316 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002317 return NULL;
2318 }
2319
2320 f = PyFrame_New(tstate, /*back*/
2321 co, /*code*/
2322 globals, locals);
2323 if (f == NULL)
2324 return NULL;
2325
2326 fastlocals = f->f_localsplus;
2327 freevars = f->f_localsplus + f->f_nlocals;
2328
2329 if (co->co_argcount > 0 ||
2330 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2331 int i;
2332 int n = argcount;
2333 PyObject *kwdict = NULL;
2334 if (co->co_flags & CO_VARKEYWORDS) {
2335 kwdict = PyDict_New();
2336 if (kwdict == NULL)
2337 goto fail;
2338 i = co->co_argcount;
2339 if (co->co_flags & CO_VARARGS)
2340 i++;
2341 SETLOCAL(i, kwdict);
2342 }
2343 if (argcount > co->co_argcount) {
2344 if (!(co->co_flags & CO_VARARGS)) {
2345 PyErr_Format(PyExc_TypeError,
2346 "%.200s() takes %s %d "
2347 "%sargument%s (%d given)",
2348 PyString_AsString(co->co_name),
2349 defcount ? "at most" : "exactly",
2350 co->co_argcount,
2351 kwcount ? "non-keyword " : "",
2352 co->co_argcount == 1 ? "" : "s",
2353 argcount);
2354 goto fail;
2355 }
2356 n = co->co_argcount;
2357 }
2358 for (i = 0; i < n; i++) {
2359 x = args[i];
2360 Py_INCREF(x);
2361 SETLOCAL(i, x);
2362 }
2363 if (co->co_flags & CO_VARARGS) {
2364 u = PyTuple_New(argcount - n);
2365 if (u == NULL)
2366 goto fail;
2367 SETLOCAL(co->co_argcount, u);
2368 for (i = n; i < argcount; i++) {
2369 x = args[i];
2370 Py_INCREF(x);
2371 PyTuple_SET_ITEM(u, i-n, x);
2372 }
2373 }
2374 for (i = 0; i < kwcount; i++) {
2375 PyObject *keyword = kws[2*i];
2376 PyObject *value = kws[2*i + 1];
2377 int j;
2378 if (keyword == NULL || !PyString_Check(keyword)) {
2379 PyErr_Format(PyExc_TypeError,
2380 "%.200s() keywords must be strings",
2381 PyString_AsString(co->co_name));
2382 goto fail;
2383 }
2384 /* XXX slow -- speed up using dictionary? */
2385 for (j = 0; j < co->co_argcount; j++) {
2386 PyObject *nm = PyTuple_GET_ITEM(
2387 co->co_varnames, j);
2388 int cmp = PyObject_RichCompareBool(
2389 keyword, nm, Py_EQ);
2390 if (cmp > 0)
2391 break;
2392 else if (cmp < 0)
2393 goto fail;
2394 }
2395 /* Check errors from Compare */
2396 if (PyErr_Occurred())
2397 goto fail;
2398 if (j >= co->co_argcount) {
2399 if (kwdict == NULL) {
2400 PyErr_Format(PyExc_TypeError,
2401 "%.200s() got an unexpected "
2402 "keyword argument '%.400s'",
2403 PyString_AsString(co->co_name),
2404 PyString_AsString(keyword));
2405 goto fail;
2406 }
2407 PyDict_SetItem(kwdict, keyword, value);
2408 }
2409 else {
2410 if (GETLOCAL(j) != NULL) {
2411 PyErr_Format(PyExc_TypeError,
2412 "%.200s() got multiple "
2413 "values for keyword "
2414 "argument '%.400s'",
2415 PyString_AsString(co->co_name),
2416 PyString_AsString(keyword));
2417 goto fail;
2418 }
2419 Py_INCREF(value);
2420 SETLOCAL(j, value);
2421 }
2422 }
2423 if (argcount < co->co_argcount) {
2424 int m = co->co_argcount - defcount;
2425 for (i = argcount; i < m; i++) {
2426 if (GETLOCAL(i) == NULL) {
2427 PyErr_Format(PyExc_TypeError,
2428 "%.200s() takes %s %d "
2429 "%sargument%s (%d given)",
2430 PyString_AsString(co->co_name),
2431 ((co->co_flags & CO_VARARGS) ||
2432 defcount) ? "at least"
2433 : "exactly",
2434 m, kwcount ? "non-keyword " : "",
2435 m == 1 ? "" : "s", i);
2436 goto fail;
2437 }
2438 }
2439 if (n > m)
2440 i = n - m;
2441 else
2442 i = 0;
2443 for (; i < defcount; i++) {
2444 if (GETLOCAL(m+i) == NULL) {
2445 PyObject *def = defs[i];
2446 Py_INCREF(def);
2447 SETLOCAL(m+i, def);
2448 }
2449 }
2450 }
2451 }
2452 else {
2453 if (argcount > 0 || kwcount > 0) {
2454 PyErr_Format(PyExc_TypeError,
2455 "%.200s() takes no arguments (%d given)",
2456 PyString_AsString(co->co_name),
2457 argcount + kwcount);
2458 goto fail;
2459 }
2460 }
2461 /* Allocate and initialize storage for cell vars, and copy free
2462 vars into frame. This isn't too efficient right now. */
2463 if (f->f_ncells) {
2464 int i = 0, j = 0, nargs, found;
2465 char *cellname, *argname;
2466 PyObject *c;
2467
2468 nargs = co->co_argcount;
2469 if (co->co_flags & CO_VARARGS)
2470 nargs++;
2471 if (co->co_flags & CO_VARKEYWORDS)
2472 nargs++;
2473
2474 /* Check for cells that shadow args */
2475 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2476 cellname = PyString_AS_STRING(
2477 PyTuple_GET_ITEM(co->co_cellvars, i));
2478 found = 0;
2479 while (j < nargs) {
2480 argname = PyString_AS_STRING(
2481 PyTuple_GET_ITEM(co->co_varnames, j));
2482 if (strcmp(cellname, argname) == 0) {
2483 c = PyCell_New(GETLOCAL(j));
2484 if (c == NULL)
2485 goto fail;
2486 GETLOCAL(f->f_nlocals + i) = c;
2487 found = 1;
2488 break;
2489 }
2490 j++;
2491 }
2492 if (found == 0) {
2493 c = PyCell_New(NULL);
2494 if (c == NULL)
2495 goto fail;
2496 SETLOCAL(f->f_nlocals + i, c);
2497 }
2498 }
2499 /* Initialize any that are left */
2500 while (i < f->f_ncells) {
2501 c = PyCell_New(NULL);
2502 if (c == NULL)
2503 goto fail;
2504 SETLOCAL(f->f_nlocals + i, c);
2505 i++;
2506 }
2507 }
2508 if (f->f_nfreevars) {
2509 int i;
2510 for (i = 0; i < f->f_nfreevars; ++i) {
2511 PyObject *o = PyTuple_GET_ITEM(closure, i);
2512 Py_INCREF(o);
2513 freevars[f->f_ncells + i] = o;
2514 }
2515 }
2516
Tim Peters5ca576e2001-06-18 22:08:13 +00002517 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002518 /* Don't need to keep the reference to f_back, it will be set
2519 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002520 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002521 f->f_back = NULL;
2522
2523 /* Create a new generator that owns the ready to run frame
2524 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002525 return gen_new(f);
2526 }
2527
2528 retval = eval_frame(f);
2529
2530 fail: /* Jump here from prelude on failure */
2531
Tim Petersb13680b2001-11-27 23:29:29 +00002532 /* decref'ing the frame can cause __del__ methods to get invoked,
2533 which can call back into Python. While we're done with the
2534 current Python frame (f), the associated C stack is still in use,
2535 so recursion_depth must be boosted for the duration.
2536 */
2537 assert(tstate != NULL);
2538 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002539 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002540 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002541 return retval;
2542}
2543
2544
Guido van Rossuma027efa1997-05-05 20:56:21 +00002545static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002546set_exc_info(PyThreadState *tstate,
2547 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002548{
2549 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002550 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002551
Guido van Rossuma027efa1997-05-05 20:56:21 +00002552 frame = tstate->frame;
2553 if (frame->f_exc_type == NULL) {
2554 /* This frame didn't catch an exception before */
2555 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002556 if (tstate->exc_type == NULL) {
2557 Py_INCREF(Py_None);
2558 tstate->exc_type = Py_None;
2559 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002560 tmp_type = frame->f_exc_type;
2561 tmp_value = frame->f_exc_value;
2562 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002563 Py_XINCREF(tstate->exc_type);
2564 Py_XINCREF(tstate->exc_value);
2565 Py_XINCREF(tstate->exc_traceback);
2566 frame->f_exc_type = tstate->exc_type;
2567 frame->f_exc_value = tstate->exc_value;
2568 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002569 Py_XDECREF(tmp_type);
2570 Py_XDECREF(tmp_value);
2571 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002572 }
2573 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002574 tmp_type = tstate->exc_type;
2575 tmp_value = tstate->exc_value;
2576 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 Py_XINCREF(type);
2578 Py_XINCREF(value);
2579 Py_XINCREF(tb);
2580 tstate->exc_type = type;
2581 tstate->exc_value = value;
2582 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002583 Py_XDECREF(tmp_type);
2584 Py_XDECREF(tmp_value);
2585 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 /* For b/w compatibility */
2587 PySys_SetObject("exc_type", type);
2588 PySys_SetObject("exc_value", value);
2589 PySys_SetObject("exc_traceback", tb);
2590}
2591
2592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002593reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594{
2595 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002596 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597 frame = tstate->frame;
2598 if (frame->f_exc_type != NULL) {
2599 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002600 tmp_type = tstate->exc_type;
2601 tmp_value = tstate->exc_value;
2602 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002603 Py_XINCREF(frame->f_exc_type);
2604 Py_XINCREF(frame->f_exc_value);
2605 Py_XINCREF(frame->f_exc_traceback);
2606 tstate->exc_type = frame->f_exc_type;
2607 tstate->exc_value = frame->f_exc_value;
2608 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002609 Py_XDECREF(tmp_type);
2610 Py_XDECREF(tmp_value);
2611 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002612 /* For b/w compatibility */
2613 PySys_SetObject("exc_type", frame->f_exc_type);
2614 PySys_SetObject("exc_value", frame->f_exc_value);
2615 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2616 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002617 tmp_type = frame->f_exc_type;
2618 tmp_value = frame->f_exc_value;
2619 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002620 frame->f_exc_type = NULL;
2621 frame->f_exc_value = NULL;
2622 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002623 Py_XDECREF(tmp_type);
2624 Py_XDECREF(tmp_value);
2625 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626}
2627
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002628/* Logic for the raise statement (too complicated for inlining).
2629 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002630static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002631do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002632{
Guido van Rossumd295f121998-04-09 21:39:57 +00002633 if (type == NULL) {
2634 /* Reraise */
2635 PyThreadState *tstate = PyThreadState_Get();
2636 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2637 value = tstate->exc_value;
2638 tb = tstate->exc_traceback;
2639 Py_XINCREF(type);
2640 Py_XINCREF(value);
2641 Py_XINCREF(tb);
2642 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002643
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002644 /* We support the following forms of raise:
2645 raise <class>, <classinstance>
2646 raise <class>, <argument tuple>
2647 raise <class>, None
2648 raise <class>, <argument>
2649 raise <classinstance>, None
2650 raise <string>, <object>
2651 raise <string>, None
2652
2653 An omitted second argument is the same as None.
2654
2655 In addition, raise <tuple>, <anything> is the same as
2656 raising the tuple's first item (and it better have one!);
2657 this rule is applied recursively.
2658
2659 Finally, an optional third argument can be supplied, which
2660 gives the traceback to be substituted (useful when
2661 re-raising an exception after examining it). */
2662
2663 /* First, check the traceback argument, replacing None with
2664 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002665 if (tb == Py_None) {
2666 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002667 tb = NULL;
2668 }
2669 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002670 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002671 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002672 goto raise_error;
2673 }
2674
2675 /* Next, replace a missing value with None */
2676 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 value = Py_None;
2678 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002679 }
2680
2681 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2683 PyObject *tmp = type;
2684 type = PyTuple_GET_ITEM(type, 0);
2685 Py_INCREF(type);
2686 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002687 }
2688
Tim Petersafb2c802002-04-18 18:06:20 +00002689 if (PyString_CheckExact(type))
2690 /* Raising builtin string is deprecated but still allowed --
2691 * do nothing. Raising an instance of a new-style str
2692 * subclass is right out. */
Neal Norwitz37aa0662003-01-10 15:31:15 +00002693 PyErr_Warn(PyExc_PendingDeprecationWarning,
2694 "raising a string exception is deprecated");
Barry Warsaw4249f541997-08-22 21:26:19 +00002695
2696 else if (PyClass_Check(type))
2697 PyErr_NormalizeException(&type, &value, &tb);
2698
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002700 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 if (value != Py_None) {
2702 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002703 "instance exception may not have a separate value");
2704 goto raise_error;
2705 }
2706 else {
2707 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002709 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2711 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002712 }
2713 }
2714 else {
2715 /* Not something you can raise. You get an exception
2716 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002717 PyErr_Format(PyExc_TypeError,
Neal Norwitz37aa0662003-01-10 15:31:15 +00002718 "exceptions must be classes, instances, or "
2719 "strings (deprecated), not %s",
2720 type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002721 goto raise_error;
2722 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002724 if (tb == NULL)
2725 return WHY_EXCEPTION;
2726 else
2727 return WHY_RERAISE;
2728 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 Py_XDECREF(value);
2730 Py_XDECREF(type);
2731 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002732 return WHY_EXCEPTION;
2733}
2734
Tim Petersd6d010b2001-06-21 02:49:55 +00002735/* Iterate v argcnt times and store the results on the stack (via decreasing
2736 sp). Return 1 for success, 0 if error. */
2737
Barry Warsawe42b18f1997-08-25 22:13:04 +00002738static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002739unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002740{
Tim Petersd6d010b2001-06-21 02:49:55 +00002741 int i = 0;
2742 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002743 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002744
Tim Petersd6d010b2001-06-21 02:49:55 +00002745 assert(v != NULL);
2746
2747 it = PyObject_GetIter(v);
2748 if (it == NULL)
2749 goto Error;
2750
2751 for (; i < argcnt; i++) {
2752 w = PyIter_Next(it);
2753 if (w == NULL) {
2754 /* Iterator done, via error or exhaustion. */
2755 if (!PyErr_Occurred()) {
2756 PyErr_Format(PyExc_ValueError,
2757 "need more than %d value%s to unpack",
2758 i, i == 1 ? "" : "s");
2759 }
2760 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002761 }
2762 *--sp = w;
2763 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002764
2765 /* We better have exhausted the iterator now. */
2766 w = PyIter_Next(it);
2767 if (w == NULL) {
2768 if (PyErr_Occurred())
2769 goto Error;
2770 Py_DECREF(it);
2771 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002772 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002773 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002774 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002775 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002776Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002777 for (; i > 0; i--, sp++)
2778 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002779 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002780 return 0;
2781}
2782
2783
Guido van Rossum96a42c81992-01-12 02:29:51 +00002784#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002785static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002786prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002787{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002788 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 if (PyObject_Print(v, stdout, 0) != 0)
2790 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002791 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002792 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002794#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002796static void
Fred Drake5755ce62001-06-27 19:19:46 +00002797call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002798{
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002800 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002802 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 value = Py_None;
2804 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002805 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002807 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002809 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002810 }
Fred Drake5755ce62001-06-27 19:19:46 +00002811 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002813 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002815 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 Py_XDECREF(type);
2817 Py_XDECREF(value);
2818 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002819 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002820}
2821
Fred Drake4ec5d562001-10-04 19:26:43 +00002822static void
2823call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2824 int what)
2825{
2826 PyObject *type, *value, *traceback;
2827 int err;
2828 PyErr_Fetch(&type, &value, &traceback);
2829 err = call_trace(func, obj, frame, what, NULL);
2830 if (err == 0)
2831 PyErr_Restore(type, value, traceback);
2832 else {
2833 Py_XDECREF(type);
2834 Py_XDECREF(value);
2835 Py_XDECREF(traceback);
2836 }
2837}
2838
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002839static int
Fred Drake5755ce62001-06-27 19:19:46 +00002840call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2841 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002842{
Fred Drake5755ce62001-06-27 19:19:46 +00002843 register PyThreadState *tstate = frame->f_tstate;
2844 int result;
2845 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002846 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002847 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002848 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002849 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002850 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2851 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002852 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002853 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002854}
2855
Michael W. Hudson006c7522002-11-08 13:08:46 +00002856static int
Michael W. Hudson019a78e2002-11-08 12:53:11 +00002857maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002858 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2859{
2860 /* The theory of SET_LINENO-less tracing.
2861
2862 In a nutshell, we use the co_lnotab field of the code object
2863 to tell when execution has moved onto a different line.
2864
2865 As mentioned above, the basic idea is so set things up so
2866 that
2867
2868 *instr_lb <= frame->f_lasti < *instr_ub
2869
2870 is true so long as execution does not change lines.
2871
2872 This is all fairly simple. Digging the information out of
2873 co_lnotab takes some work, but is conceptually clear.
2874
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002875 Somewhat harder to explain is why we don't *always* call the
2876 line trace function when the above test fails.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002877
2878 Consider this code:
2879
2880 1: def f(a):
2881 2: if a:
2882 3: print 1
2883 4: else:
2884 5: print 2
2885
2886 which compiles to this:
2887
2888 2 0 LOAD_FAST 0 (a)
2889 3 JUMP_IF_FALSE 9 (to 15)
2890 6 POP_TOP
2891
2892 3 7 LOAD_CONST 1 (1)
2893 10 PRINT_ITEM
2894 11 PRINT_NEWLINE
2895 12 JUMP_FORWARD 6 (to 21)
2896 >> 15 POP_TOP
2897
2898 5 16 LOAD_CONST 2 (2)
2899 19 PRINT_ITEM
2900 20 PRINT_NEWLINE
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002901 >> 21 LOAD_CONST 0 (None)
2902 24 RETURN_VALUE
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002903
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002904 If 'a' is false, execution will jump to instruction at offset
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002905 15 and the co_lnotab will claim that execution has moved to
2906 line 3. This is at best misleading. In this case we could
2907 associate the POP_TOP with line 4, but that doesn't make
2908 sense in all cases (I think).
2909
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002910 What we do is only call the line trace function if the co_lnotab
2911 indicates we have jumped to the *start* of a line, i.e. if the
2912 current instruction offset matches the offset given for the
2913 start of a line by the co_lnotab.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002914
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002915 This also takes care of the situation where 'a' is true.
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002916 Execution will jump from instruction offset 12 to offset 21.
2917 Then the co_lnotab would imply that execution has moved to line
2918 5, which is again misleading.
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002919
2920 Why do we set f_lineno when tracing? Well, consider the code
2921 above when 'a' is true. If stepping through this with 'n' in
2922 pdb, you would stop at line 1 with a "call" type event, then
2923 line events on lines 2 and 3, then a "return" type event -- but
2924 you would be shown line 5 during this event. This is a change
2925 from the behaviour in 2.2 and before, and I've found it
2926 confusing in practice. By setting and using f_lineno when
2927 tracing, one can report a line number different from that
2928 suggested by f_lasti on this one occasion where it's desirable.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002929 */
2930
Michael W. Hudson006c7522002-11-08 13:08:46 +00002931 int result = 0;
2932
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002933 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002934 PyCodeObject* co = frame->f_code;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002935 int size, addr, line;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002936 unsigned char* p;
2937
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002938 size = PyString_GET_SIZE(co->co_lnotab) / 2;
2939 p = (unsigned char*)PyString_AS_STRING(co->co_lnotab);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002940
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002941 addr = 0;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002942 line = co->co_firstlineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002943
2944 /* possible optimization: if f->f_lasti == instr_ub
2945 (likely to be a common case) then we already know
2946 instr_lb -- if we stored the matching value of p
2947 somwhere we could skip the first while loop. */
2948
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002949 /* see comments in compile.c for the description of
2950 co_lnotab. A point to remember: increments to p
2951 should come in pairs -- although we don't care about
2952 the line increments here, treating them as byte
2953 increments gets confusing, to say the least. */
2954
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002955 while (size > 0) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002956 if (addr + *p > frame->f_lasti)
2957 break;
2958 addr += *p++;
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002959 if (*p) *instr_lb = addr;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002960 line += *p++;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002961 --size;
2962 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002963
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002964 if (addr == frame->f_lasti) {
2965 frame->f_lineno = line;
Michael W. Hudson006c7522002-11-08 13:08:46 +00002966 result = call_trace(func, obj, frame,
2967 PyTrace_LINE, Py_None);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00002968 }
Michael W. Hudsonca803a02002-10-03 09:53:11 +00002969
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002970 if (size > 0) {
2971 while (--size >= 0) {
2972 addr += *p++;
2973 if (*p++)
2974 break;
2975 }
2976 *instr_ub = addr;
2977 }
2978 else {
2979 *instr_ub = INT_MAX;
2980 }
2981 }
Michael W. Hudson006c7522002-11-08 13:08:46 +00002982
2983 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002984}
2985
Fred Drake5755ce62001-06-27 19:19:46 +00002986void
2987PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002988{
Fred Drake5755ce62001-06-27 19:19:46 +00002989 PyThreadState *tstate = PyThreadState_Get();
2990 PyObject *temp = tstate->c_profileobj;
2991 Py_XINCREF(arg);
2992 tstate->c_profilefunc = NULL;
2993 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002994 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002995 Py_XDECREF(temp);
2996 tstate->c_profilefunc = func;
2997 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002998 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002999}
3000
3001void
3002PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3003{
3004 PyThreadState *tstate = PyThreadState_Get();
3005 PyObject *temp = tstate->c_traceobj;
3006 Py_XINCREF(arg);
3007 tstate->c_tracefunc = NULL;
3008 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003009 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003010 Py_XDECREF(temp);
3011 tstate->c_tracefunc = func;
3012 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003013 tstate->use_tracing = ((func != NULL)
3014 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003015}
3016
Guido van Rossumb209a111997-04-29 18:18:01 +00003017PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003018PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003019{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003020 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003021 if (current_frame == NULL)
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003022 return PyThreadState_Get()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003023 else
3024 return current_frame->f_builtins;
3025}
3026
Guido van Rossumb209a111997-04-29 18:18:01 +00003027PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003028PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003029{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003030 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003031 if (current_frame == NULL)
3032 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003033 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003034 return current_frame->f_locals;
3035}
3036
Guido van Rossumb209a111997-04-29 18:18:01 +00003037PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003038PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003039{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003040 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003041 if (current_frame == NULL)
3042 return NULL;
3043 else
3044 return current_frame->f_globals;
3045}
3046
Guido van Rossumb209a111997-04-29 18:18:01 +00003047PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003048PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003049{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003050 PyThreadState *tstate = PyThreadState_Get();
3051 return _PyThreadState_GetFrame((PyObject *)tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003052}
3053
Guido van Rossum6135a871995-01-09 17:53:26 +00003054int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003055PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003056{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003057 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003058 return current_frame == NULL ? 0 : current_frame->f_restricted;
3059}
3060
Guido van Rossumbe270261997-05-22 22:26:18 +00003061int
Tim Peters5ba58662001-07-16 02:29:45 +00003062PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003063{
Michael W. Hudson019a78e2002-11-08 12:53:11 +00003064 PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
Tim Peters5ba58662001-07-16 02:29:45 +00003065 int result = 0;
3066
3067 if (current_frame != NULL) {
3068 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003069 const int compilerflags = codeflags & PyCF_MASK;
3070 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003071 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003072 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003073 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003074#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003075 if (codeflags & CO_GENERATOR_ALLOWED) {
3076 result = 1;
3077 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3078 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003079#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003080 }
3081 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003082}
3083
3084int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003085Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086{
Guido van Rossumb209a111997-04-29 18:18:01 +00003087 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003088 if (f == NULL)
3089 return 0;
3090 if (!PyFile_SoftSpace(f, 0))
3091 return 0;
3092 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093}
3094
Guido van Rossum3f5da241990-12-20 15:06:42 +00003095
Guido van Rossum681d79a1995-07-18 14:51:37 +00003096/* External interface to call any callable object.
3097 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003098
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003099#undef PyEval_CallObject
3100/* for backward compatibility: export this interface */
3101
Guido van Rossumb209a111997-04-29 18:18:01 +00003102PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003103PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003104{
Guido van Rossumb209a111997-04-29 18:18:01 +00003105 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003106}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003107#define PyEval_CallObject(func,arg) \
3108 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003109
Guido van Rossumb209a111997-04-29 18:18:01 +00003110PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003111PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003112{
Jeremy Hylton52820442001-01-03 23:52:36 +00003113 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003114
3115 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003116 arg = PyTuple_New(0);
3117 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003118 PyErr_SetString(PyExc_TypeError,
3119 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003120 return NULL;
3121 }
3122 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003123 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003124
Guido van Rossumb209a111997-04-29 18:18:01 +00003125 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003126 PyErr_SetString(PyExc_TypeError,
3127 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003128 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003129 return NULL;
3130 }
3131
Tim Peters6d6c1a32001-08-02 04:15:00 +00003132 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003133 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003134 return result;
3135}
3136
Tim Peters6d6c1a32001-08-02 04:15:00 +00003137char *
3138PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003139{
3140 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003141 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003142 else if (PyFunction_Check(func))
3143 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3144 else if (PyCFunction_Check(func))
3145 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3146 else if (PyClass_Check(func))
3147 return PyString_AsString(((PyClassObject*)func)->cl_name);
3148 else if (PyInstance_Check(func)) {
3149 return PyString_AsString(
3150 ((PyInstanceObject*)func)->in_class->cl_name);
3151 } else {
3152 return func->ob_type->tp_name;
3153 }
3154}
3155
Tim Peters6d6c1a32001-08-02 04:15:00 +00003156char *
3157PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003158{
3159 if (PyMethod_Check(func))
3160 return "()";
3161 else if (PyFunction_Check(func))
3162 return "()";
3163 else if (PyCFunction_Check(func))
3164 return "()";
3165 else if (PyClass_Check(func))
3166 return " constructor";
3167 else if (PyInstance_Check(func)) {
3168 return " instance";
3169 } else {
3170 return " object";
3171 }
3172}
3173
Jeremy Hylton52820442001-01-03 23:52:36 +00003174#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3175
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003176static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003177err_args(PyObject *func, int flags, int nargs)
3178{
3179 if (flags & METH_NOARGS)
3180 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003181 "%.200s() takes no arguments (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003182 ((PyCFunctionObject *)func)->m_ml->ml_name,
3183 nargs);
3184 else
3185 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003186 "%.200s() takes exactly one argument (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003187 ((PyCFunctionObject *)func)->m_ml->ml_name,
3188 nargs);
3189}
3190
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003191static PyObject *
3192call_function(PyObject ***pp_stack, int oparg)
3193{
3194 int na = oparg & 0xff;
3195 int nk = (oparg>>8) & 0xff;
3196 int n = na + 2 * nk;
3197 PyObject **pfunc = (*pp_stack) - n - 1;
3198 PyObject *func = *pfunc;
3199 PyObject *x, *w;
3200
3201 /* Always dispatch PyCFunction first, because
3202 these are presumed to be the most frequent
3203 callable object.
3204 */
3205 if (PyCFunction_Check(func) && nk == 0) {
3206 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003207 if (flags & (METH_NOARGS | METH_O)) {
3208 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3209 PyObject *self = PyCFunction_GET_SELF(func);
3210 if (flags & METH_NOARGS && na == 0)
3211 x = (*meth)(self, NULL);
3212 else if (flags & METH_O && na == 1) {
3213 PyObject *arg = EXT_POP(*pp_stack);
3214 x = (*meth)(self, arg);
3215 Py_DECREF(arg);
3216 }
3217 else {
3218 err_args(func, flags, na);
3219 x = NULL;
3220 }
3221 }
3222 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003223 PyObject *callargs;
3224 callargs = load_args(pp_stack, na);
3225 x = PyCFunction_Call(func, callargs, NULL);
3226 Py_XDECREF(callargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003227 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003228 } else {
3229 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3230 /* optimize access to bound methods */
3231 PyObject *self = PyMethod_GET_SELF(func);
3232 Py_INCREF(self);
3233 func = PyMethod_GET_FUNCTION(func);
3234 Py_INCREF(func);
3235 Py_DECREF(*pfunc);
3236 *pfunc = self;
3237 na++;
3238 n++;
3239 } else
3240 Py_INCREF(func);
3241 if (PyFunction_Check(func))
3242 x = fast_function(func, pp_stack, n, na, nk);
3243 else
3244 x = do_call(func, pp_stack, na, nk);
3245 Py_DECREF(func);
3246 }
3247
3248 while ((*pp_stack) > pfunc) {
3249 w = EXT_POP(*pp_stack);
3250 Py_DECREF(w);
3251 }
3252 return x;
3253}
3254
Jeremy Hylton192690e2002-08-16 18:36:11 +00003255/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003256 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton52820442001-01-03 23:52:36 +00003257*/
3258
3259static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003260fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003261{
3262 PyObject *co = PyFunction_GET_CODE(func);
3263 PyObject *globals = PyFunction_GET_GLOBALS(func);
3264 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003265 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003266 PyObject **d = NULL;
3267 int nd = 0;
3268
3269 if (argdefs != NULL) {
3270 d = &PyTuple_GET_ITEM(argdefs, 0);
3271 nd = ((PyTupleObject *)argdefs)->ob_size;
3272 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003273 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003274 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003275 (*pp_stack)-2*nk, nk, d, nd,
3276 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003277}
3278
3279static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003280update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3281 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003282{
3283 PyObject *kwdict = NULL;
3284 if (orig_kwdict == NULL)
3285 kwdict = PyDict_New();
3286 else {
3287 kwdict = PyDict_Copy(orig_kwdict);
3288 Py_DECREF(orig_kwdict);
3289 }
3290 if (kwdict == NULL)
3291 return NULL;
3292 while (--nk >= 0) {
3293 int err;
3294 PyObject *value = EXT_POP(*pp_stack);
3295 PyObject *key = EXT_POP(*pp_stack);
3296 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003297 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003298 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003299 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003300 PyEval_GetFuncName(func),
3301 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003302 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003303 Py_DECREF(key);
3304 Py_DECREF(value);
3305 Py_DECREF(kwdict);
3306 return NULL;
3307 }
3308 err = PyDict_SetItem(kwdict, key, value);
3309 Py_DECREF(key);
3310 Py_DECREF(value);
3311 if (err) {
3312 Py_DECREF(kwdict);
3313 return NULL;
3314 }
3315 }
3316 return kwdict;
3317}
3318
3319static PyObject *
3320update_star_args(int nstack, int nstar, PyObject *stararg,
3321 PyObject ***pp_stack)
3322{
3323 PyObject *callargs, *w;
3324
3325 callargs = PyTuple_New(nstack + nstar);
3326 if (callargs == NULL) {
3327 return NULL;
3328 }
3329 if (nstar) {
3330 int i;
3331 for (i = 0; i < nstar; i++) {
3332 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3333 Py_INCREF(a);
3334 PyTuple_SET_ITEM(callargs, nstack + i, a);
3335 }
3336 }
3337 while (--nstack >= 0) {
3338 w = EXT_POP(*pp_stack);
3339 PyTuple_SET_ITEM(callargs, nstack, w);
3340 }
3341 return callargs;
3342}
3343
3344static PyObject *
3345load_args(PyObject ***pp_stack, int na)
3346{
3347 PyObject *args = PyTuple_New(na);
3348 PyObject *w;
3349
3350 if (args == NULL)
3351 return NULL;
3352 while (--na >= 0) {
3353 w = EXT_POP(*pp_stack);
3354 PyTuple_SET_ITEM(args, na, w);
3355 }
3356 return args;
3357}
3358
3359static PyObject *
3360do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3361{
3362 PyObject *callargs = NULL;
3363 PyObject *kwdict = NULL;
3364 PyObject *result = NULL;
3365
3366 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003367 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003368 if (kwdict == NULL)
3369 goto call_fail;
3370 }
3371 callargs = load_args(pp_stack, na);
3372 if (callargs == NULL)
3373 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003374 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003375 call_fail:
3376 Py_XDECREF(callargs);
3377 Py_XDECREF(kwdict);
3378 return result;
3379}
3380
3381static PyObject *
3382ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3383{
3384 int nstar = 0;
3385 PyObject *callargs = NULL;
3386 PyObject *stararg = NULL;
3387 PyObject *kwdict = NULL;
3388 PyObject *result = NULL;
3389
3390 if (flags & CALL_FLAG_KW) {
3391 kwdict = EXT_POP(*pp_stack);
3392 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003393 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003394 "%s%s argument after ** "
3395 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003396 PyEval_GetFuncName(func),
3397 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003398 goto ext_call_fail;
3399 }
3400 }
3401 if (flags & CALL_FLAG_VAR) {
3402 stararg = EXT_POP(*pp_stack);
3403 if (!PyTuple_Check(stararg)) {
3404 PyObject *t = NULL;
3405 t = PySequence_Tuple(stararg);
3406 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003407 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3408 PyErr_Format(PyExc_TypeError,
3409 "%s%s argument after * "
3410 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003411 PyEval_GetFuncName(func),
3412 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003413 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003414 goto ext_call_fail;
3415 }
3416 Py_DECREF(stararg);
3417 stararg = t;
3418 }
3419 nstar = PyTuple_GET_SIZE(stararg);
3420 }
3421 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003422 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003423 if (kwdict == NULL)
3424 goto ext_call_fail;
3425 }
3426 callargs = update_star_args(na, nstar, stararg, pp_stack);
3427 if (callargs == NULL)
3428 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003429 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003430 ext_call_fail:
3431 Py_XDECREF(callargs);
3432 Py_XDECREF(kwdict);
3433 Py_XDECREF(stararg);
3434 return result;
3435}
3436
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003437#define SLICE_ERROR_MSG \
3438 "standard sequence type does not support step size other than one"
3439
Tim Peterscb479e72001-12-16 19:11:44 +00003440/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3441 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3442 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3443*/
Tim Petersb5196382001-12-16 19:44:20 +00003444/* Note: If v is NULL, return success without storing into *pi. This
3445 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3446 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003447*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003448int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003449_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450{
Tim Petersb5196382001-12-16 19:44:20 +00003451 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003452 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003453 if (PyInt_Check(v)) {
3454 x = PyInt_AsLong(v);
3455 } else if (PyLong_Check(v)) {
3456 x = PyLong_AsLong(v);
3457 if (x==-1 && PyErr_Occurred()) {
3458 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003459 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003460
Guido van Rossumac7be682001-01-17 15:42:30 +00003461 if (!PyErr_ExceptionMatches(
3462 PyExc_OverflowError)) {
3463 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003464 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003465 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003466 }
3467
Guido van Rossumac7be682001-01-17 15:42:30 +00003468 /* Clear the OverflowError */
3469 PyErr_Clear();
3470
3471 /* It's an overflow error, so we need to
3472 check the sign of the long integer,
3473 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003474 the error. */
3475
3476 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003477 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003478 if (long_zero == NULL)
3479 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003480
3481 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003482 cmp = PyObject_RichCompareBool(v, long_zero,
3483 Py_GT);
3484 Py_DECREF(long_zero);
3485 if (cmp < 0)
3486 return 0;
3487 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003488 x = INT_MAX;
3489 else
3490 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003491 }
3492 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003493 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003494 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003495 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003497 /* Truncate -- very long indices are truncated anyway */
3498 if (x > INT_MAX)
3499 x = INT_MAX;
3500 else if (x < -INT_MAX)
Michael W. Hudsoncbd6fb92002-11-06 15:17:32 +00003501 x = -INT_MAX;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003502 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003504 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505}
3506
Guido van Rossum50d756e2001-08-18 17:43:36 +00003507#undef ISINT
3508#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3509
Guido van Rossumb209a111997-04-29 18:18:01 +00003510static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003511apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003513 PyTypeObject *tp = u->ob_type;
3514 PySequenceMethods *sq = tp->tp_as_sequence;
3515
3516 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3517 int ilow = 0, ihigh = INT_MAX;
3518 if (!_PyEval_SliceIndex(v, &ilow))
3519 return NULL;
3520 if (!_PyEval_SliceIndex(w, &ihigh))
3521 return NULL;
3522 return PySequence_GetSlice(u, ilow, ihigh);
3523 }
3524 else {
3525 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003526 if (slice != NULL) {
3527 PyObject *res = PyObject_GetItem(u, slice);
3528 Py_DECREF(slice);
3529 return res;
3530 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003531 else
3532 return NULL;
3533 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003535
3536static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003537assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3538 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003539{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003540 PyTypeObject *tp = u->ob_type;
3541 PySequenceMethods *sq = tp->tp_as_sequence;
3542
3543 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3544 int ilow = 0, ihigh = INT_MAX;
3545 if (!_PyEval_SliceIndex(v, &ilow))
3546 return -1;
3547 if (!_PyEval_SliceIndex(w, &ihigh))
3548 return -1;
3549 if (x == NULL)
3550 return PySequence_DelSlice(u, ilow, ihigh);
3551 else
3552 return PySequence_SetSlice(u, ilow, ihigh, x);
3553 }
3554 else {
3555 PyObject *slice = PySlice_New(v, w, NULL);
3556 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003557 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003558 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003559 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003560 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003561 res = PyObject_DelItem(u, slice);
3562 Py_DECREF(slice);
3563 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003564 }
3565 else
3566 return -1;
3567 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568}
3569
Guido van Rossumb209a111997-04-29 18:18:01 +00003570static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003571cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572{
Guido van Rossumac7be682001-01-17 15:42:30 +00003573 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003574 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003575 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003576 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003577 break;
3578 case PyCmp_IS_NOT:
3579 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003580 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003581 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003582 res = PySequence_Contains(w, v);
3583 if (res < 0)
3584 return NULL;
3585 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003586 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003587 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003588 if (res < 0)
3589 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003590 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003592 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003593 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003594 break;
3595 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003596 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003597 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003598 v = res ? Py_True : Py_False;
3599 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600 return v;
3601}
3602
Thomas Wouters52152252000-08-17 22:55:00 +00003603static PyObject *
3604import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003605{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003606 PyObject *x;
3607
3608 x = PyObject_GetAttr(v, name);
3609 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003610 PyErr_Format(PyExc_ImportError,
3611 "cannot import name %.230s",
3612 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003613 }
Thomas Wouters52152252000-08-17 22:55:00 +00003614 return x;
3615}
Guido van Rossumac7be682001-01-17 15:42:30 +00003616
Thomas Wouters52152252000-08-17 22:55:00 +00003617static int
3618import_all_from(PyObject *locals, PyObject *v)
3619{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003620 PyObject *all = PyObject_GetAttrString(v, "__all__");
3621 PyObject *dict, *name, *value;
3622 int skip_leading_underscores = 0;
3623 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003624
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003625 if (all == NULL) {
3626 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3627 return -1; /* Unexpected error */
3628 PyErr_Clear();
3629 dict = PyObject_GetAttrString(v, "__dict__");
3630 if (dict == NULL) {
3631 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3632 return -1;
3633 PyErr_SetString(PyExc_ImportError,
3634 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003635 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003636 }
3637 all = PyMapping_Keys(dict);
3638 Py_DECREF(dict);
3639 if (all == NULL)
3640 return -1;
3641 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003642 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003643
3644 for (pos = 0, err = 0; ; pos++) {
3645 name = PySequence_GetItem(all, pos);
3646 if (name == NULL) {
3647 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3648 err = -1;
3649 else
3650 PyErr_Clear();
3651 break;
3652 }
3653 if (skip_leading_underscores &&
3654 PyString_Check(name) &&
3655 PyString_AS_STRING(name)[0] == '_')
3656 {
3657 Py_DECREF(name);
3658 continue;
3659 }
3660 value = PyObject_GetAttr(v, name);
3661 if (value == NULL)
3662 err = -1;
3663 else
3664 err = PyDict_SetItem(locals, name, value);
3665 Py_DECREF(name);
3666 Py_XDECREF(value);
3667 if (err != 0)
3668 break;
3669 }
3670 Py_DECREF(all);
3671 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003672}
3673
Guido van Rossumb209a111997-04-29 18:18:01 +00003674static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003675build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003676{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003677 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003678
3679 if (PyDict_Check(methods))
3680 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003681 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003682 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003683 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3684 base = PyTuple_GET_ITEM(bases, 0);
3685 metaclass = PyObject_GetAttrString(base, "__class__");
3686 if (metaclass == NULL) {
3687 PyErr_Clear();
3688 metaclass = (PyObject *)base->ob_type;
3689 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003690 }
3691 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003692 else {
3693 PyObject *g = PyEval_GetGlobals();
3694 if (g != NULL && PyDict_Check(g))
3695 metaclass = PyDict_GetItemString(g, "__metaclass__");
3696 if (metaclass == NULL)
3697 metaclass = (PyObject *) &PyClass_Type;
3698 Py_INCREF(metaclass);
3699 }
3700 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3701 Py_DECREF(metaclass);
3702 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003703}
3704
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003705static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003706exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3707 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003708{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003709 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003710 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003711 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003712
Guido van Rossumb209a111997-04-29 18:18:01 +00003713 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3714 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003715 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003716 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003717 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003718 locals = PyTuple_GetItem(prog, 2);
3719 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003720 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003721 if (globals == Py_None) {
3722 globals = PyEval_GetGlobals();
3723 if (locals == Py_None) {
3724 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003725 plain = 1;
3726 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003727 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003728 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003729 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003730 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003731 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003732 !PyCode_Check(prog) &&
3733 !PyFile_Check(prog)) {
3734 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003735 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003736 return -1;
3737 }
Fred Drake661ea262000-10-24 19:57:45 +00003738 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003739 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003740 "exec: arg 2 must be a dictionary or None");
3741 return -1;
3742 }
3743 if (!PyDict_Check(locals)) {
3744 PyErr_SetString(PyExc_TypeError,
3745 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003746 return -1;
3747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003748 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003749 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003750 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003751 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3752 PyErr_SetString(PyExc_TypeError,
3753 "code object passed to exec may not contain free variables");
3754 return -1;
3755 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003756 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003757 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003758 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003759 FILE *fp = PyFile_AsFile(prog);
3760 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003761 PyCompilerFlags cf;
3762 cf.cf_flags = 0;
3763 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003764 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3765 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003766 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003767 v = PyRun_File(fp, name, Py_file_input, globals,
3768 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003769 }
3770 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003771 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003772 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003773 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003774 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003775 cf.cf_flags = 0;
3776 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003777 v = PyRun_StringFlags(str, Py_file_input, globals,
3778 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003779 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003780 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003781 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003782 if (plain)
3783 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003784 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003785 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003786 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003787 return 0;
3788}
Guido van Rossum24c13741995-02-14 09:42:43 +00003789
Guido van Rossumac7be682001-01-17 15:42:30 +00003790static void
Paul Prescode68140d2000-08-30 20:25:01 +00003791format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3792{
3793 char *obj_str;
3794
3795 if (!obj)
3796 return;
3797
3798 obj_str = PyString_AsString(obj);
3799 if (!obj_str)
3800 return;
3801
3802 PyErr_Format(exc, format_str, obj_str);
3803}
Guido van Rossum950361c1997-01-24 13:49:28 +00003804
3805#ifdef DYNAMIC_EXECUTION_PROFILE
3806
Skip Montanarof118cb12001-10-15 20:51:38 +00003807static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003808getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003809{
3810 int i;
3811 PyObject *l = PyList_New(256);
3812 if (l == NULL) return NULL;
3813 for (i = 0; i < 256; i++) {
3814 PyObject *x = PyInt_FromLong(a[i]);
3815 if (x == NULL) {
3816 Py_DECREF(l);
3817 return NULL;
3818 }
3819 PyList_SetItem(l, i, x);
3820 }
3821 for (i = 0; i < 256; i++)
3822 a[i] = 0;
3823 return l;
3824}
3825
3826PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003827_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003828{
3829#ifndef DXPAIRS
3830 return getarray(dxp);
3831#else
3832 int i;
3833 PyObject *l = PyList_New(257);
3834 if (l == NULL) return NULL;
3835 for (i = 0; i < 257; i++) {
3836 PyObject *x = getarray(dxpairs[i]);
3837 if (x == NULL) {
3838 Py_DECREF(l);
3839 return NULL;
3840 }
3841 PyList_SetItem(l, i, x);
3842 }
3843 return l;
3844#endif
3845}
3846
3847#endif