blob: 8bd945ed05b42774daef53d78f6707f525d8af1c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hyltone8c04322002-08-16 17:47:26 +000036static PyObject *call_function(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +000037static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
Jeremy Hylton52820442001-01-03 23:52:36 +000038static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000054static void maybe_call_line_trace(int, Py_tracefunc, PyObject *,
55 PyFrameObject *, int *, int *);
56
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
58static int assign_slice(PyObject *, PyObject *,
59 PyObject *, PyObject *);
60static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000061static PyObject *import_from(PyObject *, PyObject *);
62static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static PyObject *build_class(PyObject *, PyObject *, PyObject *);
64static int exec_statement(PyFrameObject *,
65 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000066static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
67static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000068static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000069
Paul Prescode68140d2000-08-30 20:25:01 +000070#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000071 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000072#define GLOBAL_NAME_ERROR_MSG \
73 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000074#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000075 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000076#define UNBOUNDFREE_ERROR_MSG \
77 "free variable '%.200s' referenced before assignment" \
78 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000079
Guido van Rossum950361c1997-01-24 13:49:28 +000080/* Dynamic execution profile */
81#ifdef DYNAMIC_EXECUTION_PROFILE
82#ifdef DXPAIRS
83static long dxpairs[257][256];
84#define dxp dxpairs[256]
85#else
86static long dxp[256];
87#endif
88#endif
89
Jeremy Hylton938ace62002-07-17 16:30:39 +000090static PyTypeObject gentype;
Tim Peters5ca576e2001-06-18 22:08:13 +000091
92typedef struct {
93 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000094 /* The gi_ prefix is intended to remind of generator-iterator. */
95
96 PyFrameObject *gi_frame;
97
Tim Peterse77f2e22001-06-26 22:24:51 +000098 /* True if generator is being executed. */
99 int gi_running;
Fred Drake72bc4562002-08-09 18:35:52 +0000100
101 /* List of weak reference. */
102 PyObject *gi_weakreflist;
Tim Peters5ca576e2001-06-18 22:08:13 +0000103} genobject;
104
105static PyObject *
106gen_new(PyFrameObject *f)
107{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000108 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000109 if (gen == NULL) {
110 Py_DECREF(f);
111 return NULL;
112 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000113 gen->gi_frame = f;
114 gen->gi_running = 0;
Fred Drake72bc4562002-08-09 18:35:52 +0000115 gen->gi_weakreflist = NULL;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000116 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000117 return (PyObject *)gen;
118}
119
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000120static int
121gen_traverse(genobject *gen, visitproc visit, void *arg)
122{
123 return visit((PyObject *)gen->gi_frame, arg);
124}
125
Tim Peters5ca576e2001-06-18 22:08:13 +0000126static void
127gen_dealloc(genobject *gen)
128{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000129 _PyObject_GC_UNTRACK(gen);
Fred Drake72bc4562002-08-09 18:35:52 +0000130 if (gen->gi_weakreflist != NULL)
131 PyObject_ClearWeakRefs((PyObject *) gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000133 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000134}
135
136static PyObject *
137gen_iternext(genobject *gen)
138{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000139 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000140 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 PyObject *result;
142
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000143 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000144 PyErr_SetString(PyExc_ValueError,
145 "generator already executing");
146 return NULL;
147 }
Tim Peters8c963692001-06-23 05:26:56 +0000148 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000150
151 /* Generators always return to their most recent caller, not
152 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000153 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000154 assert(f->f_back == NULL);
155 f->f_back = tstate->frame;
156
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000157 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000158 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000159 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000160
161 /* Don't keep the reference to f_back any longer than necessary. It
162 * may keep a chain of frames alive or it could create a reference
163 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000164 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000165 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166
Tim Petersad1a18b2001-06-23 06:19:16 +0000167 /* If the generator just returned (as opposed to yielding), signal
168 * that the generator is exhausted. */
169 if (result == Py_None && f->f_stacktop == NULL) {
170 Py_DECREF(result);
171 result = NULL;
172 }
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000175}
176
177static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000178gen_getiter(PyObject *gen)
179{
180 Py_INCREF(gen);
181 return gen;
182}
183
Guido van Rossum6f799372001-09-20 20:46:19 +0000184static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000185 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
186 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
187 {NULL} /* Sentinel */
188};
Tim Peters5ca576e2001-06-18 22:08:13 +0000189
Tim Peters0c322792002-07-17 16:49:03 +0000190static PyTypeObject gentype = {
Tim Peters5ca576e2001-06-18 22:08:13 +0000191 PyObject_HEAD_INIT(&PyType_Type)
192 0, /* ob_size */
193 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000194 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000195 0, /* tp_itemsize */
196 /* methods */
197 (destructor)gen_dealloc, /* tp_dealloc */
198 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000199 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000200 0, /* tp_setattr */
201 0, /* tp_compare */
202 0, /* tp_repr */
203 0, /* tp_as_number */
204 0, /* tp_as_sequence */
205 0, /* tp_as_mapping */
206 0, /* tp_hash */
207 0, /* tp_call */
208 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000209 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000210 0, /* tp_setattro */
211 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000212 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000214 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000215 0, /* tp_clear */
216 0, /* tp_richcompare */
Fred Drake72bc4562002-08-09 18:35:52 +0000217 offsetof(genobject, gi_weakreflist), /* tp_weaklistoffset */
Tim Peters5ca576e2001-06-18 22:08:13 +0000218 (getiterfunc)gen_getiter, /* tp_iter */
219 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Petersa64295b2002-07-17 00:15:22 +0000220 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 gen_memberlist, /* tp_members */
222 0, /* tp_getset */
223 0, /* tp_base */
224 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225};
226
227
Guido van Rossume59214e1994-08-30 08:01:59 +0000228#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000229
Guido van Rossum2571cc81999-04-07 16:07:23 +0000230#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000231#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000232#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000233#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000234
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235extern int _PyThread_Started; /* Flag for Py_Exit */
236
Guido van Rossum65d5b571998-12-21 19:32:43 +0000237static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000238static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000239
240void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000242{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000244 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000246 interpreter_lock = PyThread_allocate_lock();
247 PyThread_acquire_lock(interpreter_lock, 1);
248 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000250
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000254 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255}
256
257void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000259{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000260 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261}
262
263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000265{
266 if (tstate == NULL)
267 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000269 if (PyThreadState_Swap(tstate) != NULL)
270 Py_FatalError(
271 "PyEval_AcquireThread: non-NULL old thread state");
272}
273
274void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000276{
277 if (tstate == NULL)
278 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
279 if (PyThreadState_Swap(NULL) != tstate)
280 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000283
284/* This function is called from PyOS_AfterFork to ensure that newly
285 created child processes don't hold locks referring to threads which
286 are not running in the child process. (This could also be done using
287 pthread_atfork mechanism, at least for the pthreads implementation.) */
288
289void
290PyEval_ReInitThreads(void)
291{
292 if (!interpreter_lock)
293 return;
294 /*XXX Can't use PyThread_free_lock here because it does too
295 much error-checking. Doing this cleanly would require
296 adding a new function to each thread_*.h. Instead, just
297 create a new lock and waste a little bit of memory */
298 interpreter_lock = PyThread_allocate_lock();
299 PyThread_acquire_lock(interpreter_lock, 1);
300 main_thread = PyThread_get_thread_ident();
301}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302#endif
303
Guido van Rossumff4949e1992-08-05 19:58:53 +0000304/* Functions save_thread and restore_thread are always defined so
305 dynamically loaded modules needn't be compiled separately for use
306 with and without threads: */
307
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000308PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000309PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000311 PyThreadState *tstate = PyThreadState_Swap(NULL);
312 if (tstate == NULL)
313 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000314#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000315 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000318 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319}
320
321void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 if (tstate == NULL)
325 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 }
332#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336
Guido van Rossuma9672091994-09-14 13:31:22 +0000337/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
338 signal handlers or Mac I/O completion routines) can schedule calls
339 to a function to be called synchronously.
340 The synchronous function is called with one void* argument.
341 It should return 0 for success or -1 for failure -- failure should
342 be accompanied by an exception.
343
344 If registry succeeds, the registry function returns 0; if it fails
345 (e.g. due to too many pending calls) it returns -1 (without setting
346 an exception condition).
347
348 Note that because registry may occur from within signal handlers,
349 or other asynchronous events, calling malloc() is unsafe!
350
351#ifdef WITH_THREAD
352 Any thread can schedule pending calls, but only the main thread
353 will execute them.
354#endif
355
356 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
357 There are two possible race conditions:
358 (1) nested asynchronous registry calls;
359 (2) registry calls made while pending calls are being processed.
360 While (1) is very unlikely, (2) is a real possibility.
361 The current code is safe against (2), but not against (1).
362 The safety against (2) is derived from the fact that only one
363 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000364
Guido van Rossuma027efa1997-05-05 20:56:21 +0000365 XXX Darn! With the advent of thread state, we should have an array
366 of pending calls per thread in the thread state! Later...
367*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000368
Guido van Rossuma9672091994-09-14 13:31:22 +0000369#define NPENDINGCALLS 32
370static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000371 int (*func)(void *);
372 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373} pendingcalls[NPENDINGCALLS];
374static volatile int pendingfirst = 0;
375static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
378int
Thomas Wouters334fb892000-07-25 12:56:38 +0000379Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000380{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 int i, j;
383 /* XXX Begin critical section */
384 /* XXX If you want this to be safe against nested
385 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 if (busy)
387 return -1;
388 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389 i = pendinglast;
390 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000391 if (j == pendingfirst) {
392 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000393 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000394 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 pendingcalls[i].func = func;
396 pendingcalls[i].arg = arg;
397 pendinglast = j;
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. Hudson62897c52002-08-20 15:19:14 +0000602 /* An explanation is in order for the next line.
603
604 f->f_lasti now refers to the index of the last instruction
605 executed. You might think this was obvious from the name, but
606 this wasn't always true before 2.3! PyFrame_New now sets
Michael W. Hudsonc230b0e2002-08-20 15:43:16 +0000607 f->f_lasti to -1 (i.e. the index *before* the first instruction)
Michael W. Hudson62897c52002-08-20 15:19:14 +0000608 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
609 does work. Promise. */
610 next_instr = first_instr + f->f_lasti + 1;
Tim Peters8c963692001-06-23 05:26:56 +0000611 stack_pointer = f->f_stacktop;
612 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000613 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000614
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000615 if (tstate->use_tracing) {
616 if (tstate->c_tracefunc != NULL) {
617 /* tstate->c_tracefunc, if defined, is a
618 function that will be called on *every* entry
619 to a code block. Its return value, if not
620 None, is a function that will be called at
621 the start of each executed line of code.
622 (Actually, the function must return itself
623 in order to continue tracing.) The trace
624 functions are called with three arguments:
625 a pointer to the current frame, a string
626 indicating why the function is called, and
627 an argument which depends on the situation.
628 The global trace function is also called
629 whenever an exception is detected. */
630 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
631 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000632 /* Trace function raised an error */
633 return NULL;
634 }
635 }
636 if (tstate->c_profilefunc != NULL) {
637 /* Similar for c_profilefunc, except it needn't
638 return itself and isn't called for "line" events */
639 if (call_trace(tstate->c_profilefunc,
640 tstate->c_profileobj,
641 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000642 /* Profile function raised an error */
643 return NULL;
644 }
645 }
646 }
647
Tim Peters5ca576e2001-06-18 22:08:13 +0000648#ifdef LLTRACE
649 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
650#endif
651#if defined(Py_DEBUG) || defined(LLTRACE)
652 filename = PyString_AsString(co->co_filename);
653#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000654
Guido van Rossum374a9221991-04-04 10:40:29 +0000655 why = WHY_NOT;
656 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000657 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000658 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000659
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 for (;;) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000661 assert(stack_pointer >= f->f_valuestack); /* else underflow */
662 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
663
Guido van Rossuma027efa1997-05-05 20:56:21 +0000664 /* Do periodic things. Doing this every time through
665 the loop would add too much overhead, so we do it
666 only every Nth instruction. We also do it if
667 ``things_to_do'' is set, i.e. when an asynchronous
668 event needs attention (e.g. a signal handler or
669 async I/O handler); see Py_AddPendingCall() and
670 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000671
Guido van Rossuma027efa1997-05-05 20:56:21 +0000672 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000673 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000674 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000675 if (Py_MakePendingCalls() < 0) {
676 why = WHY_EXCEPTION;
677 goto on_error;
678 }
679 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000680#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000681 /* If we have true signals, the signal handler
682 will call Py_AddPendingCall() so we don't
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000683 have to call PyErr_CheckSignals(). On the
684 Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000685 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000686 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 goto on_error;
688 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000689#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000690
Guido van Rossume59214e1994-08-30 08:01:59 +0000691#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000692 if (interpreter_lock) {
693 /* Give another thread a chance */
694
Guido van Rossum25ce5661997-08-02 03:10:38 +0000695 if (PyThreadState_Swap(NULL) != tstate)
696 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000697 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000698
699 /* Other threads may run now */
700
Guido van Rossum65d5b571998-12-21 19:32:43 +0000701 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000702 if (PyThreadState_Swap(tstate) != NULL)
703 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000704 }
705#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000707
Neil Schemenauer63543862002-02-17 19:10:14 +0000708 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000710
Guido van Rossum99bec951992-09-03 20:29:45 +0000711 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000712
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 opcode = NEXTOP();
714 if (HAS_ARG(opcode))
715 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000716 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000717#ifdef DYNAMIC_EXECUTION_PROFILE
718#ifdef DXPAIRS
719 dxpairs[lastopcode][opcode]++;
720 lastopcode = opcode;
721#endif
722 dxp[opcode]++;
723#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000724
Guido van Rossum96a42c81992-01-12 02:29:51 +0000725#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000727
Guido van Rossum96a42c81992-01-12 02:29:51 +0000728 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 if (HAS_ARG(opcode)) {
730 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000731 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 }
733 else {
734 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000735 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 }
737 }
738#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000739
740 /* line-by-line tracing support */
741
742 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
743 /* see maybe_call_line_trace
744 for expository comments */
745 maybe_call_line_trace(opcode,
746 tstate->c_tracefunc,
747 tstate->c_traceobj,
748 f, &instr_lb, &instr_ub);
749 }
750
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000752
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000754
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 /* BEWARE!
756 It is essential that any operation that fails sets either
757 x to NULL, err to nonzero, or why to anything but WHY_NOT,
758 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000759
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000761
Neil Schemenauer63543862002-02-17 19:10:14 +0000762 case LOAD_FAST:
763 x = GETLOCAL(oparg);
764 if (x != NULL) {
765 Py_INCREF(x);
766 PUSH(x);
767 goto fast_next_opcode;
768 }
769 format_exc_check_arg(PyExc_UnboundLocalError,
770 UNBOUNDLOCAL_ERROR_MSG,
771 PyTuple_GetItem(co->co_varnames, oparg));
772 break;
773
774 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000775 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000776 Py_INCREF(x);
777 PUSH(x);
778 goto fast_next_opcode;
779
780 case STORE_FAST:
781 v = POP();
782 SETLOCAL(oparg, v);
783 goto fast_next_opcode;
784
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 case POP_TOP:
786 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000787 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000788 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000789
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 case ROT_TWO:
791 v = POP();
792 w = POP();
793 PUSH(v);
794 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000795 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000796
Guido van Rossum374a9221991-04-04 10:40:29 +0000797 case ROT_THREE:
798 v = POP();
799 w = POP();
800 x = POP();
801 PUSH(v);
802 PUSH(x);
803 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000804 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000805
Thomas Wouters434d0822000-08-24 20:11:32 +0000806 case ROT_FOUR:
807 u = POP();
808 v = POP();
809 w = POP();
810 x = POP();
811 PUSH(u);
812 PUSH(x);
813 PUSH(w);
814 PUSH(v);
815 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000816
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 case DUP_TOP:
818 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000819 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000821 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000822
Thomas Wouters434d0822000-08-24 20:11:32 +0000823 case DUP_TOPX:
824 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000825 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000826 x = TOP();
827 Py_INCREF(x);
828 PUSH(x);
829 continue;
830 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000831 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000832 Py_INCREF(x);
833 w = TOP();
834 Py_INCREF(w);
835 PUSH(x);
836 PUSH(w);
837 PUSH(x);
838 continue;
839 case 3:
840 x = POP();
841 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000842 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000843 Py_INCREF(w);
844 v = TOP();
845 Py_INCREF(v);
846 PUSH(w);
847 PUSH(x);
848 PUSH(v);
849 PUSH(w);
850 PUSH(x);
851 continue;
852 case 4:
853 x = POP();
854 Py_INCREF(x);
855 w = POP();
856 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000857 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000858 Py_INCREF(v);
859 u = TOP();
860 Py_INCREF(u);
861 PUSH(v);
862 PUSH(w);
863 PUSH(x);
864 PUSH(u);
865 PUSH(v);
866 PUSH(w);
867 PUSH(x);
868 continue;
869 case 5:
870 x = POP();
871 Py_INCREF(x);
872 w = POP();
873 Py_INCREF(w);
874 v = POP();
875 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000876 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000877 Py_INCREF(u);
878 t = TOP();
879 Py_INCREF(t);
880 PUSH(u);
881 PUSH(v);
882 PUSH(w);
883 PUSH(x);
884 PUSH(t);
885 PUSH(u);
886 PUSH(v);
887 PUSH(w);
888 PUSH(x);
889 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000890 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000891 Py_FatalError("invalid argument to DUP_TOPX"
892 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000893 }
Tim Peters35ba6892000-10-11 07:04:49 +0000894 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000895
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 case UNARY_POSITIVE:
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000903
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 case UNARY_NEGATIVE:
905 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000906 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000909 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000911
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 case UNARY_NOT:
913 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000914 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000915 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000916 if (err == 0) {
917 Py_INCREF(Py_True);
918 PUSH(Py_True);
919 continue;
920 }
921 else if (err > 0) {
922 Py_INCREF(Py_False);
923 PUSH(Py_False);
924 err = 0;
925 continue;
926 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000928
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 case UNARY_CONVERT:
930 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000931 x = PyObject_Repr(v);
932 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000934 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000936
Guido van Rossum7928cd71991-10-24 14:59:31 +0000937 case UNARY_INVERT:
938 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000939 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000940 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000941 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000942 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000943 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000944
Guido van Rossum50564e81996-01-12 01:13:16 +0000945 case BINARY_POWER:
946 w = POP();
947 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000948 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000949 Py_DECREF(v);
950 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000951 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000952 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000953 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000954
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 case BINARY_MULTIPLY:
956 w = POP();
957 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000958 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(v);
960 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000962 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000964
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000966 if (!_Py_QnewFlag) {
967 w = POP();
968 v = POP();
969 x = PyNumber_Divide(v, w);
970 Py_DECREF(v);
971 Py_DECREF(w);
972 PUSH(x);
973 if (x != NULL) continue;
974 break;
975 }
976 /* -Qnew is in effect: fall through to
977 BINARY_TRUE_DIVIDE */
978 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 w = POP();
980 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000981 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_DECREF(v);
983 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000984 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000985 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000986 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000987
Guido van Rossum4668b002001-08-08 05:00:18 +0000988 case BINARY_FLOOR_DIVIDE:
989 w = POP();
990 v = POP();
991 x = PyNumber_FloorDivide(v, w);
992 Py_DECREF(v);
993 Py_DECREF(w);
994 PUSH(x);
995 if (x != NULL) continue;
996 break;
997
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 case BINARY_MODULO:
999 w = POP();
1000 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001001 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001002 Py_DECREF(v);
1003 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001004 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001005 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001007
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 case BINARY_ADD:
1009 w = POP();
1010 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001011 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001012 /* INLINE: int + int */
1013 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001014 a = PyInt_AS_LONG(v);
1015 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001016 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001017 if ((i^a) < 0 && (i^b) < 0)
1018 goto slow_add;
1019 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001020 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001021 else {
1022 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001023 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001024 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 Py_DECREF(v);
1026 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001028 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001030
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 case BINARY_SUBTRACT:
1032 w = POP();
1033 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001034 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001035 /* INLINE: int - int */
1036 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001037 a = PyInt_AS_LONG(v);
1038 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001039 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001040 if ((i^a) < 0 && (i^~b) < 0)
1041 goto slow_sub;
1042 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001043 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001044 else {
1045 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001046 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001047 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001048 Py_DECREF(v);
1049 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001051 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001053
Guido van Rossum374a9221991-04-04 10:40:29 +00001054 case BINARY_SUBSCR:
1055 w = POP();
1056 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001057 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001058 /* INLINE: list[int] */
1059 long i = PyInt_AsLong(w);
1060 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001061 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001062 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001063 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001064 PyErr_SetString(PyExc_IndexError,
1065 "list index out of range");
1066 x = NULL;
1067 }
1068 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001069 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001070 Py_INCREF(x);
1071 }
1072 }
1073 else
1074 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001075 Py_DECREF(v);
1076 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001078 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001079 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001080
Guido van Rossum7928cd71991-10-24 14:59:31 +00001081 case BINARY_LSHIFT:
1082 w = POP();
1083 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001084 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001085 Py_DECREF(v);
1086 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001087 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001088 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001089 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001090
Guido van Rossum7928cd71991-10-24 14:59:31 +00001091 case BINARY_RSHIFT:
1092 w = POP();
1093 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001094 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001095 Py_DECREF(v);
1096 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001097 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001098 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001099 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001100
Guido van Rossum7928cd71991-10-24 14:59:31 +00001101 case BINARY_AND:
1102 w = POP();
1103 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001104 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001105 Py_DECREF(v);
1106 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001107 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001108 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001109 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001110
Guido van Rossum7928cd71991-10-24 14:59:31 +00001111 case BINARY_XOR:
1112 w = POP();
1113 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001114 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001115 Py_DECREF(v);
1116 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001117 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001118 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001119 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001120
Guido van Rossum7928cd71991-10-24 14:59:31 +00001121 case BINARY_OR:
1122 w = POP();
1123 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001124 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001125 Py_DECREF(v);
1126 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001127 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001128 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001129 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001130
1131 case INPLACE_POWER:
1132 w = POP();
1133 v = POP();
1134 x = PyNumber_InPlacePower(v, w, Py_None);
1135 Py_DECREF(v);
1136 Py_DECREF(w);
1137 PUSH(x);
1138 if (x != NULL) continue;
1139 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001140
Thomas Wouters434d0822000-08-24 20:11:32 +00001141 case INPLACE_MULTIPLY:
1142 w = POP();
1143 v = POP();
1144 x = PyNumber_InPlaceMultiply(v, w);
1145 Py_DECREF(v);
1146 Py_DECREF(w);
1147 PUSH(x);
1148 if (x != NULL) continue;
1149 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001150
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001152 if (!_Py_QnewFlag) {
1153 w = POP();
1154 v = POP();
1155 x = PyNumber_InPlaceDivide(v, w);
1156 Py_DECREF(v);
1157 Py_DECREF(w);
1158 PUSH(x);
1159 if (x != NULL) continue;
1160 break;
1161 }
1162 /* -Qnew is in effect: fall through to
1163 INPLACE_TRUE_DIVIDE */
1164 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001165 w = POP();
1166 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001167 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 Py_DECREF(v);
1169 Py_DECREF(w);
1170 PUSH(x);
1171 if (x != NULL) continue;
1172 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001173
Guido van Rossum4668b002001-08-08 05:00:18 +00001174 case INPLACE_FLOOR_DIVIDE:
1175 w = POP();
1176 v = POP();
1177 x = PyNumber_InPlaceFloorDivide(v, w);
1178 Py_DECREF(v);
1179 Py_DECREF(w);
1180 PUSH(x);
1181 if (x != NULL) continue;
1182 break;
1183
Thomas Wouters434d0822000-08-24 20:11:32 +00001184 case INPLACE_MODULO:
1185 w = POP();
1186 v = POP();
1187 x = PyNumber_InPlaceRemainder(v, w);
1188 Py_DECREF(v);
1189 Py_DECREF(w);
1190 PUSH(x);
1191 if (x != NULL) continue;
1192 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001193
Thomas Wouters434d0822000-08-24 20:11:32 +00001194 case INPLACE_ADD:
1195 w = POP();
1196 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001197 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001198 /* INLINE: int + int */
1199 register long a, b, i;
1200 a = PyInt_AS_LONG(v);
1201 b = PyInt_AS_LONG(w);
1202 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001203 if ((i^a) < 0 && (i^b) < 0)
1204 goto slow_iadd;
1205 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001206 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001207 else {
1208 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001209 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001210 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001211 Py_DECREF(v);
1212 Py_DECREF(w);
1213 PUSH(x);
1214 if (x != NULL) continue;
1215 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001216
Thomas Wouters434d0822000-08-24 20:11:32 +00001217 case INPLACE_SUBTRACT:
1218 w = POP();
1219 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001220 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001221 /* INLINE: int - int */
1222 register long a, b, i;
1223 a = PyInt_AS_LONG(v);
1224 b = PyInt_AS_LONG(w);
1225 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001226 if ((i^a) < 0 && (i^~b) < 0)
1227 goto slow_isub;
1228 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001229 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001230 else {
1231 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001232 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001233 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001234 Py_DECREF(v);
1235 Py_DECREF(w);
1236 PUSH(x);
1237 if (x != NULL) continue;
1238 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001239
Thomas Wouters434d0822000-08-24 20:11:32 +00001240 case INPLACE_LSHIFT:
1241 w = POP();
1242 v = POP();
1243 x = PyNumber_InPlaceLshift(v, w);
1244 Py_DECREF(v);
1245 Py_DECREF(w);
1246 PUSH(x);
1247 if (x != NULL) continue;
1248 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001249
Thomas Wouters434d0822000-08-24 20:11:32 +00001250 case INPLACE_RSHIFT:
1251 w = POP();
1252 v = POP();
1253 x = PyNumber_InPlaceRshift(v, w);
1254 Py_DECREF(v);
1255 Py_DECREF(w);
1256 PUSH(x);
1257 if (x != NULL) continue;
1258 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001259
Thomas Wouters434d0822000-08-24 20:11:32 +00001260 case INPLACE_AND:
1261 w = POP();
1262 v = POP();
1263 x = PyNumber_InPlaceAnd(v, w);
1264 Py_DECREF(v);
1265 Py_DECREF(w);
1266 PUSH(x);
1267 if (x != NULL) continue;
1268 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001269
Thomas Wouters434d0822000-08-24 20:11:32 +00001270 case INPLACE_XOR:
1271 w = POP();
1272 v = POP();
1273 x = PyNumber_InPlaceXor(v, w);
1274 Py_DECREF(v);
1275 Py_DECREF(w);
1276 PUSH(x);
1277 if (x != NULL) continue;
1278 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001279
Thomas Wouters434d0822000-08-24 20:11:32 +00001280 case INPLACE_OR:
1281 w = POP();
1282 v = POP();
1283 x = PyNumber_InPlaceOr(v, w);
1284 Py_DECREF(v);
1285 Py_DECREF(w);
1286 PUSH(x);
1287 if (x != NULL) continue;
1288 break;
1289
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 case SLICE+0:
1291 case SLICE+1:
1292 case SLICE+2:
1293 case SLICE+3:
1294 if ((opcode-SLICE) & 2)
1295 w = POP();
1296 else
1297 w = NULL;
1298 if ((opcode-SLICE) & 1)
1299 v = POP();
1300 else
1301 v = NULL;
1302 u = POP();
1303 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 Py_DECREF(u);
1305 Py_XDECREF(v);
1306 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001308 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001310
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 case STORE_SLICE+0:
1312 case STORE_SLICE+1:
1313 case STORE_SLICE+2:
1314 case STORE_SLICE+3:
1315 if ((opcode-STORE_SLICE) & 2)
1316 w = POP();
1317 else
1318 w = NULL;
1319 if ((opcode-STORE_SLICE) & 1)
1320 v = POP();
1321 else
1322 v = NULL;
1323 u = POP();
1324 t = POP();
1325 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001326 Py_DECREF(t);
1327 Py_DECREF(u);
1328 Py_XDECREF(v);
1329 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001330 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001332
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 case DELETE_SLICE+0:
1334 case DELETE_SLICE+1:
1335 case DELETE_SLICE+2:
1336 case DELETE_SLICE+3:
1337 if ((opcode-DELETE_SLICE) & 2)
1338 w = POP();
1339 else
1340 w = NULL;
1341 if ((opcode-DELETE_SLICE) & 1)
1342 v = POP();
1343 else
1344 v = NULL;
1345 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001348 Py_DECREF(u);
1349 Py_XDECREF(v);
1350 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001351 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001353
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 case STORE_SUBSCR:
1355 w = POP();
1356 v = POP();
1357 u = POP();
1358 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001359 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 Py_DECREF(u);
1361 Py_DECREF(v);
1362 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001363 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001365
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 case DELETE_SUBSCR:
1367 w = POP();
1368 v = POP();
1369 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001370 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 Py_DECREF(v);
1372 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001373 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001375
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 case PRINT_EXPR:
1377 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001378 w = PySys_GetObject("displayhook");
1379 if (w == NULL) {
1380 PyErr_SetString(PyExc_RuntimeError,
1381 "lost sys.displayhook");
1382 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001383 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001384 }
1385 if (err == 0) {
1386 x = Py_BuildValue("(O)", v);
1387 if (x == NULL)
1388 err = -1;
1389 }
1390 if (err == 0) {
1391 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001392 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001393 if (w == NULL)
1394 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001397 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001399
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001400 case PRINT_ITEM_TO:
1401 w = stream = POP();
1402 /* fall through to PRINT_ITEM */
1403
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 case PRINT_ITEM:
1405 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001406 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001407 w = PySys_GetObject("stdout");
1408 if (w == NULL) {
1409 PyErr_SetString(PyExc_RuntimeError,
1410 "lost sys.stdout");
1411 err = -1;
1412 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001413 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001414 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001415 err = PyFile_WriteString(" ", w);
1416 if (err == 0)
1417 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001418 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001419 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001420 if (PyString_Check(v)) {
1421 char *s = PyString_AS_STRING(v);
1422 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001423 if (len == 0 ||
1424 !isspace(Py_CHARMASK(s[len-1])) ||
1425 s[len-1] == ' ')
1426 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001427 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001428#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001429 else if (PyUnicode_Check(v)) {
1430 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1431 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001432 if (len == 0 ||
1433 !Py_UNICODE_ISSPACE(s[len-1]) ||
1434 s[len-1] == ' ')
1435 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001436 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001437#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001438 else
1439 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001441 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001442 Py_XDECREF(stream);
1443 stream = NULL;
1444 if (err == 0)
1445 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001447
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001448 case PRINT_NEWLINE_TO:
1449 w = stream = POP();
1450 /* fall through to PRINT_NEWLINE */
1451
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001453 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001454 w = PySys_GetObject("stdout");
1455 if (w == NULL)
1456 PyErr_SetString(PyExc_RuntimeError,
1457 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001458 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001459 if (w != NULL) {
1460 err = PyFile_WriteString("\n", w);
1461 if (err == 0)
1462 PyFile_SoftSpace(w, 0);
1463 }
1464 Py_XDECREF(stream);
1465 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001467
Thomas Wouters434d0822000-08-24 20:11:32 +00001468
1469#ifdef CASE_TOO_BIG
1470 default: switch (opcode) {
1471#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 case BREAK_LOOP:
1473 why = WHY_BREAK;
1474 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001475
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001476 case CONTINUE_LOOP:
1477 retval = PyInt_FromLong(oparg);
1478 why = WHY_CONTINUE;
1479 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480
Guido van Rossumf10570b1995-07-07 22:53:21 +00001481 case RAISE_VARARGS:
1482 u = v = w = NULL;
1483 switch (oparg) {
1484 case 3:
1485 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001486 /* Fallthrough */
1487 case 2:
1488 v = POP(); /* value */
1489 /* Fallthrough */
1490 case 1:
1491 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001492 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001493 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001494 break;
1495 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001497 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001498 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001499 break;
1500 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001502
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001505 PyErr_SetString(PyExc_SystemError,
1506 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001507 break;
1508 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001510 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001512
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 case RETURN_VALUE:
1514 retval = POP();
1515 why = WHY_RETURN;
1516 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001517
Tim Peters5ca576e2001-06-18 22:08:13 +00001518 case YIELD_VALUE:
1519 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001520 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001521 why = WHY_YIELD;
1522 break;
1523
1524
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001525 case EXEC_STMT:
1526 w = POP();
1527 v = POP();
1528 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001529 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 Py_DECREF(u);
1531 Py_DECREF(v);
1532 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001533 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001534
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 case POP_BLOCK:
1536 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 while (STACK_LEVEL() > b->b_level) {
1539 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001540 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 }
1542 }
1543 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001544
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 case END_FINALLY:
1546 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 if (PyInt_Check(v)) {
1548 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001549 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001550 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001551 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 retval = POP();
1553 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001559 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001561 else if (v != Py_None) {
1562 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 "'finally' pops bad exception");
1564 why = WHY_EXCEPTION;
1565 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001566 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001568
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001570 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001572 w = POP();
1573 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001575 Py_DECREF(u);
1576 Py_DECREF(v);
1577 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001579
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001581 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001583 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001584 PyErr_Format(PyExc_SystemError,
1585 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001586 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001587 break;
1588 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 err = PyDict_SetItem(x, w, v);
1590 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001592
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001594 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001595 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001596 PyErr_Format(PyExc_SystemError,
1597 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001598 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001599 break;
1600 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001601 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001602 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001603 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001605
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001606 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001608 if (PyTuple_Check(v)) {
1609 if (PyTuple_Size(v) != oparg) {
1610 PyErr_SetString(PyExc_ValueError,
1611 "unpack tuple of wrong size");
1612 why = WHY_EXCEPTION;
1613 }
1614 else {
1615 for (; --oparg >= 0; ) {
1616 w = PyTuple_GET_ITEM(v, oparg);
1617 Py_INCREF(w);
1618 PUSH(w);
1619 }
1620 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001622 else if (PyList_Check(v)) {
1623 if (PyList_Size(v) != oparg) {
1624 PyErr_SetString(PyExc_ValueError,
1625 "unpack list of wrong size");
1626 why = WHY_EXCEPTION;
1627 }
1628 else {
1629 for (; --oparg >= 0; ) {
1630 w = PyList_GET_ITEM(v, oparg);
1631 Py_INCREF(w);
1632 PUSH(w);
1633 }
1634 }
1635 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001636 else if (unpack_iterable(v, oparg,
1637 stack_pointer + oparg))
1638 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001639 else {
1640 if (PyErr_ExceptionMatches(PyExc_TypeError))
1641 PyErr_SetString(PyExc_TypeError,
1642 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001643 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001644 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001647
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001649 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 v = POP();
1651 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001652 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1653 Py_DECREF(v);
1654 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001656
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001658 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001660 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1661 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001663 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001664
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001665 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001666 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001667 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 err = PyDict_SetItem(f->f_globals, w, v);
1669 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001670 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001671
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001672 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001673 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001675 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001676 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001677 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001678
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001680 w = GETITEM(names, oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001681 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001682 PyErr_Format(PyExc_SystemError,
1683 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001684 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001685 break;
1686 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001687 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001693 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001694 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001695 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 break;
1697 }
1698 }
1699 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 PUSH(x);
1702 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001703
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001705 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001706 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001707 /* Inline the PyDict_GetItem() calls.
1708 WARNING: this is an extreme speed hack.
1709 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001710 long hash = ((PyStringObject *)w)->ob_shash;
1711 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001712 PyDictObject *d;
1713 d = (PyDictObject *)(f->f_globals);
1714 x = d->ma_lookup(d, w, hash)->me_value;
1715 if (x != NULL) {
1716 Py_INCREF(x);
1717 PUSH(x);
1718 continue;
1719 }
1720 d = (PyDictObject *)(f->f_builtins);
1721 x = d->ma_lookup(d, w, hash)->me_value;
1722 if (x != NULL) {
1723 Py_INCREF(x);
1724 PUSH(x);
1725 continue;
1726 }
1727 goto load_global_error;
1728 }
1729 }
1730 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001735 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001736 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001737 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001738 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 break;
1740 }
1741 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 PUSH(x);
1744 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001745
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001746 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001747 x = GETLOCAL(oparg);
1748 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001749 format_exc_check_arg(
1750 PyExc_UnboundLocalError,
1751 UNBOUNDLOCAL_ERROR_MSG,
1752 PyTuple_GetItem(co->co_varnames, oparg)
1753 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001754 break;
1755 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001756 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001757 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001758
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001759 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001760 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001761 Py_INCREF(x);
1762 PUSH(x);
1763 break;
1764
1765 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001766 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001767 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001768 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001769 err = -1;
1770 /* Don't stomp existing exception */
1771 if (PyErr_Occurred())
1772 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001773 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001774 v = PyTuple_GetItem(co->co_cellvars,
1775 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001776 format_exc_check_arg(
1777 PyExc_UnboundLocalError,
1778 UNBOUNDLOCAL_ERROR_MSG,
1779 v);
1780 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001781 v = PyTuple_GetItem(
1782 co->co_freevars,
1783 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001784 format_exc_check_arg(
1785 PyExc_NameError,
1786 UNBOUNDFREE_ERROR_MSG,
1787 v);
1788 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001789 break;
1790 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001791 PUSH(w);
1792 break;
1793
1794 case STORE_DEREF:
1795 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001796 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001797 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001798 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001799 continue;
1800
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 if (x != NULL) {
1804 for (; --oparg >= 0;) {
1805 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001806 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 }
1808 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001809 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 }
1811 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001812
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001814 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 if (x != NULL) {
1816 for (; --oparg >= 0;) {
1817 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001818 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 }
1820 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001821 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 }
1823 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001824
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001828 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001830
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001832 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 x = PyObject_GetAttr(v, w);
1835 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001836 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001837 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001839
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 case COMPARE_OP:
1841 w = POP();
1842 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001843 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001844 /* INLINE: cmp(int, int) */
1845 register long a, b;
1846 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001847 a = PyInt_AS_LONG(v);
1848 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001849 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001850 case PyCmp_LT: res = a < b; break;
1851 case PyCmp_LE: res = a <= b; break;
1852 case PyCmp_EQ: res = a == b; break;
1853 case PyCmp_NE: res = a != b; break;
1854 case PyCmp_GT: res = a > b; break;
1855 case PyCmp_GE: res = a >= b; break;
1856 case PyCmp_IS: res = v == w; break;
1857 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001858 default: goto slow_compare;
1859 }
1860 x = res ? Py_True : Py_False;
1861 Py_INCREF(x);
1862 }
1863 else {
1864 slow_compare:
1865 x = cmp_outcome(oparg, v, w);
1866 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001867 Py_DECREF(v);
1868 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001870 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001872
Guido van Rossum374a9221991-04-04 10:40:29 +00001873 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001874 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001875 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001876 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001877 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001878 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001879 break;
1880 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001881 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001882 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001883 w,
1884 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001885 f->f_locals == NULL ?
1886 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001887 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001888 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889 if (w == NULL) {
1890 x = NULL;
1891 break;
1892 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001893 x = PyEval_CallObject(x, w);
1894 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001895 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001896 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001897 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001898
Thomas Wouters52152252000-08-17 22:55:00 +00001899 case IMPORT_STAR:
1900 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001901 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001902 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001903 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001904 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001905 break;
1906 }
Thomas Wouters52152252000-08-17 22:55:00 +00001907 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001908 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001909 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001910 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001911 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001912
Thomas Wouters52152252000-08-17 22:55:00 +00001913 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001914 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001915 v = TOP();
1916 x = import_from(v, w);
1917 PUSH(x);
1918 if (x != NULL) continue;
1919 break;
1920
Guido van Rossum374a9221991-04-04 10:40:29 +00001921 case JUMP_FORWARD:
1922 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001923 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001924
Guido van Rossum374a9221991-04-04 10:40:29 +00001925 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001926 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001927 if (err > 0)
1928 err = 0;
1929 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001930 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001931 else
1932 break;
1933 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001934
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001936 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001937 if (err > 0) {
1938 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001939 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001940 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001941 else if (err == 0)
1942 ;
1943 else
1944 break;
1945 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001946
Guido van Rossum374a9221991-04-04 10:40:29 +00001947 case JUMP_ABSOLUTE:
1948 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001949 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001950
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001951 case GET_ITER:
1952 /* before: [obj]; after [getiter(obj)] */
1953 v = POP();
1954 x = PyObject_GetIter(v);
1955 Py_DECREF(v);
1956 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001957 PUSH(x);
1958 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001959 }
1960 break;
1961
1962 case FOR_ITER:
1963 /* before: [iter]; after: [iter, iter()] *or* [] */
1964 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001965 x = PyIter_Next(v);
1966 if (x != NULL) {
1967 PUSH(x);
1968 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001969 }
Tim Petersf4848da2001-05-05 00:14:56 +00001970 if (!PyErr_Occurred()) {
1971 /* iterator ended normally */
1972 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001973 Py_DECREF(v);
1974 JUMPBY(oparg);
1975 continue;
1976 }
1977 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001978
Guido van Rossum374a9221991-04-04 10:40:29 +00001979 case SETUP_LOOP:
1980 case SETUP_EXCEPT:
1981 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001982 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001983 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001984 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001985
Guido van Rossumf10570b1995-07-07 22:53:21 +00001986 case CALL_FUNCTION:
Jeremy Hyltone8c04322002-08-16 17:47:26 +00001987 x = call_function(&stack_pointer, oparg);
1988 PUSH(x);
1989 if (x != NULL)
1990 continue;
1991 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001992
Jeremy Hylton76901512000-03-28 23:49:17 +00001993 case CALL_FUNCTION_VAR:
1994 case CALL_FUNCTION_KW:
1995 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001996 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001997 int na = oparg & 0xff;
1998 int nk = (oparg>>8) & 0xff;
1999 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002000 int n = na + 2 * nk;
2001 PyObject **pfunc, *func;
2002 if (flags & CALL_FLAG_VAR)
2003 n++;
2004 if (flags & CALL_FLAG_KW)
2005 n++;
2006 pfunc = stack_pointer - n - 1;
2007 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002008
Guido van Rossumac7be682001-01-17 15:42:30 +00002009 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002010 && PyMethod_GET_SELF(func) != NULL) {
2011 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002012 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002013 func = PyMethod_GET_FUNCTION(func);
2014 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002015 Py_DECREF(*pfunc);
2016 *pfunc = self;
2017 na++;
2018 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002019 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002020 Py_INCREF(func);
2021 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002022 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002023
Jeremy Hylton76901512000-03-28 23:49:17 +00002024 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002025 w = POP();
2026 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002027 }
2028 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002029 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002030 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002031 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002032 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002033
Guido van Rossum681d79a1995-07-18 14:51:37 +00002034 case MAKE_FUNCTION:
2035 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 x = PyFunction_New(v, f->f_globals);
2037 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002038 /* XXX Maybe this should be a separate opcode? */
2039 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002041 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002042 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002043 x = NULL;
2044 break;
2045 }
2046 while (--oparg >= 0) {
2047 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002048 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002049 }
2050 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002051 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002052 }
2053 PUSH(x);
2054 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002055
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002056 case MAKE_CLOSURE:
2057 {
2058 int nfree;
2059 v = POP(); /* code object */
2060 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002061 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002062 Py_DECREF(v);
2063 /* XXX Maybe this should be a separate opcode? */
2064 if (x != NULL && nfree > 0) {
2065 v = PyTuple_New(nfree);
2066 if (v == NULL) {
2067 Py_DECREF(x);
2068 x = NULL;
2069 break;
2070 }
2071 while (--nfree >= 0) {
2072 w = POP();
2073 PyTuple_SET_ITEM(v, nfree, w);
2074 }
2075 err = PyFunction_SetClosure(x, v);
2076 Py_DECREF(v);
2077 }
2078 if (x != NULL && oparg > 0) {
2079 v = PyTuple_New(oparg);
2080 if (v == NULL) {
2081 Py_DECREF(x);
2082 x = NULL;
2083 break;
2084 }
2085 while (--oparg >= 0) {
2086 w = POP();
2087 PyTuple_SET_ITEM(v, oparg, w);
2088 }
2089 err = PyFunction_SetDefaults(x, v);
2090 Py_DECREF(v);
2091 }
2092 PUSH(x);
2093 break;
2094 }
2095
Guido van Rossum8861b741996-07-30 16:49:37 +00002096 case BUILD_SLICE:
2097 if (oparg == 3)
2098 w = POP();
2099 else
2100 w = NULL;
2101 v = POP();
2102 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002103 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 Py_DECREF(u);
2105 Py_DECREF(v);
2106 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002107 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002108 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002109 break;
2110
Fred Drakeef8ace32000-08-24 00:32:09 +00002111 case EXTENDED_ARG:
2112 opcode = NEXTOP();
2113 oparg = oparg<<16 | NEXTARG();
2114 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002115
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 default:
2117 fprintf(stderr,
2118 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002119 PyCode_Addr2Line(f->f_code, f->f_lasti),
2120 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002121 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 why = WHY_EXCEPTION;
2123 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002124
2125#ifdef CASE_TOO_BIG
2126 }
2127#endif
2128
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 } /* switch */
2130
2131 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002132
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002134
Guido van Rossum374a9221991-04-04 10:40:29 +00002135 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002136 if (err == 0 && x != NULL) {
2137#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002138 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002140 fprintf(stderr,
2141 "XXX undetected error\n");
2142 else
2143#endif
2144 continue; /* Normal, fast path */
2145 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002148 err = 0;
2149 }
2150
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002152
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002155 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002156 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 why = WHY_EXCEPTION;
2158 }
2159 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002160#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002162 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002164 fprintf(stderr,
2165 "XXX undetected error (why=%d)\n",
2166 why);
2167 why = WHY_EXCEPTION;
2168 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 }
2170#endif
2171
2172 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002173
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002175 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002176
Fred Drake8f51f542001-10-04 14:48:42 +00002177 if (tstate->c_tracefunc != NULL)
2178 call_exc_trace(tstate->c_tracefunc,
2179 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002180 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002181
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002183
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 if (why == WHY_RERAISE)
2185 why = WHY_EXCEPTION;
2186
2187 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002188
Tim Peters5ca576e2001-06-18 22:08:13 +00002189 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002191
2192 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2193 /* For a continue inside a try block,
2194 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002195 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2196 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002197 why = WHY_NOT;
2198 JUMPTO(PyInt_AS_LONG(retval));
2199 Py_DECREF(retval);
2200 break;
2201 }
2202
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 while (STACK_LEVEL() > b->b_level) {
2204 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002205 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 }
2207 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2208 why = WHY_NOT;
2209 JUMPTO(b->b_handler);
2210 break;
2211 }
2212 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002213 (b->b_type == SETUP_EXCEPT &&
2214 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002215 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 PyObject *exc, *val, *tb;
2217 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002218 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 val = Py_None;
2220 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002221 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002222 /* Make the raw exception data
2223 available to the handler,
2224 so a program can emulate the
2225 Python main loop. Don't do
2226 this for 'finally'. */
2227 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002228 PyErr_NormalizeException(
2229 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002230 set_exc_info(tstate,
2231 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002233 if (tb == NULL) {
2234 Py_INCREF(Py_None);
2235 PUSH(Py_None);
2236 } else
2237 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 PUSH(val);
2239 PUSH(exc);
2240 }
2241 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002242 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002243 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002244 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002245 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 PUSH(v);
2247 }
2248 why = WHY_NOT;
2249 JUMPTO(b->b_handler);
2250 break;
2251 }
2252 } /* unwind stack */
2253
2254 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002255
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 if (why != WHY_NOT)
2257 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002258
Guido van Rossum374a9221991-04-04 10:40:29 +00002259 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002260
Guido van Rossum35974fb2001-12-06 21:28:18 +00002261 if (why != WHY_YIELD) {
2262 /* Pop remaining stack entries -- but when yielding */
2263 while (!EMPTY()) {
2264 v = POP();
2265 Py_XDECREF(v);
2266 }
2267 }
2268
Tim Peters5ca576e2001-06-18 22:08:13 +00002269 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002270 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002271
Fred Drake9e3ad782001-07-03 23:39:52 +00002272 if (tstate->use_tracing) {
2273 if (tstate->c_tracefunc
2274 && (why == WHY_RETURN || why == WHY_YIELD)) {
2275 if (call_trace(tstate->c_tracefunc,
2276 tstate->c_traceobj, f,
2277 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002278 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002279 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002280 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002281 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002282 }
Fred Drake8f51f542001-10-04 14:48:42 +00002283 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002284 if (why == WHY_EXCEPTION)
2285 call_trace_protected(tstate->c_profilefunc,
2286 tstate->c_profileobj, f,
2287 PyTrace_RETURN);
2288 else if (call_trace(tstate->c_profilefunc,
2289 tstate->c_profileobj, f,
2290 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002291 Py_XDECREF(retval);
2292 retval = NULL;
2293 why = WHY_EXCEPTION;
2294 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002295 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002296 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002297
Guido van Rossuma027efa1997-05-05 20:56:21 +00002298 reset_exc_info(tstate);
2299
Tim Peters5ca576e2001-06-18 22:08:13 +00002300 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002301 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002302 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002303
Guido van Rossum96a42c81992-01-12 02:29:51 +00002304 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002305}
2306
Tim Peters6d6c1a32001-08-02 04:15:00 +00002307PyObject *
2308PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002309 PyObject **args, int argcount, PyObject **kws, int kwcount,
2310 PyObject **defs, int defcount, PyObject *closure)
2311{
2312 register PyFrameObject *f;
2313 register PyObject *retval = NULL;
2314 register PyObject **fastlocals, **freevars;
2315 PyThreadState *tstate = PyThreadState_GET();
2316 PyObject *x, *u;
2317
2318 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002319 PyErr_SetString(PyExc_SystemError,
2320 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002321 return NULL;
2322 }
2323
2324 f = PyFrame_New(tstate, /*back*/
2325 co, /*code*/
2326 globals, locals);
2327 if (f == NULL)
2328 return NULL;
2329
2330 fastlocals = f->f_localsplus;
2331 freevars = f->f_localsplus + f->f_nlocals;
2332
2333 if (co->co_argcount > 0 ||
2334 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2335 int i;
2336 int n = argcount;
2337 PyObject *kwdict = NULL;
2338 if (co->co_flags & CO_VARKEYWORDS) {
2339 kwdict = PyDict_New();
2340 if (kwdict == NULL)
2341 goto fail;
2342 i = co->co_argcount;
2343 if (co->co_flags & CO_VARARGS)
2344 i++;
2345 SETLOCAL(i, kwdict);
2346 }
2347 if (argcount > co->co_argcount) {
2348 if (!(co->co_flags & CO_VARARGS)) {
2349 PyErr_Format(PyExc_TypeError,
2350 "%.200s() takes %s %d "
2351 "%sargument%s (%d given)",
2352 PyString_AsString(co->co_name),
2353 defcount ? "at most" : "exactly",
2354 co->co_argcount,
2355 kwcount ? "non-keyword " : "",
2356 co->co_argcount == 1 ? "" : "s",
2357 argcount);
2358 goto fail;
2359 }
2360 n = co->co_argcount;
2361 }
2362 for (i = 0; i < n; i++) {
2363 x = args[i];
2364 Py_INCREF(x);
2365 SETLOCAL(i, x);
2366 }
2367 if (co->co_flags & CO_VARARGS) {
2368 u = PyTuple_New(argcount - n);
2369 if (u == NULL)
2370 goto fail;
2371 SETLOCAL(co->co_argcount, u);
2372 for (i = n; i < argcount; i++) {
2373 x = args[i];
2374 Py_INCREF(x);
2375 PyTuple_SET_ITEM(u, i-n, x);
2376 }
2377 }
2378 for (i = 0; i < kwcount; i++) {
2379 PyObject *keyword = kws[2*i];
2380 PyObject *value = kws[2*i + 1];
2381 int j;
2382 if (keyword == NULL || !PyString_Check(keyword)) {
2383 PyErr_Format(PyExc_TypeError,
2384 "%.200s() keywords must be strings",
2385 PyString_AsString(co->co_name));
2386 goto fail;
2387 }
2388 /* XXX slow -- speed up using dictionary? */
2389 for (j = 0; j < co->co_argcount; j++) {
2390 PyObject *nm = PyTuple_GET_ITEM(
2391 co->co_varnames, j);
2392 int cmp = PyObject_RichCompareBool(
2393 keyword, nm, Py_EQ);
2394 if (cmp > 0)
2395 break;
2396 else if (cmp < 0)
2397 goto fail;
2398 }
2399 /* Check errors from Compare */
2400 if (PyErr_Occurred())
2401 goto fail;
2402 if (j >= co->co_argcount) {
2403 if (kwdict == NULL) {
2404 PyErr_Format(PyExc_TypeError,
2405 "%.200s() got an unexpected "
2406 "keyword argument '%.400s'",
2407 PyString_AsString(co->co_name),
2408 PyString_AsString(keyword));
2409 goto fail;
2410 }
2411 PyDict_SetItem(kwdict, keyword, value);
2412 }
2413 else {
2414 if (GETLOCAL(j) != NULL) {
2415 PyErr_Format(PyExc_TypeError,
2416 "%.200s() got multiple "
2417 "values for keyword "
2418 "argument '%.400s'",
2419 PyString_AsString(co->co_name),
2420 PyString_AsString(keyword));
2421 goto fail;
2422 }
2423 Py_INCREF(value);
2424 SETLOCAL(j, value);
2425 }
2426 }
2427 if (argcount < co->co_argcount) {
2428 int m = co->co_argcount - defcount;
2429 for (i = argcount; i < m; i++) {
2430 if (GETLOCAL(i) == NULL) {
2431 PyErr_Format(PyExc_TypeError,
2432 "%.200s() takes %s %d "
2433 "%sargument%s (%d given)",
2434 PyString_AsString(co->co_name),
2435 ((co->co_flags & CO_VARARGS) ||
2436 defcount) ? "at least"
2437 : "exactly",
2438 m, kwcount ? "non-keyword " : "",
2439 m == 1 ? "" : "s", i);
2440 goto fail;
2441 }
2442 }
2443 if (n > m)
2444 i = n - m;
2445 else
2446 i = 0;
2447 for (; i < defcount; i++) {
2448 if (GETLOCAL(m+i) == NULL) {
2449 PyObject *def = defs[i];
2450 Py_INCREF(def);
2451 SETLOCAL(m+i, def);
2452 }
2453 }
2454 }
2455 }
2456 else {
2457 if (argcount > 0 || kwcount > 0) {
2458 PyErr_Format(PyExc_TypeError,
2459 "%.200s() takes no arguments (%d given)",
2460 PyString_AsString(co->co_name),
2461 argcount + kwcount);
2462 goto fail;
2463 }
2464 }
2465 /* Allocate and initialize storage for cell vars, and copy free
2466 vars into frame. This isn't too efficient right now. */
2467 if (f->f_ncells) {
2468 int i = 0, j = 0, nargs, found;
2469 char *cellname, *argname;
2470 PyObject *c;
2471
2472 nargs = co->co_argcount;
2473 if (co->co_flags & CO_VARARGS)
2474 nargs++;
2475 if (co->co_flags & CO_VARKEYWORDS)
2476 nargs++;
2477
2478 /* Check for cells that shadow args */
2479 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2480 cellname = PyString_AS_STRING(
2481 PyTuple_GET_ITEM(co->co_cellvars, i));
2482 found = 0;
2483 while (j < nargs) {
2484 argname = PyString_AS_STRING(
2485 PyTuple_GET_ITEM(co->co_varnames, j));
2486 if (strcmp(cellname, argname) == 0) {
2487 c = PyCell_New(GETLOCAL(j));
2488 if (c == NULL)
2489 goto fail;
2490 GETLOCAL(f->f_nlocals + i) = c;
2491 found = 1;
2492 break;
2493 }
2494 j++;
2495 }
2496 if (found == 0) {
2497 c = PyCell_New(NULL);
2498 if (c == NULL)
2499 goto fail;
2500 SETLOCAL(f->f_nlocals + i, c);
2501 }
2502 }
2503 /* Initialize any that are left */
2504 while (i < f->f_ncells) {
2505 c = PyCell_New(NULL);
2506 if (c == NULL)
2507 goto fail;
2508 SETLOCAL(f->f_nlocals + i, c);
2509 i++;
2510 }
2511 }
2512 if (f->f_nfreevars) {
2513 int i;
2514 for (i = 0; i < f->f_nfreevars; ++i) {
2515 PyObject *o = PyTuple_GET_ITEM(closure, i);
2516 Py_INCREF(o);
2517 freevars[f->f_ncells + i] = o;
2518 }
2519 }
2520
Tim Peters5ca576e2001-06-18 22:08:13 +00002521 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002522 /* Don't need to keep the reference to f_back, it will be set
2523 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002524 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002525 f->f_back = NULL;
2526
2527 /* Create a new generator that owns the ready to run frame
2528 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002529 return gen_new(f);
2530 }
2531
2532 retval = eval_frame(f);
2533
2534 fail: /* Jump here from prelude on failure */
2535
Tim Petersb13680b2001-11-27 23:29:29 +00002536 /* decref'ing the frame can cause __del__ methods to get invoked,
2537 which can call back into Python. While we're done with the
2538 current Python frame (f), the associated C stack is still in use,
2539 so recursion_depth must be boosted for the duration.
2540 */
2541 assert(tstate != NULL);
2542 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002543 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002544 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002545 return retval;
2546}
2547
2548
Guido van Rossuma027efa1997-05-05 20:56:21 +00002549static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002550set_exc_info(PyThreadState *tstate,
2551 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002552{
2553 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002554 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002555
Guido van Rossuma027efa1997-05-05 20:56:21 +00002556 frame = tstate->frame;
2557 if (frame->f_exc_type == NULL) {
2558 /* This frame didn't catch an exception before */
2559 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 if (tstate->exc_type == NULL) {
2561 Py_INCREF(Py_None);
2562 tstate->exc_type = Py_None;
2563 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002564 tmp_type = frame->f_exc_type;
2565 tmp_value = frame->f_exc_value;
2566 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002567 Py_XINCREF(tstate->exc_type);
2568 Py_XINCREF(tstate->exc_value);
2569 Py_XINCREF(tstate->exc_traceback);
2570 frame->f_exc_type = tstate->exc_type;
2571 frame->f_exc_value = tstate->exc_value;
2572 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002573 Py_XDECREF(tmp_type);
2574 Py_XDECREF(tmp_value);
2575 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002576 }
2577 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002578 tmp_type = tstate->exc_type;
2579 tmp_value = tstate->exc_value;
2580 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002581 Py_XINCREF(type);
2582 Py_XINCREF(value);
2583 Py_XINCREF(tb);
2584 tstate->exc_type = type;
2585 tstate->exc_value = value;
2586 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002587 Py_XDECREF(tmp_type);
2588 Py_XDECREF(tmp_value);
2589 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002590 /* For b/w compatibility */
2591 PySys_SetObject("exc_type", type);
2592 PySys_SetObject("exc_value", value);
2593 PySys_SetObject("exc_traceback", tb);
2594}
2595
2596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002597reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002598{
2599 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002600 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002601 frame = tstate->frame;
2602 if (frame->f_exc_type != NULL) {
2603 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002604 tmp_type = tstate->exc_type;
2605 tmp_value = tstate->exc_value;
2606 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607 Py_XINCREF(frame->f_exc_type);
2608 Py_XINCREF(frame->f_exc_value);
2609 Py_XINCREF(frame->f_exc_traceback);
2610 tstate->exc_type = frame->f_exc_type;
2611 tstate->exc_value = frame->f_exc_value;
2612 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002613 Py_XDECREF(tmp_type);
2614 Py_XDECREF(tmp_value);
2615 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002616 /* For b/w compatibility */
2617 PySys_SetObject("exc_type", frame->f_exc_type);
2618 PySys_SetObject("exc_value", frame->f_exc_value);
2619 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2620 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002621 tmp_type = frame->f_exc_type;
2622 tmp_value = frame->f_exc_value;
2623 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002624 frame->f_exc_type = NULL;
2625 frame->f_exc_value = NULL;
2626 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002627 Py_XDECREF(tmp_type);
2628 Py_XDECREF(tmp_value);
2629 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002630}
2631
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002632/* Logic for the raise statement (too complicated for inlining).
2633 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002634static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002635do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002636{
Guido van Rossumd295f121998-04-09 21:39:57 +00002637 if (type == NULL) {
2638 /* Reraise */
2639 PyThreadState *tstate = PyThreadState_Get();
2640 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2641 value = tstate->exc_value;
2642 tb = tstate->exc_traceback;
2643 Py_XINCREF(type);
2644 Py_XINCREF(value);
2645 Py_XINCREF(tb);
2646 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002647
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002648 /* We support the following forms of raise:
2649 raise <class>, <classinstance>
2650 raise <class>, <argument tuple>
2651 raise <class>, None
2652 raise <class>, <argument>
2653 raise <classinstance>, None
2654 raise <string>, <object>
2655 raise <string>, None
2656
2657 An omitted second argument is the same as None.
2658
2659 In addition, raise <tuple>, <anything> is the same as
2660 raising the tuple's first item (and it better have one!);
2661 this rule is applied recursively.
2662
2663 Finally, an optional third argument can be supplied, which
2664 gives the traceback to be substituted (useful when
2665 re-raising an exception after examining it). */
2666
2667 /* First, check the traceback argument, replacing None with
2668 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002669 if (tb == Py_None) {
2670 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002671 tb = NULL;
2672 }
2673 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002674 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002675 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002676 goto raise_error;
2677 }
2678
2679 /* Next, replace a missing value with None */
2680 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 value = Py_None;
2682 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002683 }
2684
2685 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2687 PyObject *tmp = type;
2688 type = PyTuple_GET_ITEM(type, 0);
2689 Py_INCREF(type);
2690 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002691 }
2692
Tim Petersafb2c802002-04-18 18:06:20 +00002693 if (PyString_CheckExact(type))
2694 /* Raising builtin string is deprecated but still allowed --
2695 * do nothing. Raising an instance of a new-style str
2696 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002697 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002698
2699 else if (PyClass_Check(type))
2700 PyErr_NormalizeException(&type, &value, &tb);
2701
Guido van Rossumb209a111997-04-29 18:18:01 +00002702 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002703 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 if (value != Py_None) {
2705 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002706 "instance exception may not have a separate value");
2707 goto raise_error;
2708 }
2709 else {
2710 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002712 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002713 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2714 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002715 }
2716 }
2717 else {
2718 /* Not something you can raise. You get an exception
2719 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002720 PyErr_Format(PyExc_TypeError,
2721 "exceptions must be strings, classes, or "
2722 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002723 goto raise_error;
2724 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002725 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002726 if (tb == NULL)
2727 return WHY_EXCEPTION;
2728 else
2729 return WHY_RERAISE;
2730 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 Py_XDECREF(value);
2732 Py_XDECREF(type);
2733 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002734 return WHY_EXCEPTION;
2735}
2736
Tim Petersd6d010b2001-06-21 02:49:55 +00002737/* Iterate v argcnt times and store the results on the stack (via decreasing
2738 sp). Return 1 for success, 0 if error. */
2739
Barry Warsawe42b18f1997-08-25 22:13:04 +00002740static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002741unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002742{
Tim Petersd6d010b2001-06-21 02:49:55 +00002743 int i = 0;
2744 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002745 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002746
Tim Petersd6d010b2001-06-21 02:49:55 +00002747 assert(v != NULL);
2748
2749 it = PyObject_GetIter(v);
2750 if (it == NULL)
2751 goto Error;
2752
2753 for (; i < argcnt; i++) {
2754 w = PyIter_Next(it);
2755 if (w == NULL) {
2756 /* Iterator done, via error or exhaustion. */
2757 if (!PyErr_Occurred()) {
2758 PyErr_Format(PyExc_ValueError,
2759 "need more than %d value%s to unpack",
2760 i, i == 1 ? "" : "s");
2761 }
2762 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002763 }
2764 *--sp = w;
2765 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002766
2767 /* We better have exhausted the iterator now. */
2768 w = PyIter_Next(it);
2769 if (w == NULL) {
2770 if (PyErr_Occurred())
2771 goto Error;
2772 Py_DECREF(it);
2773 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002774 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002775 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002776 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002777 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002778Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002779 for (; i > 0; i--, sp++)
2780 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002781 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002782 return 0;
2783}
2784
2785
Guido van Rossum96a42c81992-01-12 02:29:51 +00002786#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002787static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002788prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002790 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 if (PyObject_Print(v, stdout, 0) != 0)
2792 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002794 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002796#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002798static void
Fred Drake5755ce62001-06-27 19:19:46 +00002799call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002800{
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002802 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002804 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002805 value = Py_None;
2806 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002807 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002809 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002810 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002811 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002812 }
Fred Drake5755ce62001-06-27 19:19:46 +00002813 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002815 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002817 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 Py_XDECREF(type);
2819 Py_XDECREF(value);
2820 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822}
2823
Fred Drake4ec5d562001-10-04 19:26:43 +00002824static void
2825call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2826 int what)
2827{
2828 PyObject *type, *value, *traceback;
2829 int err;
2830 PyErr_Fetch(&type, &value, &traceback);
2831 err = call_trace(func, obj, frame, what, NULL);
2832 if (err == 0)
2833 PyErr_Restore(type, value, traceback);
2834 else {
2835 Py_XDECREF(type);
2836 Py_XDECREF(value);
2837 Py_XDECREF(traceback);
2838 }
2839}
2840
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002841static int
Fred Drake5755ce62001-06-27 19:19:46 +00002842call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2843 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002844{
Fred Drake5755ce62001-06-27 19:19:46 +00002845 register PyThreadState *tstate = frame->f_tstate;
2846 int result;
2847 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002848 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002849 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002850 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002851 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002852 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2853 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002854 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002855 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002856}
2857
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002858static void
2859maybe_call_line_trace(int opcode, Py_tracefunc func, PyObject *obj,
2860 PyFrameObject *frame, int *instr_lb, int *instr_ub)
2861{
2862 /* The theory of SET_LINENO-less tracing.
2863
2864 In a nutshell, we use the co_lnotab field of the code object
2865 to tell when execution has moved onto a different line.
2866
2867 As mentioned above, the basic idea is so set things up so
2868 that
2869
2870 *instr_lb <= frame->f_lasti < *instr_ub
2871
2872 is true so long as execution does not change lines.
2873
2874 This is all fairly simple. Digging the information out of
2875 co_lnotab takes some work, but is conceptually clear.
2876
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002877 Somewhat harder to explain is why we don't *always* call the
2878 line trace function when the above test fails.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002879
2880 Consider this code:
2881
2882 1: def f(a):
2883 2: if a:
2884 3: print 1
2885 4: else:
2886 5: print 2
2887
2888 which compiles to this:
2889
2890 2 0 LOAD_FAST 0 (a)
2891 3 JUMP_IF_FALSE 9 (to 15)
2892 6 POP_TOP
2893
2894 3 7 LOAD_CONST 1 (1)
2895 10 PRINT_ITEM
2896 11 PRINT_NEWLINE
2897 12 JUMP_FORWARD 6 (to 21)
2898 >> 15 POP_TOP
2899
2900 5 16 LOAD_CONST 2 (2)
2901 19 PRINT_ITEM
2902 20 PRINT_NEWLINE
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002903 >> 21 LOAD_CONST 0 (None)
2904 24 RETURN_VALUE
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002905
2906 If a is false, execution will jump to instruction at offset
2907 15 and the co_lnotab will claim that execution has moved to
2908 line 3. This is at best misleading. In this case we could
2909 associate the POP_TOP with line 4, but that doesn't make
2910 sense in all cases (I think).
2911
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002912 What we do is only call the line trace function if the co_lnotab
2913 indicates we have jumped to the *start* of a line, i.e. if the
2914 current instruction offset matches the offset given for the
2915 start of a line by the co_lnotab.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002916
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002917 This also takes care of the situation where a is true.
2918 Execution will jump from instruction offset 12 to offset 21.
2919 Then the co_lnotab would imply that execution has moved to line
2920 5, which is again misleading.
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002921 */
2922
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002923 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002924 PyCodeObject* co = frame->f_code;
2925 int size, addr;
2926 unsigned char* p;
2927
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002928 size = PyString_GET_SIZE(co->co_lnotab) / 2;
2929 p = (unsigned char*)PyString_AS_STRING(co->co_lnotab);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002930
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002931 addr = 0;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002932
2933 /* possible optimization: if f->f_lasti == instr_ub
2934 (likely to be a common case) then we already know
2935 instr_lb -- if we stored the matching value of p
2936 somwhere we could skip the first while loop. */
2937
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002938 /* see comments in compile.c for the description of
2939 co_lnotab. A point to remember: increments to p
2940 should come in pairs -- although we don't care about
2941 the line increments here, treating them as byte
2942 increments gets confusing, to say the least. */
2943
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002944 while (size > 0) {
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002945 if (addr + *p > frame->f_lasti)
2946 break;
2947 addr += *p++;
2948 p++;
2949 --size;
2950 }
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00002951 if (addr == frame->f_lasti)
2952 call_trace(func, obj, frame,
2953 PyTrace_LINE, Py_None);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002954 *instr_lb = addr;
2955 if (size > 0) {
2956 while (--size >= 0) {
2957 addr += *p++;
2958 if (*p++)
2959 break;
2960 }
2961 *instr_ub = addr;
2962 }
2963 else {
2964 *instr_ub = INT_MAX;
2965 }
2966 }
2967}
2968
Fred Drake5755ce62001-06-27 19:19:46 +00002969void
2970PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002971{
Fred Drake5755ce62001-06-27 19:19:46 +00002972 PyThreadState *tstate = PyThreadState_Get();
2973 PyObject *temp = tstate->c_profileobj;
2974 Py_XINCREF(arg);
2975 tstate->c_profilefunc = NULL;
2976 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002977 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002978 Py_XDECREF(temp);
2979 tstate->c_profilefunc = func;
2980 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002981 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002982}
2983
2984void
2985PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2986{
2987 PyThreadState *tstate = PyThreadState_Get();
2988 PyObject *temp = tstate->c_traceobj;
2989 Py_XINCREF(arg);
2990 tstate->c_tracefunc = NULL;
2991 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002992 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002993 Py_XDECREF(temp);
2994 tstate->c_tracefunc = func;
2995 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002996 tstate->use_tracing = ((func != NULL)
2997 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002998}
2999
Guido van Rossumb209a111997-04-29 18:18:01 +00003000PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003001PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003002{
Guido van Rossum25ce5661997-08-02 03:10:38 +00003003 PyThreadState *tstate = PyThreadState_Get();
3004 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003005 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00003006 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003007 else
3008 return current_frame->f_builtins;
3009}
3010
Guido van Rossumb209a111997-04-29 18:18:01 +00003011PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003012PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003013{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003014 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00003015 if (current_frame == NULL)
3016 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003017 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003018 return current_frame->f_locals;
3019}
3020
Guido van Rossumb209a111997-04-29 18:18:01 +00003021PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003022PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003023{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003024 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003025 if (current_frame == NULL)
3026 return NULL;
3027 else
3028 return current_frame->f_globals;
3029}
3030
Guido van Rossumb209a111997-04-29 18:18:01 +00003031PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003032PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003033{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003034 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00003035 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00003036}
3037
Guido van Rossum6135a871995-01-09 17:53:26 +00003038int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003039PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003040{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003041 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00003042 return current_frame == NULL ? 0 : current_frame->f_restricted;
3043}
3044
Guido van Rossumbe270261997-05-22 22:26:18 +00003045int
Tim Peters5ba58662001-07-16 02:29:45 +00003046PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003047{
3048 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00003049 int result = 0;
3050
3051 if (current_frame != NULL) {
3052 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003053 const int compilerflags = codeflags & PyCF_MASK;
3054 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003055 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003056 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003057 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003058#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003059 if (codeflags & CO_GENERATOR_ALLOWED) {
3060 result = 1;
3061 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3062 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003063#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003064 }
3065 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003066}
3067
3068int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003069Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070{
Guido van Rossumb209a111997-04-29 18:18:01 +00003071 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003072 if (f == NULL)
3073 return 0;
3074 if (!PyFile_SoftSpace(f, 0))
3075 return 0;
3076 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077}
3078
Guido van Rossum3f5da241990-12-20 15:06:42 +00003079
Guido van Rossum681d79a1995-07-18 14:51:37 +00003080/* External interface to call any callable object.
3081 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003082
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003083#undef PyEval_CallObject
3084/* for backward compatibility: export this interface */
3085
Guido van Rossumb209a111997-04-29 18:18:01 +00003086PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003087PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003088{
Guido van Rossumb209a111997-04-29 18:18:01 +00003089 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003090}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003091#define PyEval_CallObject(func,arg) \
3092 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003093
Guido van Rossumb209a111997-04-29 18:18:01 +00003094PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003095PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003096{
Jeremy Hylton52820442001-01-03 23:52:36 +00003097 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003098
3099 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003100 arg = PyTuple_New(0);
3101 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003102 PyErr_SetString(PyExc_TypeError,
3103 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003104 return NULL;
3105 }
3106 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003107 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003108
Guido van Rossumb209a111997-04-29 18:18:01 +00003109 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003110 PyErr_SetString(PyExc_TypeError,
3111 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003112 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003113 return NULL;
3114 }
3115
Tim Peters6d6c1a32001-08-02 04:15:00 +00003116 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003117 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003118 return result;
3119}
3120
Tim Peters6d6c1a32001-08-02 04:15:00 +00003121char *
3122PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003123{
3124 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003125 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003126 else if (PyFunction_Check(func))
3127 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3128 else if (PyCFunction_Check(func))
3129 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3130 else if (PyClass_Check(func))
3131 return PyString_AsString(((PyClassObject*)func)->cl_name);
3132 else if (PyInstance_Check(func)) {
3133 return PyString_AsString(
3134 ((PyInstanceObject*)func)->in_class->cl_name);
3135 } else {
3136 return func->ob_type->tp_name;
3137 }
3138}
3139
Tim Peters6d6c1a32001-08-02 04:15:00 +00003140char *
3141PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003142{
3143 if (PyMethod_Check(func))
3144 return "()";
3145 else if (PyFunction_Check(func))
3146 return "()";
3147 else if (PyCFunction_Check(func))
3148 return "()";
3149 else if (PyClass_Check(func))
3150 return " constructor";
3151 else if (PyInstance_Check(func)) {
3152 return " instance";
3153 } else {
3154 return " object";
3155 }
3156}
3157
Jeremy Hylton52820442001-01-03 23:52:36 +00003158#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3159
Jeremy Hylton192690e2002-08-16 18:36:11 +00003160void
3161err_args(PyObject *func, int flags, int nargs)
3162{
3163 if (flags & METH_NOARGS)
3164 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003165 "%.200s() takes no arguments (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003166 ((PyCFunctionObject *)func)->m_ml->ml_name,
3167 nargs);
3168 else
3169 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003170 "%.200s() takes exactly one argument (%d given)",
Jeremy Hylton192690e2002-08-16 18:36:11 +00003171 ((PyCFunctionObject *)func)->m_ml->ml_name,
3172 nargs);
3173}
3174
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003175static PyObject *
3176call_function(PyObject ***pp_stack, int oparg)
3177{
3178 int na = oparg & 0xff;
3179 int nk = (oparg>>8) & 0xff;
3180 int n = na + 2 * nk;
3181 PyObject **pfunc = (*pp_stack) - n - 1;
3182 PyObject *func = *pfunc;
3183 PyObject *x, *w;
3184
3185 /* Always dispatch PyCFunction first, because
3186 these are presumed to be the most frequent
3187 callable object.
3188 */
3189 if (PyCFunction_Check(func) && nk == 0) {
3190 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003191 if (flags & (METH_NOARGS | METH_O)) {
3192 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3193 PyObject *self = PyCFunction_GET_SELF(func);
3194 if (flags & METH_NOARGS && na == 0)
3195 x = (*meth)(self, NULL);
3196 else if (flags & METH_O && na == 1) {
3197 PyObject *arg = EXT_POP(*pp_stack);
3198 x = (*meth)(self, arg);
3199 Py_DECREF(arg);
3200 }
3201 else {
3202 err_args(func, flags, na);
3203 x = NULL;
3204 }
3205 }
3206 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003207 PyObject *callargs;
3208 callargs = load_args(pp_stack, na);
3209 x = PyCFunction_Call(func, callargs, NULL);
3210 Py_XDECREF(callargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003211 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003212 } else {
3213 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3214 /* optimize access to bound methods */
3215 PyObject *self = PyMethod_GET_SELF(func);
3216 Py_INCREF(self);
3217 func = PyMethod_GET_FUNCTION(func);
3218 Py_INCREF(func);
3219 Py_DECREF(*pfunc);
3220 *pfunc = self;
3221 na++;
3222 n++;
3223 } else
3224 Py_INCREF(func);
3225 if (PyFunction_Check(func))
3226 x = fast_function(func, pp_stack, n, na, nk);
3227 else
3228 x = do_call(func, pp_stack, na, nk);
3229 Py_DECREF(func);
3230 }
3231
3232 while ((*pp_stack) > pfunc) {
3233 w = EXT_POP(*pp_stack);
3234 Py_DECREF(w);
3235 }
3236 return x;
3237}
3238
Jeremy Hylton192690e2002-08-16 18:36:11 +00003239/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003240 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton52820442001-01-03 23:52:36 +00003241*/
3242
3243static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003244fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003245{
3246 PyObject *co = PyFunction_GET_CODE(func);
3247 PyObject *globals = PyFunction_GET_GLOBALS(func);
3248 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003249 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003250 PyObject **d = NULL;
3251 int nd = 0;
3252
3253 if (argdefs != NULL) {
3254 d = &PyTuple_GET_ITEM(argdefs, 0);
3255 nd = ((PyTupleObject *)argdefs)->ob_size;
3256 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003257 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003258 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003259 (*pp_stack)-2*nk, nk, d, nd,
3260 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003261}
3262
3263static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003264update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3265 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003266{
3267 PyObject *kwdict = NULL;
3268 if (orig_kwdict == NULL)
3269 kwdict = PyDict_New();
3270 else {
3271 kwdict = PyDict_Copy(orig_kwdict);
3272 Py_DECREF(orig_kwdict);
3273 }
3274 if (kwdict == NULL)
3275 return NULL;
3276 while (--nk >= 0) {
3277 int err;
3278 PyObject *value = EXT_POP(*pp_stack);
3279 PyObject *key = EXT_POP(*pp_stack);
3280 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003281 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003282 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003283 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003284 PyEval_GetFuncName(func),
3285 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003286 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003287 Py_DECREF(key);
3288 Py_DECREF(value);
3289 Py_DECREF(kwdict);
3290 return NULL;
3291 }
3292 err = PyDict_SetItem(kwdict, key, value);
3293 Py_DECREF(key);
3294 Py_DECREF(value);
3295 if (err) {
3296 Py_DECREF(kwdict);
3297 return NULL;
3298 }
3299 }
3300 return kwdict;
3301}
3302
3303static PyObject *
3304update_star_args(int nstack, int nstar, PyObject *stararg,
3305 PyObject ***pp_stack)
3306{
3307 PyObject *callargs, *w;
3308
3309 callargs = PyTuple_New(nstack + nstar);
3310 if (callargs == NULL) {
3311 return NULL;
3312 }
3313 if (nstar) {
3314 int i;
3315 for (i = 0; i < nstar; i++) {
3316 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3317 Py_INCREF(a);
3318 PyTuple_SET_ITEM(callargs, nstack + i, a);
3319 }
3320 }
3321 while (--nstack >= 0) {
3322 w = EXT_POP(*pp_stack);
3323 PyTuple_SET_ITEM(callargs, nstack, w);
3324 }
3325 return callargs;
3326}
3327
3328static PyObject *
3329load_args(PyObject ***pp_stack, int na)
3330{
3331 PyObject *args = PyTuple_New(na);
3332 PyObject *w;
3333
3334 if (args == NULL)
3335 return NULL;
3336 while (--na >= 0) {
3337 w = EXT_POP(*pp_stack);
3338 PyTuple_SET_ITEM(args, na, w);
3339 }
3340 return args;
3341}
3342
3343static PyObject *
3344do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3345{
3346 PyObject *callargs = NULL;
3347 PyObject *kwdict = NULL;
3348 PyObject *result = NULL;
3349
3350 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003351 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003352 if (kwdict == NULL)
3353 goto call_fail;
3354 }
3355 callargs = load_args(pp_stack, na);
3356 if (callargs == NULL)
3357 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003358 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003359 call_fail:
3360 Py_XDECREF(callargs);
3361 Py_XDECREF(kwdict);
3362 return result;
3363}
3364
3365static PyObject *
3366ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3367{
3368 int nstar = 0;
3369 PyObject *callargs = NULL;
3370 PyObject *stararg = NULL;
3371 PyObject *kwdict = NULL;
3372 PyObject *result = NULL;
3373
3374 if (flags & CALL_FLAG_KW) {
3375 kwdict = EXT_POP(*pp_stack);
3376 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003377 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003378 "%s%s argument after ** "
3379 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003380 PyEval_GetFuncName(func),
3381 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003382 goto ext_call_fail;
3383 }
3384 }
3385 if (flags & CALL_FLAG_VAR) {
3386 stararg = EXT_POP(*pp_stack);
3387 if (!PyTuple_Check(stararg)) {
3388 PyObject *t = NULL;
3389 t = PySequence_Tuple(stararg);
3390 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003391 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3392 PyErr_Format(PyExc_TypeError,
3393 "%s%s argument after * "
3394 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003395 PyEval_GetFuncName(func),
3396 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003397 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003398 goto ext_call_fail;
3399 }
3400 Py_DECREF(stararg);
3401 stararg = t;
3402 }
3403 nstar = PyTuple_GET_SIZE(stararg);
3404 }
3405 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003406 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003407 if (kwdict == NULL)
3408 goto ext_call_fail;
3409 }
3410 callargs = update_star_args(na, nstar, stararg, pp_stack);
3411 if (callargs == NULL)
3412 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003413 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003414 ext_call_fail:
3415 Py_XDECREF(callargs);
3416 Py_XDECREF(kwdict);
3417 Py_XDECREF(stararg);
3418 return result;
3419}
3420
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003421#define SLICE_ERROR_MSG \
3422 "standard sequence type does not support step size other than one"
3423
Tim Peterscb479e72001-12-16 19:11:44 +00003424/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3425 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3426 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3427*/
Tim Petersb5196382001-12-16 19:44:20 +00003428/* Note: If v is NULL, return success without storing into *pi. This
3429 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3430 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003431*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003432int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003433_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003434{
Tim Petersb5196382001-12-16 19:44:20 +00003435 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003436 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003437 if (PyInt_Check(v)) {
3438 x = PyInt_AsLong(v);
3439 } else if (PyLong_Check(v)) {
3440 x = PyLong_AsLong(v);
3441 if (x==-1 && PyErr_Occurred()) {
3442 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003443 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003444
Guido van Rossumac7be682001-01-17 15:42:30 +00003445 if (!PyErr_ExceptionMatches(
3446 PyExc_OverflowError)) {
3447 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003448 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003449 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003450 }
3451
Guido van Rossumac7be682001-01-17 15:42:30 +00003452 /* Clear the OverflowError */
3453 PyErr_Clear();
3454
3455 /* It's an overflow error, so we need to
3456 check the sign of the long integer,
3457 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003458 the error. */
3459
3460 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003461 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003462 if (long_zero == NULL)
3463 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003464
3465 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003466 cmp = PyObject_RichCompareBool(v, long_zero,
3467 Py_GT);
3468 Py_DECREF(long_zero);
3469 if (cmp < 0)
3470 return 0;
3471 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003472 x = INT_MAX;
3473 else
3474 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003475 }
3476 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003477 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003478 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003479 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003480 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003481 /* Truncate -- very long indices are truncated anyway */
3482 if (x > INT_MAX)
3483 x = INT_MAX;
3484 else if (x < -INT_MAX)
3485 x = 0;
3486 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003487 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003488 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489}
3490
Guido van Rossum50d756e2001-08-18 17:43:36 +00003491#undef ISINT
3492#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3493
Guido van Rossumb209a111997-04-29 18:18:01 +00003494static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003495apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003497 PyTypeObject *tp = u->ob_type;
3498 PySequenceMethods *sq = tp->tp_as_sequence;
3499
3500 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3501 int ilow = 0, ihigh = INT_MAX;
3502 if (!_PyEval_SliceIndex(v, &ilow))
3503 return NULL;
3504 if (!_PyEval_SliceIndex(w, &ihigh))
3505 return NULL;
3506 return PySequence_GetSlice(u, ilow, ihigh);
3507 }
3508 else {
3509 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003510 if (slice != NULL) {
3511 PyObject *res = PyObject_GetItem(u, slice);
3512 Py_DECREF(slice);
3513 return res;
3514 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003515 else
3516 return NULL;
3517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003519
3520static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003521assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3522 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003524 PyTypeObject *tp = u->ob_type;
3525 PySequenceMethods *sq = tp->tp_as_sequence;
3526
3527 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3528 int ilow = 0, ihigh = INT_MAX;
3529 if (!_PyEval_SliceIndex(v, &ilow))
3530 return -1;
3531 if (!_PyEval_SliceIndex(w, &ihigh))
3532 return -1;
3533 if (x == NULL)
3534 return PySequence_DelSlice(u, ilow, ihigh);
3535 else
3536 return PySequence_SetSlice(u, ilow, ihigh, x);
3537 }
3538 else {
3539 PyObject *slice = PySlice_New(v, w, NULL);
3540 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003541 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003542 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003543 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003544 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003545 res = PyObject_DelItem(u, slice);
3546 Py_DECREF(slice);
3547 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003548 }
3549 else
3550 return -1;
3551 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003552}
3553
Guido van Rossumb209a111997-04-29 18:18:01 +00003554static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003555cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003556{
Guido van Rossumac7be682001-01-17 15:42:30 +00003557 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003559 case PyCmp_IS:
3560 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003561 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003562 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003563 res = !res;
3564 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003565 case PyCmp_IN:
3566 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003567 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003568 if (res < 0)
3569 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003570 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003571 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003573 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003574 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575 break;
3576 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003577 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003578 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003579 v = res ? Py_True : Py_False;
3580 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581 return v;
3582}
3583
Thomas Wouters52152252000-08-17 22:55:00 +00003584static PyObject *
3585import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003586{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003587 PyObject *x;
3588
3589 x = PyObject_GetAttr(v, name);
3590 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003591 PyErr_Format(PyExc_ImportError,
3592 "cannot import name %.230s",
3593 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003594 }
Thomas Wouters52152252000-08-17 22:55:00 +00003595 return x;
3596}
Guido van Rossumac7be682001-01-17 15:42:30 +00003597
Thomas Wouters52152252000-08-17 22:55:00 +00003598static int
3599import_all_from(PyObject *locals, PyObject *v)
3600{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003601 PyObject *all = PyObject_GetAttrString(v, "__all__");
3602 PyObject *dict, *name, *value;
3603 int skip_leading_underscores = 0;
3604 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003605
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003606 if (all == NULL) {
3607 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3608 return -1; /* Unexpected error */
3609 PyErr_Clear();
3610 dict = PyObject_GetAttrString(v, "__dict__");
3611 if (dict == NULL) {
3612 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3613 return -1;
3614 PyErr_SetString(PyExc_ImportError,
3615 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003616 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003617 }
3618 all = PyMapping_Keys(dict);
3619 Py_DECREF(dict);
3620 if (all == NULL)
3621 return -1;
3622 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003623 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003624
3625 for (pos = 0, err = 0; ; pos++) {
3626 name = PySequence_GetItem(all, pos);
3627 if (name == NULL) {
3628 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3629 err = -1;
3630 else
3631 PyErr_Clear();
3632 break;
3633 }
3634 if (skip_leading_underscores &&
3635 PyString_Check(name) &&
3636 PyString_AS_STRING(name)[0] == '_')
3637 {
3638 Py_DECREF(name);
3639 continue;
3640 }
3641 value = PyObject_GetAttr(v, name);
3642 if (value == NULL)
3643 err = -1;
3644 else
3645 err = PyDict_SetItem(locals, name, value);
3646 Py_DECREF(name);
3647 Py_XDECREF(value);
3648 if (err != 0)
3649 break;
3650 }
3651 Py_DECREF(all);
3652 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003653}
3654
Guido van Rossumb209a111997-04-29 18:18:01 +00003655static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003656build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003657{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003658 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003659
3660 if (PyDict_Check(methods))
3661 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003662 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003663 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003664 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3665 base = PyTuple_GET_ITEM(bases, 0);
3666 metaclass = PyObject_GetAttrString(base, "__class__");
3667 if (metaclass == NULL) {
3668 PyErr_Clear();
3669 metaclass = (PyObject *)base->ob_type;
3670 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003671 }
3672 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003673 else {
3674 PyObject *g = PyEval_GetGlobals();
3675 if (g != NULL && PyDict_Check(g))
3676 metaclass = PyDict_GetItemString(g, "__metaclass__");
3677 if (metaclass == NULL)
3678 metaclass = (PyObject *) &PyClass_Type;
3679 Py_INCREF(metaclass);
3680 }
3681 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3682 Py_DECREF(metaclass);
3683 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003684}
3685
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003686static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003687exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3688 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003689{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003690 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003691 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003692 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003693
Guido van Rossumb209a111997-04-29 18:18:01 +00003694 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3695 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003696 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003697 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003698 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003699 locals = PyTuple_GetItem(prog, 2);
3700 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003701 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003702 if (globals == Py_None) {
3703 globals = PyEval_GetGlobals();
3704 if (locals == Py_None) {
3705 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003706 plain = 1;
3707 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003708 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003709 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003710 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003711 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003712 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003713 !PyCode_Check(prog) &&
3714 !PyFile_Check(prog)) {
3715 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003716 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003717 return -1;
3718 }
Fred Drake661ea262000-10-24 19:57:45 +00003719 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003720 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003721 "exec: arg 2 must be a dictionary or None");
3722 return -1;
3723 }
3724 if (!PyDict_Check(locals)) {
3725 PyErr_SetString(PyExc_TypeError,
3726 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003727 return -1;
3728 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003729 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003730 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003731 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003732 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3733 PyErr_SetString(PyExc_TypeError,
3734 "code object passed to exec may not contain free variables");
3735 return -1;
3736 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003737 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003738 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003739 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003740 FILE *fp = PyFile_AsFile(prog);
3741 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003742 PyCompilerFlags cf;
3743 cf.cf_flags = 0;
3744 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003745 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3746 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003747 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003748 v = PyRun_File(fp, name, Py_file_input, globals,
3749 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003750 }
3751 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003752 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003753 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003754 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003755 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003756 cf.cf_flags = 0;
3757 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003758 v = PyRun_StringFlags(str, Py_file_input, globals,
3759 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003760 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003761 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003762 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003763 if (plain)
3764 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003765 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003766 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003767 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003768 return 0;
3769}
Guido van Rossum24c13741995-02-14 09:42:43 +00003770
Guido van Rossumac7be682001-01-17 15:42:30 +00003771static void
Paul Prescode68140d2000-08-30 20:25:01 +00003772format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3773{
3774 char *obj_str;
3775
3776 if (!obj)
3777 return;
3778
3779 obj_str = PyString_AsString(obj);
3780 if (!obj_str)
3781 return;
3782
3783 PyErr_Format(exc, format_str, obj_str);
3784}
Guido van Rossum950361c1997-01-24 13:49:28 +00003785
3786#ifdef DYNAMIC_EXECUTION_PROFILE
3787
Skip Montanarof118cb12001-10-15 20:51:38 +00003788static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003789getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003790{
3791 int i;
3792 PyObject *l = PyList_New(256);
3793 if (l == NULL) return NULL;
3794 for (i = 0; i < 256; i++) {
3795 PyObject *x = PyInt_FromLong(a[i]);
3796 if (x == NULL) {
3797 Py_DECREF(l);
3798 return NULL;
3799 }
3800 PyList_SetItem(l, i, x);
3801 }
3802 for (i = 0; i < 256; i++)
3803 a[i] = 0;
3804 return l;
3805}
3806
3807PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003808_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003809{
3810#ifndef DXPAIRS
3811 return getarray(dxp);
3812#else
3813 int i;
3814 PyObject *l = PyList_New(257);
3815 if (l == NULL) return NULL;
3816 for (i = 0; i < 257; i++) {
3817 PyObject *x = getarray(dxpairs[i]);
3818 if (x == NULL) {
3819 Py_DECREF(l);
3820 return NULL;
3821 }
3822 PyList_SetItem(l, i, x);
3823 }
3824 return l;
3825#endif
3826}
3827
3828#endif