blob: 6985846cc6f43f8023329aced51cec52c7d5fffd [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 Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000054static void maybe_call_line_trace(int, Py_tracefunc, PyObject *,
55 PyFrameObject *, int *, int *);
56
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
58static int assign_slice(PyObject *, PyObject *,
59 PyObject *, PyObject *);
60static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000061static PyObject *import_from(PyObject *, PyObject *);
62static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static PyObject *build_class(PyObject *, PyObject *, PyObject *);
64static int exec_statement(PyFrameObject *,
65 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000066static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
67static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000068static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000069
Paul Prescode68140d2000-08-30 20:25:01 +000070#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000071 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000072#define GLOBAL_NAME_ERROR_MSG \
73 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000074#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000075 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000076#define UNBOUNDFREE_ERROR_MSG \
77 "free variable '%.200s' referenced before assignment" \
78 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000079
Guido van Rossum950361c1997-01-24 13:49:28 +000080/* Dynamic execution profile */
81#ifdef DYNAMIC_EXECUTION_PROFILE
82#ifdef DXPAIRS
83static long dxpairs[257][256];
84#define dxp dxpairs[256]
85#else
86static long dxp[256];
87#endif
88#endif
89
Jeremy Hylton938ace62002-07-17 16:30:39 +000090static PyTypeObject gentype;
Tim Peters5ca576e2001-06-18 22:08:13 +000091
92typedef struct {
93 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000094 /* The gi_ prefix is intended to remind of generator-iterator. */
95
96 PyFrameObject *gi_frame;
97
Tim Peterse77f2e22001-06-26 22:24:51 +000098 /* True if generator is being executed. */
99 int gi_running;
Fred Drake72bc4562002-08-09 18:35:52 +0000100
101 /* List of weak reference. */
102 PyObject *gi_weakreflist;
Tim Peters5ca576e2001-06-18 22:08:13 +0000103} genobject;
104
105static PyObject *
106gen_new(PyFrameObject *f)
107{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000108 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000109 if (gen == NULL) {
110 Py_DECREF(f);
111 return NULL;
112 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000113 gen->gi_frame = f;
114 gen->gi_running = 0;
Fred Drake72bc4562002-08-09 18:35:52 +0000115 gen->gi_weakreflist = NULL;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000116 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000117 return (PyObject *)gen;
118}
119
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000120static int
121gen_traverse(genobject *gen, visitproc visit, void *arg)
122{
123 return visit((PyObject *)gen->gi_frame, arg);
124}
125
Tim Peters5ca576e2001-06-18 22:08:13 +0000126static void
127gen_dealloc(genobject *gen)
128{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000129 _PyObject_GC_UNTRACK(gen);
Fred Drake72bc4562002-08-09 18:35:52 +0000130 if (gen->gi_weakreflist != NULL)
131 PyObject_ClearWeakRefs((PyObject *) gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000133 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000134}
135
136static PyObject *
137gen_iternext(genobject *gen)
138{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000139 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000140 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 PyObject *result;
142
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000143 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000144 PyErr_SetString(PyExc_ValueError,
145 "generator already executing");
146 return NULL;
147 }
Tim Peters8c963692001-06-23 05:26:56 +0000148 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000150
151 /* Generators always return to their most recent caller, not
152 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000153 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000154 assert(f->f_back == NULL);
155 f->f_back = tstate->frame;
156
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000157 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000158 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000159 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000160
161 /* Don't keep the reference to f_back any longer than necessary. It
162 * may keep a chain of frames alive or it could create a reference
163 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000164 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000165 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166
Tim Petersad1a18b2001-06-23 06:19:16 +0000167 /* If the generator just returned (as opposed to yielding), signal
168 * that the generator is exhausted. */
169 if (result == Py_None && f->f_stacktop == NULL) {
170 Py_DECREF(result);
171 result = NULL;
172 }
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000175}
176
177static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000178gen_getiter(PyObject *gen)
179{
180 Py_INCREF(gen);
181 return gen;
182}
183
Guido van Rossum6f799372001-09-20 20:46:19 +0000184static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000185 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
186 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
187 {NULL} /* Sentinel */
188};
Tim Peters5ca576e2001-06-18 22:08:13 +0000189
Tim Peters0c322792002-07-17 16:49:03 +0000190static PyTypeObject gentype = {
Tim Peters5ca576e2001-06-18 22:08:13 +0000191 PyObject_HEAD_INIT(&PyType_Type)
192 0, /* ob_size */
193 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000194 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000195 0, /* tp_itemsize */
196 /* methods */
197 (destructor)gen_dealloc, /* tp_dealloc */
198 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000199 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000200 0, /* tp_setattr */
201 0, /* tp_compare */
202 0, /* tp_repr */
203 0, /* tp_as_number */
204 0, /* tp_as_sequence */
205 0, /* tp_as_mapping */
206 0, /* tp_hash */
207 0, /* tp_call */
208 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000209 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000210 0, /* tp_setattro */
211 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000212 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000214 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000215 0, /* tp_clear */
216 0, /* tp_richcompare */
Fred Drake72bc4562002-08-09 18:35:52 +0000217 offsetof(genobject, gi_weakreflist), /* tp_weaklistoffset */
Tim Peters5ca576e2001-06-18 22:08:13 +0000218 (getiterfunc)gen_getiter, /* tp_iter */
219 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Petersa64295b2002-07-17 00:15:22 +0000220 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 gen_memberlist, /* tp_members */
222 0, /* tp_getset */
223 0, /* tp_base */
224 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225};
226
227
Guido van Rossume59214e1994-08-30 08:01:59 +0000228#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000229
Guido van Rossum2571cc81999-04-07 16:07:23 +0000230#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000231#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000232#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000233#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000234
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235extern int _PyThread_Started; /* Flag for Py_Exit */
236
Guido van Rossum65d5b571998-12-21 19:32:43 +0000237static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000238static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000239
240void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000242{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000244 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000246 interpreter_lock = PyThread_allocate_lock();
247 PyThread_acquire_lock(interpreter_lock, 1);
248 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000250
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000254 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255}
256
257void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000259{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000260 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261}
262
263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000265{
266 if (tstate == NULL)
267 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000269 if (PyThreadState_Swap(tstate) != NULL)
270 Py_FatalError(
271 "PyEval_AcquireThread: non-NULL old thread state");
272}
273
274void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000276{
277 if (tstate == NULL)
278 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
279 if (PyThreadState_Swap(NULL) != tstate)
280 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000283
284/* This function is called from PyOS_AfterFork to ensure that newly
285 created child processes don't hold locks referring to threads which
286 are not running in the child process. (This could also be done using
287 pthread_atfork mechanism, at least for the pthreads implementation.) */
288
289void
290PyEval_ReInitThreads(void)
291{
292 if (!interpreter_lock)
293 return;
294 /*XXX Can't use PyThread_free_lock here because it does too
295 much error-checking. Doing this cleanly would require
296 adding a new function to each thread_*.h. Instead, just
297 create a new lock and waste a little bit of memory */
298 interpreter_lock = PyThread_allocate_lock();
299 PyThread_acquire_lock(interpreter_lock, 1);
300 main_thread = PyThread_get_thread_ident();
301}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302#endif
303
Guido van Rossumff4949e1992-08-05 19:58:53 +0000304/* Functions save_thread and restore_thread are always defined so
305 dynamically loaded modules needn't be compiled separately for use
306 with and without threads: */
307
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000308PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000309PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000311 PyThreadState *tstate = PyThreadState_Swap(NULL);
312 if (tstate == NULL)
313 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000314#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000315 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000318 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319}
320
321void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 if (tstate == NULL)
325 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 }
332#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336
Guido van Rossuma9672091994-09-14 13:31:22 +0000337/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
338 signal handlers or Mac I/O completion routines) can schedule calls
339 to a function to be called synchronously.
340 The synchronous function is called with one void* argument.
341 It should return 0 for success or -1 for failure -- failure should
342 be accompanied by an exception.
343
344 If registry succeeds, the registry function returns 0; if it fails
345 (e.g. due to too many pending calls) it returns -1 (without setting
346 an exception condition).
347
348 Note that because registry may occur from within signal handlers,
349 or other asynchronous events, calling malloc() is unsafe!
350
351#ifdef WITH_THREAD
352 Any thread can schedule pending calls, but only the main thread
353 will execute them.
354#endif
355
356 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
357 There are two possible race conditions:
358 (1) nested asynchronous registry calls;
359 (2) registry calls made while pending calls are being processed.
360 While (1) is very unlikely, (2) is a real possibility.
361 The current code is safe against (2), but not against (1).
362 The safety against (2) is derived from the fact that only one
363 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000364
Guido van Rossuma027efa1997-05-05 20:56:21 +0000365 XXX Darn! With the advent of thread state, we should have an array
366 of pending calls per thread in the thread state! Later...
367*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000368
Guido van Rossuma9672091994-09-14 13:31:22 +0000369#define NPENDINGCALLS 32
370static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000371 int (*func)(void *);
372 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373} pendingcalls[NPENDINGCALLS];
374static volatile int pendingfirst = 0;
375static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
378int
Thomas Wouters334fb892000-07-25 12:56:38 +0000379Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000380{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 int i, j;
383 /* XXX Begin critical section */
384 /* XXX If you want this to be safe against nested
385 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 if (busy)
387 return -1;
388 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389 i = pendinglast;
390 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000391 if (j == pendingfirst) {
392 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000393 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000394 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 pendingcalls[i].func = func;
396 pendingcalls[i].arg = arg;
397 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000398 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000399 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000400 /* XXX End critical section */
401 return 0;
402}
403
Guido van Rossum180d7b41994-09-29 09:45:57 +0000404int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000405Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000406{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000407 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000408#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000409 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000410 return 0;
411#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000412 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000413 return 0;
414 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000416 for (;;) {
417 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000418 int (*func)(void *);
419 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 i = pendingfirst;
421 if (i == pendinglast)
422 break; /* Queue empty */
423 func = pendingcalls[i].func;
424 arg = pendingcalls[i].arg;
425 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000426 if (func(arg) < 0) {
427 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000428 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000429 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000430 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000432 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000433 return 0;
434}
435
436
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000437/* The interpreter's recursion limit */
438
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000439static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000440
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000441int
442Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000443{
444 return recursion_limit;
445}
446
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000447void
448Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000449{
450 recursion_limit = new_limit;
451}
452
Guido van Rossum374a9221991-04-04 10:40:29 +0000453/* Status code for main loop (reason for stack unwind) */
454
455enum why_code {
456 WHY_NOT, /* No error */
457 WHY_EXCEPTION, /* Exception occurred */
458 WHY_RERAISE, /* Exception re-raised by 'finally' */
459 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000460 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000461 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000462 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000463};
464
Tim Petersdbd9ba62000-07-09 03:09:57 +0000465static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000466static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000467
Guido van Rossum374a9221991-04-04 10:40:29 +0000468
Guido van Rossumb209a111997-04-29 18:18:01 +0000469PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000470PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000474 (PyObject **)NULL, 0,
475 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000476 (PyObject **)NULL, 0,
477 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478}
479
480
481/* Interpreter main loop */
482
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000484eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000485{
Guido van Rossum950361c1997-01-24 13:49:28 +0000486#ifdef DXPAIRS
487 int lastopcode = 0;
488#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000489 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000490 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000491 register int opcode=0; /* Current opcode */
492 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000493 register enum why_code why; /* Reason for block stack unwind */
494 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000495 register PyObject *x; /* Result object -- NULL if error */
496 register PyObject *v; /* Temporary objects popped off stack */
497 register PyObject *w;
498 register PyObject *u;
499 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000500 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000501 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000502 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000503 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000504 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000505
506 /* when tracing we set things up so that
507
508 not (instr_lb <= current_bytecode_offset < instr_ub)
509
510 is true when the line being executed has changed. The
511 initial values are such as to make this false the first
512 time it is tested. */
513 int instr_ub = -1, instr_lb = 0;
514
Guido van Rossumd076c731998-10-07 19:42:25 +0000515 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000516 PyObject *names;
517 PyObject *consts;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000518#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000519 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000520#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000521#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000522 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000523 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000524#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000525
Neal Norwitza81d2202002-07-14 00:27:26 +0000526/* Tuple access macros */
527
528#ifndef Py_DEBUG
529#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
530#else
531#define GETITEM(v, i) PyTuple_GetItem((v), (i))
532#endif
533
Guido van Rossum374a9221991-04-04 10:40:29 +0000534/* Code access macros */
535
Guido van Rossumd076c731998-10-07 19:42:25 +0000536#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000537#define NEXTOP() (*next_instr++)
538#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000539#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000540#define JUMPBY(x) (next_instr += (x))
541
542/* Stack manipulation macros */
543
544#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
545#define EMPTY() (STACK_LEVEL() == 0)
546#define TOP() (stack_pointer[-1])
547#define BASIC_PUSH(v) (*stack_pointer++ = (v))
548#define BASIC_POP() (*--stack_pointer)
549
Guido van Rossum96a42c81992-01-12 02:29:51 +0000550#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000551#define PUSH(v) { (void)(BASIC_PUSH(v), \
552 lltrace && prtrace(TOP(), "push")); \
553 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000554#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000555#else
556#define PUSH(v) BASIC_PUSH(v)
557#define POP() BASIC_POP()
558#endif
559
Guido van Rossum681d79a1995-07-18 14:51:37 +0000560/* Local variable macros */
561
562#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000563
564/* The SETLOCAL() macro must not DECREF the local variable in-place and
565 then store the new value; it must copy the old value to a temporary
566 value, then store the new value, and then DECREF the temporary value.
567 This is because it is possible that during the DECREF the frame is
568 accessed by other code (e.g. a __del__ method or gc.collect()) and the
569 variable would be pointing to already-freed memory. */
570#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
571 GETLOCAL(i) = value; \
572 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000573
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574/* Start of code */
575
Tim Peters5ca576e2001-06-18 22:08:13 +0000576 if (f == NULL)
577 return NULL;
578
Guido van Rossum8861b741996-07-30 16:49:37 +0000579#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000580 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000581 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000582 return NULL;
583 }
584#endif
585
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000587 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000588 --tstate->recursion_depth;
589 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000590 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000591 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000592 return NULL;
593 }
594
Tim Peters5ca576e2001-06-18 22:08:13 +0000595 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000596 co = f->f_code;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000597 names = co->co_names;
598 consts = co->co_consts;
Tim Peters5ca576e2001-06-18 22:08:13 +0000599 fastlocals = f->f_localsplus;
600 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000601 _PyCode_GETCODEPTR(co, &first_instr);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000602 if (f->f_lasti < 0) {
603 next_instr = first_instr;
604 }
605 else {
606 next_instr = first_instr + f->f_lasti;
607 }
Tim Peters8c963692001-06-23 05:26:56 +0000608 stack_pointer = f->f_stacktop;
609 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000610 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000611
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000612 if (tstate->use_tracing) {
613 if (tstate->c_tracefunc != NULL) {
614 /* tstate->c_tracefunc, if defined, is a
615 function that will be called on *every* entry
616 to a code block. Its return value, if not
617 None, is a function that will be called at
618 the start of each executed line of code.
619 (Actually, the function must return itself
620 in order to continue tracing.) The trace
621 functions are called with three arguments:
622 a pointer to the current frame, a string
623 indicating why the function is called, and
624 an argument which depends on the situation.
625 The global trace function is also called
626 whenever an exception is detected. */
627 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
628 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000629 /* Trace function raised an error */
630 return NULL;
631 }
632 }
633 if (tstate->c_profilefunc != NULL) {
634 /* Similar for c_profilefunc, except it needn't
635 return itself and isn't called for "line" events */
636 if (call_trace(tstate->c_profilefunc,
637 tstate->c_profileobj,
638 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000639 /* Profile function raised an error */
640 return NULL;
641 }
642 }
643 }
644
Tim Peters5ca576e2001-06-18 22:08:13 +0000645#ifdef LLTRACE
646 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
647#endif
648#if defined(Py_DEBUG) || defined(LLTRACE)
649 filename = PyString_AsString(co->co_filename);
650#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000651
Guido van Rossum374a9221991-04-04 10:40:29 +0000652 why = WHY_NOT;
653 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000654 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000655 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000656
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 for (;;) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000658 assert(stack_pointer >= f->f_valuestack); /* else underflow */
659 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
660
Guido van Rossuma027efa1997-05-05 20:56:21 +0000661 /* Do periodic things. Doing this every time through
662 the loop would add too much overhead, so we do it
663 only every Nth instruction. We also do it if
664 ``things_to_do'' is set, i.e. when an asynchronous
665 event needs attention (e.g. a signal handler or
666 async I/O handler); see Py_AddPendingCall() and
667 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000668
Guido van Rossuma027efa1997-05-05 20:56:21 +0000669 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000670 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000671 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000672 if (Py_MakePendingCalls() < 0) {
673 why = WHY_EXCEPTION;
674 goto on_error;
675 }
676 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000677#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000678 /* If we have true signals, the signal handler
679 will call Py_AddPendingCall() so we don't
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000680 have to call PyErr_CheckSignals(). On the
681 Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000682 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 goto on_error;
685 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000686#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000687
Guido van Rossume59214e1994-08-30 08:01:59 +0000688#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000689 if (interpreter_lock) {
690 /* Give another thread a chance */
691
Guido van Rossum25ce5661997-08-02 03:10:38 +0000692 if (PyThreadState_Swap(NULL) != tstate)
693 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000694 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000695
696 /* Other threads may run now */
697
Guido van Rossum65d5b571998-12-21 19:32:43 +0000698 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000699 if (PyThreadState_Swap(tstate) != NULL)
700 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000701 }
702#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000704
Neil Schemenauer63543862002-02-17 19:10:14 +0000705 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000707
Guido van Rossum99bec951992-09-03 20:29:45 +0000708 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000709
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 opcode = NEXTOP();
711 if (HAS_ARG(opcode))
712 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000713 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000714#ifdef DYNAMIC_EXECUTION_PROFILE
715#ifdef DXPAIRS
716 dxpairs[lastopcode][opcode]++;
717 lastopcode = opcode;
718#endif
719 dxp[opcode]++;
720#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000721
Guido van Rossum96a42c81992-01-12 02:29:51 +0000722#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000724
Guido van Rossum96a42c81992-01-12 02:29:51 +0000725 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 if (HAS_ARG(opcode)) {
727 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000728 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 }
730 else {
731 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000732 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 }
734 }
735#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000736
737 /* line-by-line tracing support */
738
739 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
740 /* see maybe_call_line_trace
741 for expository comments */
742 maybe_call_line_trace(opcode,
743 tstate->c_tracefunc,
744 tstate->c_traceobj,
745 f, &instr_lb, &instr_ub);
746 }
747
Guido van Rossum374a9221991-04-04 10:40:29 +0000748 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000749
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000751
Guido van Rossum374a9221991-04-04 10:40:29 +0000752 /* BEWARE!
753 It is essential that any operation that fails sets either
754 x to NULL, err to nonzero, or why to anything but WHY_NOT,
755 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000756
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000758
Neil Schemenauer63543862002-02-17 19:10:14 +0000759 case LOAD_FAST:
760 x = GETLOCAL(oparg);
761 if (x != NULL) {
762 Py_INCREF(x);
763 PUSH(x);
764 goto fast_next_opcode;
765 }
766 format_exc_check_arg(PyExc_UnboundLocalError,
767 UNBOUNDLOCAL_ERROR_MSG,
768 PyTuple_GetItem(co->co_varnames, oparg));
769 break;
770
771 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000772 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000773 Py_INCREF(x);
774 PUSH(x);
775 goto fast_next_opcode;
776
777 case STORE_FAST:
778 v = POP();
779 SETLOCAL(oparg, v);
780 goto fast_next_opcode;
781
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 case POP_TOP:
783 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000784 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000785 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000786
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 case ROT_TWO:
788 v = POP();
789 w = POP();
790 PUSH(v);
791 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000792 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000793
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 case ROT_THREE:
795 v = POP();
796 w = POP();
797 x = POP();
798 PUSH(v);
799 PUSH(x);
800 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000801 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000802
Thomas Wouters434d0822000-08-24 20:11:32 +0000803 case ROT_FOUR:
804 u = POP();
805 v = POP();
806 w = POP();
807 x = POP();
808 PUSH(u);
809 PUSH(x);
810 PUSH(w);
811 PUSH(v);
812 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000813
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 case DUP_TOP:
815 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000816 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000818 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000819
Thomas Wouters434d0822000-08-24 20:11:32 +0000820 case DUP_TOPX:
821 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000822 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000823 x = TOP();
824 Py_INCREF(x);
825 PUSH(x);
826 continue;
827 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000828 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000829 Py_INCREF(x);
830 w = TOP();
831 Py_INCREF(w);
832 PUSH(x);
833 PUSH(w);
834 PUSH(x);
835 continue;
836 case 3:
837 x = POP();
838 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000839 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000840 Py_INCREF(w);
841 v = TOP();
842 Py_INCREF(v);
843 PUSH(w);
844 PUSH(x);
845 PUSH(v);
846 PUSH(w);
847 PUSH(x);
848 continue;
849 case 4:
850 x = POP();
851 Py_INCREF(x);
852 w = POP();
853 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000854 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000855 Py_INCREF(v);
856 u = TOP();
857 Py_INCREF(u);
858 PUSH(v);
859 PUSH(w);
860 PUSH(x);
861 PUSH(u);
862 PUSH(v);
863 PUSH(w);
864 PUSH(x);
865 continue;
866 case 5:
867 x = POP();
868 Py_INCREF(x);
869 w = POP();
870 Py_INCREF(w);
871 v = POP();
872 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000873 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000874 Py_INCREF(u);
875 t = TOP();
876 Py_INCREF(t);
877 PUSH(u);
878 PUSH(v);
879 PUSH(w);
880 PUSH(x);
881 PUSH(t);
882 PUSH(u);
883 PUSH(v);
884 PUSH(w);
885 PUSH(x);
886 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000887 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000888 Py_FatalError("invalid argument to DUP_TOPX"
889 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000890 }
Tim Peters35ba6892000-10-11 07:04:49 +0000891 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000892
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 case UNARY_POSITIVE:
894 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000895 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000896 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000898 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000900
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 case UNARY_NEGATIVE:
902 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000903 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000904 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000906 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000908
Guido van Rossum374a9221991-04-04 10:40:29 +0000909 case UNARY_NOT:
910 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000911 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000912 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000913 if (err == 0) {
914 Py_INCREF(Py_True);
915 PUSH(Py_True);
916 continue;
917 }
918 else if (err > 0) {
919 Py_INCREF(Py_False);
920 PUSH(Py_False);
921 err = 0;
922 continue;
923 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000925
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 case UNARY_CONVERT:
927 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 x = PyObject_Repr(v);
929 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000931 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000933
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934 case UNARY_INVERT:
935 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000936 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000937 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000938 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000939 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000940 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000941
Guido van Rossum50564e81996-01-12 01:13:16 +0000942 case BINARY_POWER:
943 w = POP();
944 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000945 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000946 Py_DECREF(v);
947 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000948 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000949 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000950 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000951
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 case BINARY_MULTIPLY:
953 w = POP();
954 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000955 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000956 Py_DECREF(v);
957 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000959 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000961
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000963 if (!_Py_QnewFlag) {
964 w = POP();
965 v = POP();
966 x = PyNumber_Divide(v, w);
967 Py_DECREF(v);
968 Py_DECREF(w);
969 PUSH(x);
970 if (x != NULL) continue;
971 break;
972 }
973 /* -Qnew is in effect: fall through to
974 BINARY_TRUE_DIVIDE */
975 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 w = POP();
977 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000978 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 Py_DECREF(v);
980 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000982 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000984
Guido van Rossum4668b002001-08-08 05:00:18 +0000985 case BINARY_FLOOR_DIVIDE:
986 w = POP();
987 v = POP();
988 x = PyNumber_FloorDivide(v, w);
989 Py_DECREF(v);
990 Py_DECREF(w);
991 PUSH(x);
992 if (x != NULL) continue;
993 break;
994
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 case BINARY_MODULO:
996 w = POP();
997 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000998 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000999 Py_DECREF(v);
1000 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001002 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001003 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001004
Guido van Rossum374a9221991-04-04 10:40:29 +00001005 case BINARY_ADD:
1006 w = POP();
1007 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001008 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 /* INLINE: int + int */
1010 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001011 a = PyInt_AS_LONG(v);
1012 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001013 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001014 if ((i^a) < 0 && (i^b) < 0)
1015 goto slow_add;
1016 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001017 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001018 else {
1019 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001020 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001021 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001022 Py_DECREF(v);
1023 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001024 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001025 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001027
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 case BINARY_SUBTRACT:
1029 w = POP();
1030 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001031 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001032 /* INLINE: int - int */
1033 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001034 a = PyInt_AS_LONG(v);
1035 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001036 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001037 if ((i^a) < 0 && (i^~b) < 0)
1038 goto slow_sub;
1039 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001040 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001041 else {
1042 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001043 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001044 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001045 Py_DECREF(v);
1046 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001048 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001050
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 case BINARY_SUBSCR:
1052 w = POP();
1053 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001054 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001055 /* INLINE: list[int] */
1056 long i = PyInt_AsLong(w);
1057 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001058 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001059 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001060 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001061 PyErr_SetString(PyExc_IndexError,
1062 "list index out of range");
1063 x = NULL;
1064 }
1065 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001066 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001067 Py_INCREF(x);
1068 }
1069 }
1070 else
1071 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001072 Py_DECREF(v);
1073 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001074 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001075 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001077
Guido van Rossum7928cd71991-10-24 14:59:31 +00001078 case BINARY_LSHIFT:
1079 w = POP();
1080 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001081 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001082 Py_DECREF(v);
1083 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001084 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001085 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001086 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001087
Guido van Rossum7928cd71991-10-24 14:59:31 +00001088 case BINARY_RSHIFT:
1089 w = POP();
1090 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001091 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001092 Py_DECREF(v);
1093 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001094 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001095 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001096 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001097
Guido van Rossum7928cd71991-10-24 14:59:31 +00001098 case BINARY_AND:
1099 w = POP();
1100 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001101 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001102 Py_DECREF(v);
1103 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001104 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001105 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001106 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001107
Guido van Rossum7928cd71991-10-24 14:59:31 +00001108 case BINARY_XOR:
1109 w = POP();
1110 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001111 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001112 Py_DECREF(v);
1113 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001114 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001115 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001116 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Guido van Rossum7928cd71991-10-24 14:59:31 +00001118 case BINARY_OR:
1119 w = POP();
1120 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001121 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001122 Py_DECREF(v);
1123 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001124 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001125 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001126 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001127
1128 case INPLACE_POWER:
1129 w = POP();
1130 v = POP();
1131 x = PyNumber_InPlacePower(v, w, Py_None);
1132 Py_DECREF(v);
1133 Py_DECREF(w);
1134 PUSH(x);
1135 if (x != NULL) continue;
1136 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001137
Thomas Wouters434d0822000-08-24 20:11:32 +00001138 case INPLACE_MULTIPLY:
1139 w = POP();
1140 v = POP();
1141 x = PyNumber_InPlaceMultiply(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 PUSH(x);
1145 if (x != NULL) continue;
1146 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001147
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001149 if (!_Py_QnewFlag) {
1150 w = POP();
1151 v = POP();
1152 x = PyNumber_InPlaceDivide(v, w);
1153 Py_DECREF(v);
1154 Py_DECREF(w);
1155 PUSH(x);
1156 if (x != NULL) continue;
1157 break;
1158 }
1159 /* -Qnew is in effect: fall through to
1160 INPLACE_TRUE_DIVIDE */
1161 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001162 w = POP();
1163 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001164 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001165 Py_DECREF(v);
1166 Py_DECREF(w);
1167 PUSH(x);
1168 if (x != NULL) continue;
1169 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001170
Guido van Rossum4668b002001-08-08 05:00:18 +00001171 case INPLACE_FLOOR_DIVIDE:
1172 w = POP();
1173 v = POP();
1174 x = PyNumber_InPlaceFloorDivide(v, w);
1175 Py_DECREF(v);
1176 Py_DECREF(w);
1177 PUSH(x);
1178 if (x != NULL) continue;
1179 break;
1180
Thomas Wouters434d0822000-08-24 20:11:32 +00001181 case INPLACE_MODULO:
1182 w = POP();
1183 v = POP();
1184 x = PyNumber_InPlaceRemainder(v, w);
1185 Py_DECREF(v);
1186 Py_DECREF(w);
1187 PUSH(x);
1188 if (x != NULL) continue;
1189 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001190
Thomas Wouters434d0822000-08-24 20:11:32 +00001191 case INPLACE_ADD:
1192 w = POP();
1193 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001194 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001195 /* INLINE: int + int */
1196 register long a, b, i;
1197 a = PyInt_AS_LONG(v);
1198 b = PyInt_AS_LONG(w);
1199 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001200 if ((i^a) < 0 && (i^b) < 0)
1201 goto slow_iadd;
1202 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001203 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001204 else {
1205 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001206 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001207 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001208 Py_DECREF(v);
1209 Py_DECREF(w);
1210 PUSH(x);
1211 if (x != NULL) continue;
1212 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001213
Thomas Wouters434d0822000-08-24 20:11:32 +00001214 case INPLACE_SUBTRACT:
1215 w = POP();
1216 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001217 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001218 /* INLINE: int - int */
1219 register long a, b, i;
1220 a = PyInt_AS_LONG(v);
1221 b = PyInt_AS_LONG(w);
1222 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001223 if ((i^a) < 0 && (i^~b) < 0)
1224 goto slow_isub;
1225 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001226 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001227 else {
1228 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001229 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001230 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001231 Py_DECREF(v);
1232 Py_DECREF(w);
1233 PUSH(x);
1234 if (x != NULL) continue;
1235 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001236
Thomas Wouters434d0822000-08-24 20:11:32 +00001237 case INPLACE_LSHIFT:
1238 w = POP();
1239 v = POP();
1240 x = PyNumber_InPlaceLshift(v, w);
1241 Py_DECREF(v);
1242 Py_DECREF(w);
1243 PUSH(x);
1244 if (x != NULL) continue;
1245 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001246
Thomas Wouters434d0822000-08-24 20:11:32 +00001247 case INPLACE_RSHIFT:
1248 w = POP();
1249 v = POP();
1250 x = PyNumber_InPlaceRshift(v, w);
1251 Py_DECREF(v);
1252 Py_DECREF(w);
1253 PUSH(x);
1254 if (x != NULL) continue;
1255 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001256
Thomas Wouters434d0822000-08-24 20:11:32 +00001257 case INPLACE_AND:
1258 w = POP();
1259 v = POP();
1260 x = PyNumber_InPlaceAnd(v, w);
1261 Py_DECREF(v);
1262 Py_DECREF(w);
1263 PUSH(x);
1264 if (x != NULL) continue;
1265 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001266
Thomas Wouters434d0822000-08-24 20:11:32 +00001267 case INPLACE_XOR:
1268 w = POP();
1269 v = POP();
1270 x = PyNumber_InPlaceXor(v, w);
1271 Py_DECREF(v);
1272 Py_DECREF(w);
1273 PUSH(x);
1274 if (x != NULL) continue;
1275 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001276
Thomas Wouters434d0822000-08-24 20:11:32 +00001277 case INPLACE_OR:
1278 w = POP();
1279 v = POP();
1280 x = PyNumber_InPlaceOr(v, w);
1281 Py_DECREF(v);
1282 Py_DECREF(w);
1283 PUSH(x);
1284 if (x != NULL) continue;
1285 break;
1286
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 case SLICE+0:
1288 case SLICE+1:
1289 case SLICE+2:
1290 case SLICE+3:
1291 if ((opcode-SLICE) & 2)
1292 w = POP();
1293 else
1294 w = NULL;
1295 if ((opcode-SLICE) & 1)
1296 v = POP();
1297 else
1298 v = NULL;
1299 u = POP();
1300 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 Py_DECREF(u);
1302 Py_XDECREF(v);
1303 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001305 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001306 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001307
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 case STORE_SLICE+0:
1309 case STORE_SLICE+1:
1310 case STORE_SLICE+2:
1311 case STORE_SLICE+3:
1312 if ((opcode-STORE_SLICE) & 2)
1313 w = POP();
1314 else
1315 w = NULL;
1316 if ((opcode-STORE_SLICE) & 1)
1317 v = POP();
1318 else
1319 v = NULL;
1320 u = POP();
1321 t = POP();
1322 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001323 Py_DECREF(t);
1324 Py_DECREF(u);
1325 Py_XDECREF(v);
1326 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001327 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001329
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 case DELETE_SLICE+0:
1331 case DELETE_SLICE+1:
1332 case DELETE_SLICE+2:
1333 case DELETE_SLICE+3:
1334 if ((opcode-DELETE_SLICE) & 2)
1335 w = POP();
1336 else
1337 w = NULL;
1338 if ((opcode-DELETE_SLICE) & 1)
1339 v = POP();
1340 else
1341 v = NULL;
1342 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001345 Py_DECREF(u);
1346 Py_XDECREF(v);
1347 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001348 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001350
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 case STORE_SUBSCR:
1352 w = POP();
1353 v = POP();
1354 u = POP();
1355 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001356 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001357 Py_DECREF(u);
1358 Py_DECREF(v);
1359 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001360 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001362
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 case DELETE_SUBSCR:
1364 w = POP();
1365 v = POP();
1366 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001367 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001368 Py_DECREF(v);
1369 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001370 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001372
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 case PRINT_EXPR:
1374 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001375 w = PySys_GetObject("displayhook");
1376 if (w == NULL) {
1377 PyErr_SetString(PyExc_RuntimeError,
1378 "lost sys.displayhook");
1379 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001380 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001381 }
1382 if (err == 0) {
1383 x = Py_BuildValue("(O)", v);
1384 if (x == NULL)
1385 err = -1;
1386 }
1387 if (err == 0) {
1388 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001389 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001390 if (w == NULL)
1391 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001393 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001394 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001396
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001397 case PRINT_ITEM_TO:
1398 w = stream = POP();
1399 /* fall through to PRINT_ITEM */
1400
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 case PRINT_ITEM:
1402 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001403 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001404 w = PySys_GetObject("stdout");
1405 if (w == NULL) {
1406 PyErr_SetString(PyExc_RuntimeError,
1407 "lost sys.stdout");
1408 err = -1;
1409 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001410 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001411 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001412 err = PyFile_WriteString(" ", w);
1413 if (err == 0)
1414 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001415 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001416 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001417 if (PyString_Check(v)) {
1418 char *s = PyString_AS_STRING(v);
1419 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001420 if (len == 0 ||
1421 !isspace(Py_CHARMASK(s[len-1])) ||
1422 s[len-1] == ' ')
1423 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001424 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001425#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001426 else if (PyUnicode_Check(v)) {
1427 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1428 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001429 if (len == 0 ||
1430 !Py_UNICODE_ISSPACE(s[len-1]) ||
1431 s[len-1] == ' ')
1432 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001433 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001434#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001435 else
1436 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001438 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001439 Py_XDECREF(stream);
1440 stream = NULL;
1441 if (err == 0)
1442 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001444
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001445 case PRINT_NEWLINE_TO:
1446 w = stream = POP();
1447 /* fall through to PRINT_NEWLINE */
1448
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001450 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001451 w = PySys_GetObject("stdout");
1452 if (w == NULL)
1453 PyErr_SetString(PyExc_RuntimeError,
1454 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001455 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001456 if (w != NULL) {
1457 err = PyFile_WriteString("\n", w);
1458 if (err == 0)
1459 PyFile_SoftSpace(w, 0);
1460 }
1461 Py_XDECREF(stream);
1462 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001464
Thomas Wouters434d0822000-08-24 20:11:32 +00001465
1466#ifdef CASE_TOO_BIG
1467 default: switch (opcode) {
1468#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 case BREAK_LOOP:
1470 why = WHY_BREAK;
1471 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001472
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001473 case CONTINUE_LOOP:
1474 retval = PyInt_FromLong(oparg);
1475 why = WHY_CONTINUE;
1476 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001477
Guido van Rossumf10570b1995-07-07 22:53:21 +00001478 case RAISE_VARARGS:
1479 u = v = w = NULL;
1480 switch (oparg) {
1481 case 3:
1482 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001483 /* Fallthrough */
1484 case 2:
1485 v = POP(); /* value */
1486 /* Fallthrough */
1487 case 1:
1488 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001489 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001490 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001491 break;
1492 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001494 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001495 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001496 break;
1497 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001499
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001501 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001502 PyErr_SetString(PyExc_SystemError,
1503 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 break;
1505 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001506 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001507 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001509
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 case RETURN_VALUE:
1511 retval = POP();
1512 why = WHY_RETURN;
1513 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001514
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001515 case RETURN_NONE:
1516 retval = Py_None;
1517 Py_INCREF(retval);
1518 why = WHY_RETURN;
1519 break;
1520
Tim Peters5ca576e2001-06-18 22:08:13 +00001521 case YIELD_VALUE:
1522 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001523 f->f_stacktop = stack_pointer;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001524 /* abuse the lasti field: here it points to
1525 the *next* instruction */
Tim Peters5ca576e2001-06-18 22:08:13 +00001526 f->f_lasti = INSTR_OFFSET();
1527 why = WHY_YIELD;
1528 break;
1529
1530
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001531 case EXEC_STMT:
1532 w = POP();
1533 v = POP();
1534 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001535 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 Py_DECREF(u);
1537 Py_DECREF(v);
1538 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001539 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001540
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 case POP_BLOCK:
1542 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 while (STACK_LEVEL() > b->b_level) {
1545 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 }
1548 }
1549 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001550
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 case END_FINALLY:
1552 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 if (PyInt_Check(v)) {
1554 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001555 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001556 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001557 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 retval = POP();
1559 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001565 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001567 else if (v != Py_None) {
1568 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 "'finally' pops bad exception");
1570 why = WHY_EXCEPTION;
1571 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001574
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001576 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001578 w = POP();
1579 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_DECREF(u);
1582 Py_DECREF(v);
1583 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001585
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001587 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001590 PyErr_Format(PyExc_SystemError,
1591 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001592 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 break;
1594 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 err = PyDict_SetItem(x, w, v);
1596 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001598
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001600 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001602 PyErr_Format(PyExc_SystemError,
1603 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001604 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 break;
1606 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001608 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001609 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001611
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001612 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001613 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001614 if (PyTuple_Check(v)) {
1615 if (PyTuple_Size(v) != oparg) {
1616 PyErr_SetString(PyExc_ValueError,
1617 "unpack tuple of wrong size");
1618 why = WHY_EXCEPTION;
1619 }
1620 else {
1621 for (; --oparg >= 0; ) {
1622 w = PyTuple_GET_ITEM(v, oparg);
1623 Py_INCREF(w);
1624 PUSH(w);
1625 }
1626 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001628 else if (PyList_Check(v)) {
1629 if (PyList_Size(v) != oparg) {
1630 PyErr_SetString(PyExc_ValueError,
1631 "unpack list of wrong size");
1632 why = WHY_EXCEPTION;
1633 }
1634 else {
1635 for (; --oparg >= 0; ) {
1636 w = PyList_GET_ITEM(v, oparg);
1637 Py_INCREF(w);
1638 PUSH(w);
1639 }
1640 }
1641 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001642 else if (unpack_iterable(v, oparg,
1643 stack_pointer + oparg))
1644 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001645 else {
1646 if (PyErr_ExceptionMatches(PyExc_TypeError))
1647 PyErr_SetString(PyExc_TypeError,
1648 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001649 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001650 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001652 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001653
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001655 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 v = POP();
1657 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1659 Py_DECREF(v);
1660 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001662
Guido van Rossum374a9221991-04-04 10:40:29 +00001663 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001664 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001666 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1667 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001670
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001671 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001672 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001673 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 err = PyDict_SetItem(f->f_globals, w, v);
1675 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001676 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001677
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001678 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001679 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001681 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001682 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001683 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001684
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001686 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001687 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001688 PyErr_Format(PyExc_SystemError,
1689 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001690 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001691 break;
1692 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001699 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001700 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001701 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 break;
1703 }
1704 }
1705 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 PUSH(x);
1708 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001709
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001711 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001712 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001714 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001716 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001717 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001718 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 break;
1720 }
1721 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 PUSH(x);
1724 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001725
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001726 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001727 x = GETLOCAL(oparg);
1728 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001729 format_exc_check_arg(
1730 PyExc_UnboundLocalError,
1731 UNBOUNDLOCAL_ERROR_MSG,
1732 PyTuple_GetItem(co->co_varnames, oparg)
1733 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001734 break;
1735 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001736 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001737 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001738
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001739 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001740 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001741 Py_INCREF(x);
1742 PUSH(x);
1743 break;
1744
1745 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001746 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001747 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001748 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001749 err = -1;
1750 /* Don't stomp existing exception */
1751 if (PyErr_Occurred())
1752 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001753 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001754 v = PyTuple_GetItem(co->co_cellvars,
1755 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001756 format_exc_check_arg(
1757 PyExc_UnboundLocalError,
1758 UNBOUNDLOCAL_ERROR_MSG,
1759 v);
1760 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001761 v = PyTuple_GetItem(
1762 co->co_freevars,
1763 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001764 format_exc_check_arg(
1765 PyExc_NameError,
1766 UNBOUNDFREE_ERROR_MSG,
1767 v);
1768 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001769 break;
1770 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001771 PUSH(w);
1772 break;
1773
1774 case STORE_DEREF:
1775 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001776 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001777 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001778 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001779 continue;
1780
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 if (x != NULL) {
1784 for (; --oparg >= 0;) {
1785 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001786 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 }
1788 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001789 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 }
1791 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001792
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 if (x != NULL) {
1796 for (; --oparg >= 0;) {
1797 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001798 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 }
1800 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001801 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 }
1803 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001804
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001806 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001808 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001810
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001812 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001814 x = PyObject_GetAttr(v, w);
1815 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001817 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001819
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 case COMPARE_OP:
1821 w = POP();
1822 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001823 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001824 /* INLINE: cmp(int, int) */
1825 register long a, b;
1826 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001827 a = PyInt_AS_LONG(v);
1828 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001829 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001830 case PyCmp_LT: res = a < b; break;
1831 case PyCmp_LE: res = a <= b; break;
1832 case PyCmp_EQ: res = a == b; break;
1833 case PyCmp_NE: res = a != b; break;
1834 case PyCmp_GT: res = a > b; break;
1835 case PyCmp_GE: res = a >= b; break;
1836 case PyCmp_IS: res = v == w; break;
1837 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001838 default: goto slow_compare;
1839 }
1840 x = res ? Py_True : Py_False;
1841 Py_INCREF(x);
1842 }
1843 else {
1844 slow_compare:
1845 x = cmp_outcome(oparg, v, w);
1846 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 Py_DECREF(v);
1848 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001850 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001852
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001854 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001856 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001857 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001858 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001859 break;
1860 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001861 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001862 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001863 w,
1864 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001865 f->f_locals == NULL ?
1866 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001867 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869 if (w == NULL) {
1870 x = NULL;
1871 break;
1872 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001873 x = PyEval_CallObject(x, w);
1874 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001875 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001876 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001878
Thomas Wouters52152252000-08-17 22:55:00 +00001879 case IMPORT_STAR:
1880 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001881 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001882 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001883 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001884 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001885 break;
1886 }
Thomas Wouters52152252000-08-17 22:55:00 +00001887 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001888 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001889 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001890 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001891 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001892
Thomas Wouters52152252000-08-17 22:55:00 +00001893 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001894 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001895 v = TOP();
1896 x = import_from(v, w);
1897 PUSH(x);
1898 if (x != NULL) continue;
1899 break;
1900
Guido van Rossum374a9221991-04-04 10:40:29 +00001901 case JUMP_FORWARD:
1902 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001903 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001904
Guido van Rossum374a9221991-04-04 10:40:29 +00001905 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001906 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001907 if (err > 0)
1908 err = 0;
1909 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001910 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001911 else
1912 break;
1913 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001914
Guido van Rossum374a9221991-04-04 10:40:29 +00001915 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001916 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001917 if (err > 0) {
1918 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001919 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001920 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001921 else if (err == 0)
1922 ;
1923 else
1924 break;
1925 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001926
Guido van Rossum374a9221991-04-04 10:40:29 +00001927 case JUMP_ABSOLUTE:
1928 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001929 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001930
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001931 case GET_ITER:
1932 /* before: [obj]; after [getiter(obj)] */
1933 v = POP();
1934 x = PyObject_GetIter(v);
1935 Py_DECREF(v);
1936 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001937 PUSH(x);
1938 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001939 }
1940 break;
1941
1942 case FOR_ITER:
1943 /* before: [iter]; after: [iter, iter()] *or* [] */
1944 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001945 x = PyIter_Next(v);
1946 if (x != NULL) {
1947 PUSH(x);
1948 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001949 }
Tim Petersf4848da2001-05-05 00:14:56 +00001950 if (!PyErr_Occurred()) {
1951 /* iterator ended normally */
1952 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001953 Py_DECREF(v);
1954 JUMPBY(oparg);
1955 continue;
1956 }
1957 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001958
Guido van Rossum374a9221991-04-04 10:40:29 +00001959 case SETUP_LOOP:
1960 case SETUP_EXCEPT:
1961 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001962 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001963 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001964 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001965
Guido van Rossumf10570b1995-07-07 22:53:21 +00001966 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001967 {
1968 int na = oparg & 0xff;
1969 int nk = (oparg>>8) & 0xff;
1970 int n = na + 2 * nk;
1971 PyObject **pfunc = stack_pointer - n - 1;
1972 PyObject *func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00001973
1974 /* Always dispatch PyCFunction first, because
1975 these are presumed to be the most frequent
1976 callable object.
1977 */
1978 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001979 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001980 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001981 x = do_call(func, &stack_pointer,
1982 na, nk);
1983 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001984 PyObject *callargs;
1985 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001986 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001987 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001988 } else
1989 x = fast_cfunction(func,
1990 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001991 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001992 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001993 && PyMethod_GET_SELF(func) != NULL) {
1994 /* optimize access to bound methods */
1995 PyObject *self = PyMethod_GET_SELF(func);
1996 Py_INCREF(self);
1997 func = PyMethod_GET_FUNCTION(func);
1998 Py_INCREF(func);
1999 Py_DECREF(*pfunc);
2000 *pfunc = self;
2001 na++;
2002 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002003 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002004 Py_INCREF(func);
2005 if (PyFunction_Check(func)) {
2006 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002007 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002008 } else {
2009 x = do_call(func, &stack_pointer,
2010 na, nk);
2011 }
2012 Py_DECREF(func);
2013 }
2014
2015 while (stack_pointer > pfunc) {
2016 w = POP();
2017 Py_DECREF(w);
2018 }
2019 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002020 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002021 continue;
2022 break;
2023 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002024
Jeremy Hylton76901512000-03-28 23:49:17 +00002025 case CALL_FUNCTION_VAR:
2026 case CALL_FUNCTION_KW:
2027 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002028 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002029 int na = oparg & 0xff;
2030 int nk = (oparg>>8) & 0xff;
2031 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002032 int n = na + 2 * nk;
2033 PyObject **pfunc, *func;
2034 if (flags & CALL_FLAG_VAR)
2035 n++;
2036 if (flags & CALL_FLAG_KW)
2037 n++;
2038 pfunc = stack_pointer - n - 1;
2039 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002040
Guido van Rossumac7be682001-01-17 15:42:30 +00002041 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002042 && PyMethod_GET_SELF(func) != NULL) {
2043 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002044 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002045 func = PyMethod_GET_FUNCTION(func);
2046 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002047 Py_DECREF(*pfunc);
2048 *pfunc = self;
2049 na++;
2050 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002051 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002052 Py_INCREF(func);
2053 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002054 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002055
Jeremy Hylton76901512000-03-28 23:49:17 +00002056 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002057 w = POP();
2058 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002059 }
2060 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002061 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002062 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002063 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002064 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002065
Guido van Rossum681d79a1995-07-18 14:51:37 +00002066 case MAKE_FUNCTION:
2067 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002068 x = PyFunction_New(v, f->f_globals);
2069 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002070 /* XXX Maybe this should be a separate opcode? */
2071 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002073 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002075 x = NULL;
2076 break;
2077 }
2078 while (--oparg >= 0) {
2079 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002081 }
2082 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002084 }
2085 PUSH(x);
2086 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002087
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002088 case MAKE_CLOSURE:
2089 {
2090 int nfree;
2091 v = POP(); /* code object */
2092 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002093 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002094 Py_DECREF(v);
2095 /* XXX Maybe this should be a separate opcode? */
2096 if (x != NULL && nfree > 0) {
2097 v = PyTuple_New(nfree);
2098 if (v == NULL) {
2099 Py_DECREF(x);
2100 x = NULL;
2101 break;
2102 }
2103 while (--nfree >= 0) {
2104 w = POP();
2105 PyTuple_SET_ITEM(v, nfree, w);
2106 }
2107 err = PyFunction_SetClosure(x, v);
2108 Py_DECREF(v);
2109 }
2110 if (x != NULL && oparg > 0) {
2111 v = PyTuple_New(oparg);
2112 if (v == NULL) {
2113 Py_DECREF(x);
2114 x = NULL;
2115 break;
2116 }
2117 while (--oparg >= 0) {
2118 w = POP();
2119 PyTuple_SET_ITEM(v, oparg, w);
2120 }
2121 err = PyFunction_SetDefaults(x, v);
2122 Py_DECREF(v);
2123 }
2124 PUSH(x);
2125 break;
2126 }
2127
Guido van Rossum8861b741996-07-30 16:49:37 +00002128 case BUILD_SLICE:
2129 if (oparg == 3)
2130 w = POP();
2131 else
2132 w = NULL;
2133 v = POP();
2134 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002135 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 Py_DECREF(u);
2137 Py_DECREF(v);
2138 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002139 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002140 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002141 break;
2142
Fred Drakeef8ace32000-08-24 00:32:09 +00002143 case EXTENDED_ARG:
2144 opcode = NEXTOP();
2145 oparg = oparg<<16 | NEXTARG();
2146 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002147
Guido van Rossum374a9221991-04-04 10:40:29 +00002148 default:
2149 fprintf(stderr,
2150 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002151 PyCode_Addr2Line(f->f_code, f->f_lasti),
2152 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 why = WHY_EXCEPTION;
2155 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002156
2157#ifdef CASE_TOO_BIG
2158 }
2159#endif
2160
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 } /* switch */
2162
2163 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002164
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002166
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002168 if (err == 0 && x != NULL) {
2169#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002170 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002172 fprintf(stderr,
2173 "XXX undetected error\n");
2174 else
2175#endif
2176 continue; /* Normal, fast path */
2177 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 err = 0;
2181 }
2182
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002184
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002187 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002188 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002189 why = WHY_EXCEPTION;
2190 }
2191 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002192#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002193 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002194 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002196 fprintf(stderr,
2197 "XXX undetected error (why=%d)\n",
2198 why);
2199 why = WHY_EXCEPTION;
2200 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002201 }
2202#endif
2203
2204 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002208
Fred Drake8f51f542001-10-04 14:48:42 +00002209 if (tstate->c_tracefunc != NULL)
2210 call_exc_trace(tstate->c_tracefunc,
2211 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002212 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002213
Guido van Rossum374a9221991-04-04 10:40:29 +00002214 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002215
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 if (why == WHY_RERAISE)
2217 why = WHY_EXCEPTION;
2218
2219 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002220
Tim Peters5ca576e2001-06-18 22:08:13 +00002221 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002223
2224 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2225 /* For a continue inside a try block,
2226 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002227 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2228 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002229 why = WHY_NOT;
2230 JUMPTO(PyInt_AS_LONG(retval));
2231 Py_DECREF(retval);
2232 break;
2233 }
2234
Guido van Rossum374a9221991-04-04 10:40:29 +00002235 while (STACK_LEVEL() > b->b_level) {
2236 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002237 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 }
2239 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2240 why = WHY_NOT;
2241 JUMPTO(b->b_handler);
2242 break;
2243 }
2244 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002245 (b->b_type == SETUP_EXCEPT &&
2246 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002247 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002248 PyObject *exc, *val, *tb;
2249 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002250 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 val = Py_None;
2252 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002254 /* Make the raw exception data
2255 available to the handler,
2256 so a program can emulate the
2257 Python main loop. Don't do
2258 this for 'finally'. */
2259 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002260 PyErr_NormalizeException(
2261 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002262 set_exc_info(tstate,
2263 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002264 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002265 if (tb == NULL) {
2266 Py_INCREF(Py_None);
2267 PUSH(Py_None);
2268 } else
2269 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002270 PUSH(val);
2271 PUSH(exc);
2272 }
2273 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002274 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002275 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002276 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002277 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002278 PUSH(v);
2279 }
2280 why = WHY_NOT;
2281 JUMPTO(b->b_handler);
2282 break;
2283 }
2284 } /* unwind stack */
2285
2286 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002287
Guido van Rossum374a9221991-04-04 10:40:29 +00002288 if (why != WHY_NOT)
2289 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002290
Guido van Rossum374a9221991-04-04 10:40:29 +00002291 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002292
Guido van Rossum35974fb2001-12-06 21:28:18 +00002293 if (why != WHY_YIELD) {
2294 /* Pop remaining stack entries -- but when yielding */
2295 while (!EMPTY()) {
2296 v = POP();
2297 Py_XDECREF(v);
2298 }
2299 }
2300
Tim Peters5ca576e2001-06-18 22:08:13 +00002301 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002302 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002303
Fred Drake9e3ad782001-07-03 23:39:52 +00002304 if (tstate->use_tracing) {
2305 if (tstate->c_tracefunc
2306 && (why == WHY_RETURN || why == WHY_YIELD)) {
2307 if (call_trace(tstate->c_tracefunc,
2308 tstate->c_traceobj, f,
2309 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002310 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002311 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002312 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002313 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002314 }
Fred Drake8f51f542001-10-04 14:48:42 +00002315 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002316 if (why == WHY_EXCEPTION)
2317 call_trace_protected(tstate->c_profilefunc,
2318 tstate->c_profileobj, f,
2319 PyTrace_RETURN);
2320 else if (call_trace(tstate->c_profilefunc,
2321 tstate->c_profileobj, f,
2322 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002323 Py_XDECREF(retval);
2324 retval = NULL;
2325 why = WHY_EXCEPTION;
2326 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002327 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002328 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002329
Guido van Rossuma027efa1997-05-05 20:56:21 +00002330 reset_exc_info(tstate);
2331
Tim Peters5ca576e2001-06-18 22:08:13 +00002332 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002333 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002334 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002335
Guido van Rossum96a42c81992-01-12 02:29:51 +00002336 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002337}
2338
Tim Peters6d6c1a32001-08-02 04:15:00 +00002339PyObject *
2340PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002341 PyObject **args, int argcount, PyObject **kws, int kwcount,
2342 PyObject **defs, int defcount, PyObject *closure)
2343{
2344 register PyFrameObject *f;
2345 register PyObject *retval = NULL;
2346 register PyObject **fastlocals, **freevars;
2347 PyThreadState *tstate = PyThreadState_GET();
2348 PyObject *x, *u;
2349
2350 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002351 PyErr_SetString(PyExc_SystemError,
2352 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002353 return NULL;
2354 }
2355
2356 f = PyFrame_New(tstate, /*back*/
2357 co, /*code*/
2358 globals, locals);
2359 if (f == NULL)
2360 return NULL;
2361
2362 fastlocals = f->f_localsplus;
2363 freevars = f->f_localsplus + f->f_nlocals;
2364
2365 if (co->co_argcount > 0 ||
2366 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2367 int i;
2368 int n = argcount;
2369 PyObject *kwdict = NULL;
2370 if (co->co_flags & CO_VARKEYWORDS) {
2371 kwdict = PyDict_New();
2372 if (kwdict == NULL)
2373 goto fail;
2374 i = co->co_argcount;
2375 if (co->co_flags & CO_VARARGS)
2376 i++;
2377 SETLOCAL(i, kwdict);
2378 }
2379 if (argcount > co->co_argcount) {
2380 if (!(co->co_flags & CO_VARARGS)) {
2381 PyErr_Format(PyExc_TypeError,
2382 "%.200s() takes %s %d "
2383 "%sargument%s (%d given)",
2384 PyString_AsString(co->co_name),
2385 defcount ? "at most" : "exactly",
2386 co->co_argcount,
2387 kwcount ? "non-keyword " : "",
2388 co->co_argcount == 1 ? "" : "s",
2389 argcount);
2390 goto fail;
2391 }
2392 n = co->co_argcount;
2393 }
2394 for (i = 0; i < n; i++) {
2395 x = args[i];
2396 Py_INCREF(x);
2397 SETLOCAL(i, x);
2398 }
2399 if (co->co_flags & CO_VARARGS) {
2400 u = PyTuple_New(argcount - n);
2401 if (u == NULL)
2402 goto fail;
2403 SETLOCAL(co->co_argcount, u);
2404 for (i = n; i < argcount; i++) {
2405 x = args[i];
2406 Py_INCREF(x);
2407 PyTuple_SET_ITEM(u, i-n, x);
2408 }
2409 }
2410 for (i = 0; i < kwcount; i++) {
2411 PyObject *keyword = kws[2*i];
2412 PyObject *value = kws[2*i + 1];
2413 int j;
2414 if (keyword == NULL || !PyString_Check(keyword)) {
2415 PyErr_Format(PyExc_TypeError,
2416 "%.200s() keywords must be strings",
2417 PyString_AsString(co->co_name));
2418 goto fail;
2419 }
2420 /* XXX slow -- speed up using dictionary? */
2421 for (j = 0; j < co->co_argcount; j++) {
2422 PyObject *nm = PyTuple_GET_ITEM(
2423 co->co_varnames, j);
2424 int cmp = PyObject_RichCompareBool(
2425 keyword, nm, Py_EQ);
2426 if (cmp > 0)
2427 break;
2428 else if (cmp < 0)
2429 goto fail;
2430 }
2431 /* Check errors from Compare */
2432 if (PyErr_Occurred())
2433 goto fail;
2434 if (j >= co->co_argcount) {
2435 if (kwdict == NULL) {
2436 PyErr_Format(PyExc_TypeError,
2437 "%.200s() got an unexpected "
2438 "keyword argument '%.400s'",
2439 PyString_AsString(co->co_name),
2440 PyString_AsString(keyword));
2441 goto fail;
2442 }
2443 PyDict_SetItem(kwdict, keyword, value);
2444 }
2445 else {
2446 if (GETLOCAL(j) != NULL) {
2447 PyErr_Format(PyExc_TypeError,
2448 "%.200s() got multiple "
2449 "values for keyword "
2450 "argument '%.400s'",
2451 PyString_AsString(co->co_name),
2452 PyString_AsString(keyword));
2453 goto fail;
2454 }
2455 Py_INCREF(value);
2456 SETLOCAL(j, value);
2457 }
2458 }
2459 if (argcount < co->co_argcount) {
2460 int m = co->co_argcount - defcount;
2461 for (i = argcount; i < m; i++) {
2462 if (GETLOCAL(i) == NULL) {
2463 PyErr_Format(PyExc_TypeError,
2464 "%.200s() takes %s %d "
2465 "%sargument%s (%d given)",
2466 PyString_AsString(co->co_name),
2467 ((co->co_flags & CO_VARARGS) ||
2468 defcount) ? "at least"
2469 : "exactly",
2470 m, kwcount ? "non-keyword " : "",
2471 m == 1 ? "" : "s", i);
2472 goto fail;
2473 }
2474 }
2475 if (n > m)
2476 i = n - m;
2477 else
2478 i = 0;
2479 for (; i < defcount; i++) {
2480 if (GETLOCAL(m+i) == NULL) {
2481 PyObject *def = defs[i];
2482 Py_INCREF(def);
2483 SETLOCAL(m+i, def);
2484 }
2485 }
2486 }
2487 }
2488 else {
2489 if (argcount > 0 || kwcount > 0) {
2490 PyErr_Format(PyExc_TypeError,
2491 "%.200s() takes no arguments (%d given)",
2492 PyString_AsString(co->co_name),
2493 argcount + kwcount);
2494 goto fail;
2495 }
2496 }
2497 /* Allocate and initialize storage for cell vars, and copy free
2498 vars into frame. This isn't too efficient right now. */
2499 if (f->f_ncells) {
2500 int i = 0, j = 0, nargs, found;
2501 char *cellname, *argname;
2502 PyObject *c;
2503
2504 nargs = co->co_argcount;
2505 if (co->co_flags & CO_VARARGS)
2506 nargs++;
2507 if (co->co_flags & CO_VARKEYWORDS)
2508 nargs++;
2509
2510 /* Check for cells that shadow args */
2511 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2512 cellname = PyString_AS_STRING(
2513 PyTuple_GET_ITEM(co->co_cellvars, i));
2514 found = 0;
2515 while (j < nargs) {
2516 argname = PyString_AS_STRING(
2517 PyTuple_GET_ITEM(co->co_varnames, j));
2518 if (strcmp(cellname, argname) == 0) {
2519 c = PyCell_New(GETLOCAL(j));
2520 if (c == NULL)
2521 goto fail;
2522 GETLOCAL(f->f_nlocals + i) = c;
2523 found = 1;
2524 break;
2525 }
2526 j++;
2527 }
2528 if (found == 0) {
2529 c = PyCell_New(NULL);
2530 if (c == NULL)
2531 goto fail;
2532 SETLOCAL(f->f_nlocals + i, c);
2533 }
2534 }
2535 /* Initialize any that are left */
2536 while (i < f->f_ncells) {
2537 c = PyCell_New(NULL);
2538 if (c == NULL)
2539 goto fail;
2540 SETLOCAL(f->f_nlocals + i, c);
2541 i++;
2542 }
2543 }
2544 if (f->f_nfreevars) {
2545 int i;
2546 for (i = 0; i < f->f_nfreevars; ++i) {
2547 PyObject *o = PyTuple_GET_ITEM(closure, i);
2548 Py_INCREF(o);
2549 freevars[f->f_ncells + i] = o;
2550 }
2551 }
2552
Tim Peters5ca576e2001-06-18 22:08:13 +00002553 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002554 /* Don't need to keep the reference to f_back, it will be set
2555 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002556 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002557 f->f_back = NULL;
2558
2559 /* Create a new generator that owns the ready to run frame
2560 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002561 return gen_new(f);
2562 }
2563
2564 retval = eval_frame(f);
2565
2566 fail: /* Jump here from prelude on failure */
2567
Tim Petersb13680b2001-11-27 23:29:29 +00002568 /* decref'ing the frame can cause __del__ methods to get invoked,
2569 which can call back into Python. While we're done with the
2570 current Python frame (f), the associated C stack is still in use,
2571 so recursion_depth must be boosted for the duration.
2572 */
2573 assert(tstate != NULL);
2574 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002575 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002576 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002577 return retval;
2578}
2579
2580
Guido van Rossuma027efa1997-05-05 20:56:21 +00002581static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002582set_exc_info(PyThreadState *tstate,
2583 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584{
2585 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002586 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002587
Guido van Rossuma027efa1997-05-05 20:56:21 +00002588 frame = tstate->frame;
2589 if (frame->f_exc_type == NULL) {
2590 /* This frame didn't catch an exception before */
2591 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002592 if (tstate->exc_type == NULL) {
2593 Py_INCREF(Py_None);
2594 tstate->exc_type = Py_None;
2595 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002596 tmp_type = frame->f_exc_type;
2597 tmp_value = frame->f_exc_value;
2598 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002599 Py_XINCREF(tstate->exc_type);
2600 Py_XINCREF(tstate->exc_value);
2601 Py_XINCREF(tstate->exc_traceback);
2602 frame->f_exc_type = tstate->exc_type;
2603 frame->f_exc_value = tstate->exc_value;
2604 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002605 Py_XDECREF(tmp_type);
2606 Py_XDECREF(tmp_value);
2607 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002608 }
2609 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002610 tmp_type = tstate->exc_type;
2611 tmp_value = tstate->exc_value;
2612 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002613 Py_XINCREF(type);
2614 Py_XINCREF(value);
2615 Py_XINCREF(tb);
2616 tstate->exc_type = type;
2617 tstate->exc_value = value;
2618 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002619 Py_XDECREF(tmp_type);
2620 Py_XDECREF(tmp_value);
2621 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002622 /* For b/w compatibility */
2623 PySys_SetObject("exc_type", type);
2624 PySys_SetObject("exc_value", value);
2625 PySys_SetObject("exc_traceback", tb);
2626}
2627
2628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002629reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002630{
2631 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002632 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002633 frame = tstate->frame;
2634 if (frame->f_exc_type != NULL) {
2635 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002636 tmp_type = tstate->exc_type;
2637 tmp_value = tstate->exc_value;
2638 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002639 Py_XINCREF(frame->f_exc_type);
2640 Py_XINCREF(frame->f_exc_value);
2641 Py_XINCREF(frame->f_exc_traceback);
2642 tstate->exc_type = frame->f_exc_type;
2643 tstate->exc_value = frame->f_exc_value;
2644 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002645 Py_XDECREF(tmp_type);
2646 Py_XDECREF(tmp_value);
2647 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002648 /* For b/w compatibility */
2649 PySys_SetObject("exc_type", frame->f_exc_type);
2650 PySys_SetObject("exc_value", frame->f_exc_value);
2651 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2652 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002653 tmp_type = frame->f_exc_type;
2654 tmp_value = frame->f_exc_value;
2655 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002656 frame->f_exc_type = NULL;
2657 frame->f_exc_value = NULL;
2658 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002659 Py_XDECREF(tmp_type);
2660 Py_XDECREF(tmp_value);
2661 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002662}
2663
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002664/* Logic for the raise statement (too complicated for inlining).
2665 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002666static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002667do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002668{
Guido van Rossumd295f121998-04-09 21:39:57 +00002669 if (type == NULL) {
2670 /* Reraise */
2671 PyThreadState *tstate = PyThreadState_Get();
2672 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2673 value = tstate->exc_value;
2674 tb = tstate->exc_traceback;
2675 Py_XINCREF(type);
2676 Py_XINCREF(value);
2677 Py_XINCREF(tb);
2678 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002679
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002680 /* We support the following forms of raise:
2681 raise <class>, <classinstance>
2682 raise <class>, <argument tuple>
2683 raise <class>, None
2684 raise <class>, <argument>
2685 raise <classinstance>, None
2686 raise <string>, <object>
2687 raise <string>, None
2688
2689 An omitted second argument is the same as None.
2690
2691 In addition, raise <tuple>, <anything> is the same as
2692 raising the tuple's first item (and it better have one!);
2693 this rule is applied recursively.
2694
2695 Finally, an optional third argument can be supplied, which
2696 gives the traceback to be substituted (useful when
2697 re-raising an exception after examining it). */
2698
2699 /* First, check the traceback argument, replacing None with
2700 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 if (tb == Py_None) {
2702 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002703 tb = NULL;
2704 }
2705 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002706 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002707 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002708 goto raise_error;
2709 }
2710
2711 /* Next, replace a missing value with None */
2712 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002713 value = Py_None;
2714 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002715 }
2716
2717 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2719 PyObject *tmp = type;
2720 type = PyTuple_GET_ITEM(type, 0);
2721 Py_INCREF(type);
2722 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002723 }
2724
Tim Petersafb2c802002-04-18 18:06:20 +00002725 if (PyString_CheckExact(type))
2726 /* Raising builtin string is deprecated but still allowed --
2727 * do nothing. Raising an instance of a new-style str
2728 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002729 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002730
2731 else if (PyClass_Check(type))
2732 PyErr_NormalizeException(&type, &value, &tb);
2733
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002735 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002736 if (value != Py_None) {
2737 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002738 "instance exception may not have a separate value");
2739 goto raise_error;
2740 }
2741 else {
2742 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002744 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2746 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002747 }
2748 }
2749 else {
2750 /* Not something you can raise. You get an exception
2751 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002752 PyErr_Format(PyExc_TypeError,
2753 "exceptions must be strings, classes, or "
2754 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002755 goto raise_error;
2756 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002758 if (tb == NULL)
2759 return WHY_EXCEPTION;
2760 else
2761 return WHY_RERAISE;
2762 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 Py_XDECREF(value);
2764 Py_XDECREF(type);
2765 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002766 return WHY_EXCEPTION;
2767}
2768
Tim Petersd6d010b2001-06-21 02:49:55 +00002769/* Iterate v argcnt times and store the results on the stack (via decreasing
2770 sp). Return 1 for success, 0 if error. */
2771
Barry Warsawe42b18f1997-08-25 22:13:04 +00002772static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002773unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002774{
Tim Petersd6d010b2001-06-21 02:49:55 +00002775 int i = 0;
2776 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002777 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002778
Tim Petersd6d010b2001-06-21 02:49:55 +00002779 assert(v != NULL);
2780
2781 it = PyObject_GetIter(v);
2782 if (it == NULL)
2783 goto Error;
2784
2785 for (; i < argcnt; i++) {
2786 w = PyIter_Next(it);
2787 if (w == NULL) {
2788 /* Iterator done, via error or exhaustion. */
2789 if (!PyErr_Occurred()) {
2790 PyErr_Format(PyExc_ValueError,
2791 "need more than %d value%s to unpack",
2792 i, i == 1 ? "" : "s");
2793 }
2794 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002795 }
2796 *--sp = w;
2797 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002798
2799 /* We better have exhausted the iterator now. */
2800 w = PyIter_Next(it);
2801 if (w == NULL) {
2802 if (PyErr_Occurred())
2803 goto Error;
2804 Py_DECREF(it);
2805 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002806 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002807 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002808 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002809 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002810Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002811 for (; i > 0; i--, sp++)
2812 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002813 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002814 return 0;
2815}
2816
2817
Guido van Rossum96a42c81992-01-12 02:29:51 +00002818#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002820prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002822 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 if (PyObject_Print(v, stdout, 0) != 0)
2824 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002825 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002826 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002828#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002830static void
Fred Drake5755ce62001-06-27 19:19:46 +00002831call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002832{
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002834 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002835 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002836 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002837 value = Py_None;
2838 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002839 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002841 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002843 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002844 }
Fred Drake5755ce62001-06-27 19:19:46 +00002845 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002846 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002847 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002848 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002849 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002850 Py_XDECREF(type);
2851 Py_XDECREF(value);
2852 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002853 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002854}
2855
Fred Drake4ec5d562001-10-04 19:26:43 +00002856static void
2857call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2858 int what)
2859{
2860 PyObject *type, *value, *traceback;
2861 int err;
2862 PyErr_Fetch(&type, &value, &traceback);
2863 err = call_trace(func, obj, frame, what, NULL);
2864 if (err == 0)
2865 PyErr_Restore(type, value, traceback);
2866 else {
2867 Py_XDECREF(type);
2868 Py_XDECREF(value);
2869 Py_XDECREF(traceback);
2870 }
2871}
2872
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002873static int
Fred Drake5755ce62001-06-27 19:19:46 +00002874call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2875 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002876{
Fred Drake5755ce62001-06-27 19:19:46 +00002877 register PyThreadState *tstate = frame->f_tstate;
2878 int result;
2879 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002880 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002881 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002882 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002883 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002884 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2885 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002886 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002887 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002888}
2889
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002890static void
2891maybe_call_line_trace(int opcode, Py_tracefunc func, PyObject *obj,
2892 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2893{
2894 /* The theory of SET_LINENO-less tracing.
2895
2896 In a nutshell, we use the co_lnotab field of the code object
2897 to tell when execution has moved onto a different line.
2898
2899 As mentioned above, the basic idea is so set things up so
2900 that
2901
2902 *instr_lb <= frame->f_lasti < *instr_ub
2903
2904 is true so long as execution does not change lines.
2905
2906 This is all fairly simple. Digging the information out of
2907 co_lnotab takes some work, but is conceptually clear.
2908
2909 Somewhat harder to explain is why we don't call the line
2910 trace function when executing a POP_TOP or RETURN_NONE
2911 opcodes. An example probably serves best.
2912
2913 Consider this code:
2914
2915 1: def f(a):
2916 2: if a:
2917 3: print 1
2918 4: else:
2919 5: print 2
2920
2921 which compiles to this:
2922
2923 2 0 LOAD_FAST 0 (a)
2924 3 JUMP_IF_FALSE 9 (to 15)
2925 6 POP_TOP
2926
2927 3 7 LOAD_CONST 1 (1)
2928 10 PRINT_ITEM
2929 11 PRINT_NEWLINE
2930 12 JUMP_FORWARD 6 (to 21)
2931 >> 15 POP_TOP
2932
2933 5 16 LOAD_CONST 2 (2)
2934 19 PRINT_ITEM
2935 20 PRINT_NEWLINE
2936 >> 21 RETURN_NONE
2937
2938 If a is false, execution will jump to instruction at offset
2939 15 and the co_lnotab will claim that execution has moved to
2940 line 3. This is at best misleading. In this case we could
2941 associate the POP_TOP with line 4, but that doesn't make
2942 sense in all cases (I think).
2943
2944 On the other hand, if a is true, execution will jump from
2945 instruction offset 12 to offset 21. Then the co_lnotab would
2946 imply that execution has moved to line 5, which is again
2947 misleading.
2948
2949 This is why it is important that RETURN_NONE is *only* used
2950 for the "falling off the end of the function" form of
2951 returning None -- using it for code like
2952
2953 1: def f():
2954 2: return
2955
2956 would, once again, lead to misleading tracing behaviour.
2957
2958 It is also worth mentioning that getting tracing behaviour
2959 right is the *entire* motivation for adding the RETURN_NONE
2960 opcode.
2961 */
2962
2963 if (opcode != POP_TOP && opcode != RETURN_NONE &&
2964 (frame->f_lasti < *instr_lb || frame->f_lasti > *instr_ub)) {
2965 PyCodeObject* co = frame->f_code;
2966 int size, addr;
2967 unsigned char* p;
2968
2969 call_trace(func, obj, frame, PyTrace_LINE, Py_None);
2970
2971 size = PyString_Size(co->co_lnotab) / 2;
2972 p = (unsigned char*)PyString_AsString(co->co_lnotab);
2973
2974 /* possible optimization: if f->f_lasti == instr_ub
2975 (likely to be a common case) then we already know
2976 instr_lb -- if we stored the matching value of p
2977 somwhere we could skip the first while loop. */
2978
2979 addr = 0;
2980
2981 /* see comments in compile.c for the description of
2982 co_lnotab. A point to remember: increments to p
2983 should come in pairs -- although we don't care about
2984 the line increments here, treating them as byte
2985 increments gets confusing, to say the least. */
2986
2987 while (size >= 0) {
2988 if (addr + *p > frame->f_lasti)
2989 break;
2990 addr += *p++;
2991 p++;
2992 --size;
2993 }
2994 *instr_lb = addr;
2995 if (size > 0) {
2996 while (--size >= 0) {
2997 addr += *p++;
2998 if (*p++)
2999 break;
3000 }
3001 *instr_ub = addr;
3002 }
3003 else {
3004 *instr_ub = INT_MAX;
3005 }
3006 }
3007}
3008
Fred Drake5755ce62001-06-27 19:19:46 +00003009void
3010PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003011{
Fred Drake5755ce62001-06-27 19:19:46 +00003012 PyThreadState *tstate = PyThreadState_Get();
3013 PyObject *temp = tstate->c_profileobj;
3014 Py_XINCREF(arg);
3015 tstate->c_profilefunc = NULL;
3016 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003017 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003018 Py_XDECREF(temp);
3019 tstate->c_profilefunc = func;
3020 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003021 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003022}
3023
3024void
3025PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3026{
3027 PyThreadState *tstate = PyThreadState_Get();
3028 PyObject *temp = tstate->c_traceobj;
3029 Py_XINCREF(arg);
3030 tstate->c_tracefunc = NULL;
3031 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00003032 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003033 Py_XDECREF(temp);
3034 tstate->c_tracefunc = func;
3035 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00003036 tstate->use_tracing = ((func != NULL)
3037 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003038}
3039
Guido van Rossumb209a111997-04-29 18:18:01 +00003040PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003041PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003042{
Guido van Rossum25ce5661997-08-02 03:10:38 +00003043 PyThreadState *tstate = PyThreadState_Get();
3044 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003045 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00003046 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003047 else
3048 return current_frame->f_builtins;
3049}
3050
Guido van Rossumb209a111997-04-29 18:18:01 +00003051PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003052PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003053{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003054 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00003055 if (current_frame == NULL)
3056 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003057 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003058 return current_frame->f_locals;
3059}
3060
Guido van Rossumb209a111997-04-29 18:18:01 +00003061PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003062PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003063{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003064 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003065 if (current_frame == NULL)
3066 return NULL;
3067 else
3068 return current_frame->f_globals;
3069}
3070
Guido van Rossumb209a111997-04-29 18:18:01 +00003071PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003072PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003073{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003074 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00003075 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00003076}
3077
Guido van Rossum6135a871995-01-09 17:53:26 +00003078int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003079PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003080{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003081 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003082 return current_frame == NULL ? 0 : current_frame->f_restricted;
3083}
3084
Guido van Rossumbe270261997-05-22 22:26:18 +00003085int
Tim Peters5ba58662001-07-16 02:29:45 +00003086PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003087{
3088 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00003089 int result = 0;
3090
3091 if (current_frame != NULL) {
3092 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003093 const int compilerflags = codeflags & PyCF_MASK;
3094 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003095 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003096 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003097 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003098#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003099 if (codeflags & CO_GENERATOR_ALLOWED) {
3100 result = 1;
3101 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3102 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003103#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003104 }
3105 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003106}
3107
3108int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003109Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110{
Guido van Rossumb209a111997-04-29 18:18:01 +00003111 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003112 if (f == NULL)
3113 return 0;
3114 if (!PyFile_SoftSpace(f, 0))
3115 return 0;
3116 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117}
3118
Guido van Rossum3f5da241990-12-20 15:06:42 +00003119
Guido van Rossum681d79a1995-07-18 14:51:37 +00003120/* External interface to call any callable object.
3121 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003122
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003123#undef PyEval_CallObject
3124/* for backward compatibility: export this interface */
3125
Guido van Rossumb209a111997-04-29 18:18:01 +00003126PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003127PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003128{
Guido van Rossumb209a111997-04-29 18:18:01 +00003129 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003130}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003131#define PyEval_CallObject(func,arg) \
3132 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003133
Guido van Rossumb209a111997-04-29 18:18:01 +00003134PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003135PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003136{
Jeremy Hylton52820442001-01-03 23:52:36 +00003137 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003138
3139 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003140 arg = PyTuple_New(0);
3141 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003142 PyErr_SetString(PyExc_TypeError,
3143 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003144 return NULL;
3145 }
3146 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003147 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003148
Guido van Rossumb209a111997-04-29 18:18:01 +00003149 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003150 PyErr_SetString(PyExc_TypeError,
3151 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003152 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003153 return NULL;
3154 }
3155
Tim Peters6d6c1a32001-08-02 04:15:00 +00003156 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003157 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003158 return result;
3159}
3160
Tim Peters6d6c1a32001-08-02 04:15:00 +00003161char *
3162PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003163{
3164 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003165 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003166 else if (PyFunction_Check(func))
3167 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3168 else if (PyCFunction_Check(func))
3169 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3170 else if (PyClass_Check(func))
3171 return PyString_AsString(((PyClassObject*)func)->cl_name);
3172 else if (PyInstance_Check(func)) {
3173 return PyString_AsString(
3174 ((PyInstanceObject*)func)->in_class->cl_name);
3175 } else {
3176 return func->ob_type->tp_name;
3177 }
3178}
3179
Tim Peters6d6c1a32001-08-02 04:15:00 +00003180char *
3181PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003182{
3183 if (PyMethod_Check(func))
3184 return "()";
3185 else if (PyFunction_Check(func))
3186 return "()";
3187 else if (PyCFunction_Check(func))
3188 return "()";
3189 else if (PyClass_Check(func))
3190 return " constructor";
3191 else if (PyInstance_Check(func)) {
3192 return " instance";
3193 } else {
3194 return " object";
3195 }
3196}
3197
Jeremy Hylton52820442001-01-03 23:52:36 +00003198#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3199
3200/* The two fast_xxx() functions optimize calls for which no argument
3201 tuple is necessary; the objects are passed directly from the stack.
3202 fast_cfunction() is called for METH_OLDARGS functions.
3203 fast_function() is for functions with no special argument handling.
3204*/
3205
3206static PyObject *
3207fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3208{
3209 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3210 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003211 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003212
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003213 switch (flags) {
3214 case METH_OLDARGS:
3215 if (na == 0)
3216 return (*meth)(self, NULL);
3217 else if (na == 1) {
3218 PyObject *arg = EXT_POP(*pp_stack);
3219 PyObject *result = (*meth)(self, arg);
3220 Py_DECREF(arg);
3221 return result;
3222 } else {
3223 PyObject *args = load_args(pp_stack, na);
3224 PyObject *result = (*meth)(self, args);
3225 Py_DECREF(args);
3226 return result;
3227 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003228 case METH_NOARGS:
3229 if (na == 0)
3230 return (*meth)(self, NULL);
3231 PyErr_Format(PyExc_TypeError,
3232 "%.200s() takes no arguments (%d given)",
3233 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3234 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003235 case METH_O:
3236 if (na == 1) {
3237 PyObject *arg = EXT_POP(*pp_stack);
3238 PyObject *result = (*meth)(self, arg);
3239 Py_DECREF(arg);
3240 return result;
3241 }
3242 PyErr_Format(PyExc_TypeError,
3243 "%.200s() takes exactly one argument (%d given)",
3244 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3245 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003246 default:
3247 fprintf(stderr, "%.200s() flags = %d\n",
3248 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3249 PyErr_BadInternalCall();
3250 return NULL;
3251 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003252}
3253
3254static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003255fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003256{
3257 PyObject *co = PyFunction_GET_CODE(func);
3258 PyObject *globals = PyFunction_GET_GLOBALS(func);
3259 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003260 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003261 PyObject **d = NULL;
3262 int nd = 0;
3263
3264 if (argdefs != NULL) {
3265 d = &PyTuple_GET_ITEM(argdefs, 0);
3266 nd = ((PyTupleObject *)argdefs)->ob_size;
3267 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003268 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003269 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003270 (*pp_stack)-2*nk, nk, d, nd,
3271 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003272}
3273
3274static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003275update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3276 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003277{
3278 PyObject *kwdict = NULL;
3279 if (orig_kwdict == NULL)
3280 kwdict = PyDict_New();
3281 else {
3282 kwdict = PyDict_Copy(orig_kwdict);
3283 Py_DECREF(orig_kwdict);
3284 }
3285 if (kwdict == NULL)
3286 return NULL;
3287 while (--nk >= 0) {
3288 int err;
3289 PyObject *value = EXT_POP(*pp_stack);
3290 PyObject *key = EXT_POP(*pp_stack);
3291 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003292 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003293 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003294 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003295 PyEval_GetFuncName(func),
3296 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003297 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003298 Py_DECREF(key);
3299 Py_DECREF(value);
3300 Py_DECREF(kwdict);
3301 return NULL;
3302 }
3303 err = PyDict_SetItem(kwdict, key, value);
3304 Py_DECREF(key);
3305 Py_DECREF(value);
3306 if (err) {
3307 Py_DECREF(kwdict);
3308 return NULL;
3309 }
3310 }
3311 return kwdict;
3312}
3313
3314static PyObject *
3315update_star_args(int nstack, int nstar, PyObject *stararg,
3316 PyObject ***pp_stack)
3317{
3318 PyObject *callargs, *w;
3319
3320 callargs = PyTuple_New(nstack + nstar);
3321 if (callargs == NULL) {
3322 return NULL;
3323 }
3324 if (nstar) {
3325 int i;
3326 for (i = 0; i < nstar; i++) {
3327 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3328 Py_INCREF(a);
3329 PyTuple_SET_ITEM(callargs, nstack + i, a);
3330 }
3331 }
3332 while (--nstack >= 0) {
3333 w = EXT_POP(*pp_stack);
3334 PyTuple_SET_ITEM(callargs, nstack, w);
3335 }
3336 return callargs;
3337}
3338
3339static PyObject *
3340load_args(PyObject ***pp_stack, int na)
3341{
3342 PyObject *args = PyTuple_New(na);
3343 PyObject *w;
3344
3345 if (args == NULL)
3346 return NULL;
3347 while (--na >= 0) {
3348 w = EXT_POP(*pp_stack);
3349 PyTuple_SET_ITEM(args, na, w);
3350 }
3351 return args;
3352}
3353
3354static PyObject *
3355do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3356{
3357 PyObject *callargs = NULL;
3358 PyObject *kwdict = NULL;
3359 PyObject *result = NULL;
3360
3361 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003362 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003363 if (kwdict == NULL)
3364 goto call_fail;
3365 }
3366 callargs = load_args(pp_stack, na);
3367 if (callargs == NULL)
3368 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003369 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003370 call_fail:
3371 Py_XDECREF(callargs);
3372 Py_XDECREF(kwdict);
3373 return result;
3374}
3375
3376static PyObject *
3377ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3378{
3379 int nstar = 0;
3380 PyObject *callargs = NULL;
3381 PyObject *stararg = NULL;
3382 PyObject *kwdict = NULL;
3383 PyObject *result = NULL;
3384
3385 if (flags & CALL_FLAG_KW) {
3386 kwdict = EXT_POP(*pp_stack);
3387 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003388 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003389 "%s%s argument after ** "
3390 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003391 PyEval_GetFuncName(func),
3392 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003393 goto ext_call_fail;
3394 }
3395 }
3396 if (flags & CALL_FLAG_VAR) {
3397 stararg = EXT_POP(*pp_stack);
3398 if (!PyTuple_Check(stararg)) {
3399 PyObject *t = NULL;
3400 t = PySequence_Tuple(stararg);
3401 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003402 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3403 PyErr_Format(PyExc_TypeError,
3404 "%s%s argument after * "
3405 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003406 PyEval_GetFuncName(func),
3407 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003408 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003409 goto ext_call_fail;
3410 }
3411 Py_DECREF(stararg);
3412 stararg = t;
3413 }
3414 nstar = PyTuple_GET_SIZE(stararg);
3415 }
3416 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003417 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003418 if (kwdict == NULL)
3419 goto ext_call_fail;
3420 }
3421 callargs = update_star_args(na, nstar, stararg, pp_stack);
3422 if (callargs == NULL)
3423 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003424 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003425 ext_call_fail:
3426 Py_XDECREF(callargs);
3427 Py_XDECREF(kwdict);
3428 Py_XDECREF(stararg);
3429 return result;
3430}
3431
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003432#define SLICE_ERROR_MSG \
3433 "standard sequence type does not support step size other than one"
3434
Tim Peterscb479e72001-12-16 19:11:44 +00003435/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3436 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3437 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3438*/
Tim Petersb5196382001-12-16 19:44:20 +00003439/* Note: If v is NULL, return success without storing into *pi. This
3440 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3441 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003442*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003443int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003444_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445{
Tim Petersb5196382001-12-16 19:44:20 +00003446 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003447 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003448 if (PyInt_Check(v)) {
3449 x = PyInt_AsLong(v);
3450 } else if (PyLong_Check(v)) {
3451 x = PyLong_AsLong(v);
3452 if (x==-1 && PyErr_Occurred()) {
3453 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003454 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003455
Guido van Rossumac7be682001-01-17 15:42:30 +00003456 if (!PyErr_ExceptionMatches(
3457 PyExc_OverflowError)) {
3458 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003459 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003460 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003461 }
3462
Guido van Rossumac7be682001-01-17 15:42:30 +00003463 /* Clear the OverflowError */
3464 PyErr_Clear();
3465
3466 /* It's an overflow error, so we need to
3467 check the sign of the long integer,
3468 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003469 the error. */
3470
3471 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003472 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003473 if (long_zero == NULL)
3474 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003475
3476 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003477 cmp = PyObject_RichCompareBool(v, long_zero,
3478 Py_GT);
3479 Py_DECREF(long_zero);
3480 if (cmp < 0)
3481 return 0;
3482 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003483 x = INT_MAX;
3484 else
3485 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003486 }
3487 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003488 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003489 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003490 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003491 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003492 /* Truncate -- very long indices are truncated anyway */
3493 if (x > INT_MAX)
3494 x = INT_MAX;
3495 else if (x < -INT_MAX)
3496 x = 0;
3497 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003499 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003500}
3501
Guido van Rossum50d756e2001-08-18 17:43:36 +00003502#undef ISINT
3503#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3504
Guido van Rossumb209a111997-04-29 18:18:01 +00003505static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003506apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003508 PyTypeObject *tp = u->ob_type;
3509 PySequenceMethods *sq = tp->tp_as_sequence;
3510
3511 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3512 int ilow = 0, ihigh = INT_MAX;
3513 if (!_PyEval_SliceIndex(v, &ilow))
3514 return NULL;
3515 if (!_PyEval_SliceIndex(w, &ihigh))
3516 return NULL;
3517 return PySequence_GetSlice(u, ilow, ihigh);
3518 }
3519 else {
3520 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003521 if (slice != NULL) {
3522 PyObject *res = PyObject_GetItem(u, slice);
3523 Py_DECREF(slice);
3524 return res;
3525 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003526 else
3527 return NULL;
3528 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003530
3531static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003532assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3533 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003535 PyTypeObject *tp = u->ob_type;
3536 PySequenceMethods *sq = tp->tp_as_sequence;
3537
3538 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3539 int ilow = 0, ihigh = INT_MAX;
3540 if (!_PyEval_SliceIndex(v, &ilow))
3541 return -1;
3542 if (!_PyEval_SliceIndex(w, &ihigh))
3543 return -1;
3544 if (x == NULL)
3545 return PySequence_DelSlice(u, ilow, ihigh);
3546 else
3547 return PySequence_SetSlice(u, ilow, ihigh, x);
3548 }
3549 else {
3550 PyObject *slice = PySlice_New(v, w, NULL);
3551 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003552 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003553 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003554 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003555 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003556 res = PyObject_DelItem(u, slice);
3557 Py_DECREF(slice);
3558 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003559 }
3560 else
3561 return -1;
3562 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003563}
3564
Guido van Rossumb209a111997-04-29 18:18:01 +00003565static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003566cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003567{
Guido van Rossumac7be682001-01-17 15:42:30 +00003568 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003569 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003570 case PyCmp_IS:
3571 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003572 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003573 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003574 res = !res;
3575 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003576 case PyCmp_IN:
3577 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003578 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003579 if (res < 0)
3580 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003581 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003582 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003584 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003585 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586 break;
3587 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003588 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003590 v = res ? Py_True : Py_False;
3591 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003592 return v;
3593}
3594
Thomas Wouters52152252000-08-17 22:55:00 +00003595static PyObject *
3596import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003597{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003598 PyObject *x;
3599
3600 x = PyObject_GetAttr(v, name);
3601 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003602 PyErr_Format(PyExc_ImportError,
3603 "cannot import name %.230s",
3604 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003605 }
Thomas Wouters52152252000-08-17 22:55:00 +00003606 return x;
3607}
Guido van Rossumac7be682001-01-17 15:42:30 +00003608
Thomas Wouters52152252000-08-17 22:55:00 +00003609static int
3610import_all_from(PyObject *locals, PyObject *v)
3611{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003612 PyObject *all = PyObject_GetAttrString(v, "__all__");
3613 PyObject *dict, *name, *value;
3614 int skip_leading_underscores = 0;
3615 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003616
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003617 if (all == NULL) {
3618 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3619 return -1; /* Unexpected error */
3620 PyErr_Clear();
3621 dict = PyObject_GetAttrString(v, "__dict__");
3622 if (dict == NULL) {
3623 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3624 return -1;
3625 PyErr_SetString(PyExc_ImportError,
3626 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003627 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003628 }
3629 all = PyMapping_Keys(dict);
3630 Py_DECREF(dict);
3631 if (all == NULL)
3632 return -1;
3633 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003634 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003635
3636 for (pos = 0, err = 0; ; pos++) {
3637 name = PySequence_GetItem(all, pos);
3638 if (name == NULL) {
3639 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3640 err = -1;
3641 else
3642 PyErr_Clear();
3643 break;
3644 }
3645 if (skip_leading_underscores &&
3646 PyString_Check(name) &&
3647 PyString_AS_STRING(name)[0] == '_')
3648 {
3649 Py_DECREF(name);
3650 continue;
3651 }
3652 value = PyObject_GetAttr(v, name);
3653 if (value == NULL)
3654 err = -1;
3655 else
3656 err = PyDict_SetItem(locals, name, value);
3657 Py_DECREF(name);
3658 Py_XDECREF(value);
3659 if (err != 0)
3660 break;
3661 }
3662 Py_DECREF(all);
3663 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003664}
3665
Guido van Rossumb209a111997-04-29 18:18:01 +00003666static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003667build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003668{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003669 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003670
3671 if (PyDict_Check(methods))
3672 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003673 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003674 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003675 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3676 base = PyTuple_GET_ITEM(bases, 0);
3677 metaclass = PyObject_GetAttrString(base, "__class__");
3678 if (metaclass == NULL) {
3679 PyErr_Clear();
3680 metaclass = (PyObject *)base->ob_type;
3681 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003682 }
3683 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003684 else {
3685 PyObject *g = PyEval_GetGlobals();
3686 if (g != NULL && PyDict_Check(g))
3687 metaclass = PyDict_GetItemString(g, "__metaclass__");
3688 if (metaclass == NULL)
3689 metaclass = (PyObject *) &PyClass_Type;
3690 Py_INCREF(metaclass);
3691 }
3692 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3693 Py_DECREF(metaclass);
3694 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003695}
3696
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003697static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003698exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3699 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003700{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003701 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003702 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003703 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003704
Guido van Rossumb209a111997-04-29 18:18:01 +00003705 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3706 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003707 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003708 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003709 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003710 locals = PyTuple_GetItem(prog, 2);
3711 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003712 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003713 if (globals == Py_None) {
3714 globals = PyEval_GetGlobals();
3715 if (locals == Py_None) {
3716 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003717 plain = 1;
3718 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003719 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003720 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003721 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003722 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003723 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003724 !PyCode_Check(prog) &&
3725 !PyFile_Check(prog)) {
3726 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003727 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003728 return -1;
3729 }
Fred Drake661ea262000-10-24 19:57:45 +00003730 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003731 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003732 "exec: arg 2 must be a dictionary or None");
3733 return -1;
3734 }
3735 if (!PyDict_Check(locals)) {
3736 PyErr_SetString(PyExc_TypeError,
3737 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003738 return -1;
3739 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003740 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003741 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003742 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003743 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3744 PyErr_SetString(PyExc_TypeError,
3745 "code object passed to exec may not contain free variables");
3746 return -1;
3747 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003748 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003749 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003750 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003751 FILE *fp = PyFile_AsFile(prog);
3752 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003753 PyCompilerFlags cf;
3754 cf.cf_flags = 0;
3755 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003756 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3757 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003758 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003759 v = PyRun_File(fp, name, Py_file_input, globals,
3760 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003761 }
3762 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003763 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003764 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003765 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003766 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003767 cf.cf_flags = 0;
3768 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003769 v = PyRun_StringFlags(str, Py_file_input, globals,
3770 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003771 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003772 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003773 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003774 if (plain)
3775 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003776 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003777 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003778 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003779 return 0;
3780}
Guido van Rossum24c13741995-02-14 09:42:43 +00003781
Guido van Rossumac7be682001-01-17 15:42:30 +00003782static void
Paul Prescode68140d2000-08-30 20:25:01 +00003783format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3784{
3785 char *obj_str;
3786
3787 if (!obj)
3788 return;
3789
3790 obj_str = PyString_AsString(obj);
3791 if (!obj_str)
3792 return;
3793
3794 PyErr_Format(exc, format_str, obj_str);
3795}
Guido van Rossum950361c1997-01-24 13:49:28 +00003796
3797#ifdef DYNAMIC_EXECUTION_PROFILE
3798
Skip Montanarof118cb12001-10-15 20:51:38 +00003799static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003800getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003801{
3802 int i;
3803 PyObject *l = PyList_New(256);
3804 if (l == NULL) return NULL;
3805 for (i = 0; i < 256; i++) {
3806 PyObject *x = PyInt_FromLong(a[i]);
3807 if (x == NULL) {
3808 Py_DECREF(l);
3809 return NULL;
3810 }
3811 PyList_SetItem(l, i, x);
3812 }
3813 for (i = 0; i < 256; i++)
3814 a[i] = 0;
3815 return l;
3816}
3817
3818PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003819_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003820{
3821#ifndef DXPAIRS
3822 return getarray(dxp);
3823#else
3824 int i;
3825 PyObject *l = PyList_New(257);
3826 if (l == NULL) return NULL;
3827 for (i = 0; i < 257; i++) {
3828 PyObject *x = getarray(dxpairs[i]);
3829 if (x == NULL) {
3830 Py_DECREF(l);
3831 return NULL;
3832 }
3833 PyList_SetItem(l, i, x);
3834 }
3835 return l;
3836#endif
3837}
3838
3839#endif