blob: 61db642f844e2a80c6bd231063c360d16706657c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
55static int assign_slice(PyObject *, PyObject *,
56 PyObject *, PyObject *);
57static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000058static PyObject *import_from(PyObject *, PyObject *);
59static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000060static PyObject *build_class(PyObject *, PyObject *, PyObject *);
61static int exec_statement(PyFrameObject *,
62 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
64static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000065static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Paul Prescode68140d2000-08-30 20:25:01 +000067#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000068 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000069#define GLOBAL_NAME_ERROR_MSG \
70 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000071#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000072 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000073#define UNBOUNDFREE_ERROR_MSG \
74 "free variable '%.200s' referenced before assignment" \
75 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000076
Guido van Rossum950361c1997-01-24 13:49:28 +000077/* Dynamic execution profile */
78#ifdef DYNAMIC_EXECUTION_PROFILE
79#ifdef DXPAIRS
80static long dxpairs[257][256];
81#define dxp dxpairs[256]
82#else
83static long dxp[256];
84#endif
85#endif
86
Tim Peters5ca576e2001-06-18 22:08:13 +000087staticforward PyTypeObject gentype;
88
89typedef struct {
90 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000091 /* The gi_ prefix is intended to remind of generator-iterator. */
92
93 PyFrameObject *gi_frame;
94
Tim Peterse77f2e22001-06-26 22:24:51 +000095 /* True if generator is being executed. */
96 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000097} genobject;
98
99static PyObject *
100gen_new(PyFrameObject *f)
101{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000102 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000103 if (gen == NULL) {
104 Py_DECREF(f);
105 return NULL;
106 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000107 gen->gi_frame = f;
108 gen->gi_running = 0;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000109 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000110 return (PyObject *)gen;
111}
112
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000113static int
114gen_traverse(genobject *gen, visitproc visit, void *arg)
115{
116 return visit((PyObject *)gen->gi_frame, arg);
117}
118
Tim Peters5ca576e2001-06-18 22:08:13 +0000119static void
120gen_dealloc(genobject *gen)
121{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000122 _PyObject_GC_UNTRACK(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000123 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000124 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000125}
126
127static PyObject *
128gen_iternext(genobject *gen)
129{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000130 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000131 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000132 PyObject *result;
133
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000134 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000135 PyErr_SetString(PyExc_ValueError,
136 "generator already executing");
137 return NULL;
138 }
Tim Peters8c963692001-06-23 05:26:56 +0000139 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000140 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000141
142 /* Generators always return to their most recent caller, not
143 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000144 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000145 assert(f->f_back == NULL);
146 f->f_back = tstate->frame;
147
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000148 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000150 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000151
152 /* Don't keep the reference to f_back any longer than necessary. It
153 * may keep a chain of frames alive or it could create a reference
154 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000155 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000156 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000157
Tim Petersad1a18b2001-06-23 06:19:16 +0000158 /* If the generator just returned (as opposed to yielding), signal
159 * that the generator is exhausted. */
160 if (result == Py_None && f->f_stacktop == NULL) {
161 Py_DECREF(result);
162 result = NULL;
163 }
164
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000165 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000166}
167
168static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000169gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000170{
171 PyObject *result;
172
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000173 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000174
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000175 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000176 PyErr_SetObject(PyExc_StopIteration, Py_None);
177 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000178 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000179
180 return result;
181}
182
183static PyObject *
184gen_getiter(PyObject *gen)
185{
186 Py_INCREF(gen);
187 return gen;
188}
189
190static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000191 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000192 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000193 {NULL, NULL} /* Sentinel */
194};
195
Guido van Rossum6f799372001-09-20 20:46:19 +0000196static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000197 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
198 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
199 {NULL} /* Sentinel */
200};
Tim Peters5ca576e2001-06-18 22:08:13 +0000201
202statichere PyTypeObject gentype = {
203 PyObject_HEAD_INIT(&PyType_Type)
204 0, /* ob_size */
205 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000206 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000207 0, /* tp_itemsize */
208 /* methods */
209 (destructor)gen_dealloc, /* tp_dealloc */
210 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000212 0, /* tp_setattr */
213 0, /* tp_compare */
214 0, /* tp_repr */
215 0, /* tp_as_number */
216 0, /* tp_as_sequence */
217 0, /* tp_as_mapping */
218 0, /* tp_hash */
219 0, /* tp_call */
220 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000222 0, /* tp_setattro */
223 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000224 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000226 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000227 0, /* tp_clear */
228 0, /* tp_richcompare */
229 0, /* tp_weaklistoffset */
230 (getiterfunc)gen_getiter, /* tp_iter */
231 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000232 gen_methods, /* tp_methods */
233 gen_memberlist, /* tp_members */
234 0, /* tp_getset */
235 0, /* tp_base */
236 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000237};
238
239
Guido van Rossume59214e1994-08-30 08:01:59 +0000240#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000241
Guido van Rossum2571cc81999-04-07 16:07:23 +0000242#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000244#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000245#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000246
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247extern int _PyThread_Started; /* Flag for Py_Exit */
248
Guido van Rossum65d5b571998-12-21 19:32:43 +0000249static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000250static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251
252void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000256 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 interpreter_lock = PyThread_allocate_lock();
259 PyThread_acquire_lock(interpreter_lock, 1);
260 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000262
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000265{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000266 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267}
268
269void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000271{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000272 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273}
274
275void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000276PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000277{
278 if (tstate == NULL)
279 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000280 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000281 if (PyThreadState_Swap(tstate) != NULL)
282 Py_FatalError(
283 "PyEval_AcquireThread: non-NULL old thread state");
284}
285
286void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000287PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000288{
289 if (tstate == NULL)
290 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
291 if (PyThreadState_Swap(NULL) != tstate)
292 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000293 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000294}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000295
296/* This function is called from PyOS_AfterFork to ensure that newly
297 created child processes don't hold locks referring to threads which
298 are not running in the child process. (This could also be done using
299 pthread_atfork mechanism, at least for the pthreads implementation.) */
300
301void
302PyEval_ReInitThreads(void)
303{
304 if (!interpreter_lock)
305 return;
306 /*XXX Can't use PyThread_free_lock here because it does too
307 much error-checking. Doing this cleanly would require
308 adding a new function to each thread_*.h. Instead, just
309 create a new lock and waste a little bit of memory */
310 interpreter_lock = PyThread_allocate_lock();
311 PyThread_acquire_lock(interpreter_lock, 1);
312 main_thread = PyThread_get_thread_ident();
313}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314#endif
315
Guido van Rossumff4949e1992-08-05 19:58:53 +0000316/* Functions save_thread and restore_thread are always defined so
317 dynamically loaded modules needn't be compiled separately for use
318 with and without threads: */
319
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000320PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000321PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000323 PyThreadState *tstate = PyThreadState_Swap(NULL);
324 if (tstate == NULL)
325 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000327 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000328 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000329#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000330 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331}
332
333void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000336 if (tstate == NULL)
337 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000338#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000339 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000340 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000341 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 }
344#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000345 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000346}
347
348
Guido van Rossuma9672091994-09-14 13:31:22 +0000349/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
350 signal handlers or Mac I/O completion routines) can schedule calls
351 to a function to be called synchronously.
352 The synchronous function is called with one void* argument.
353 It should return 0 for success or -1 for failure -- failure should
354 be accompanied by an exception.
355
356 If registry succeeds, the registry function returns 0; if it fails
357 (e.g. due to too many pending calls) it returns -1 (without setting
358 an exception condition).
359
360 Note that because registry may occur from within signal handlers,
361 or other asynchronous events, calling malloc() is unsafe!
362
363#ifdef WITH_THREAD
364 Any thread can schedule pending calls, but only the main thread
365 will execute them.
366#endif
367
368 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
369 There are two possible race conditions:
370 (1) nested asynchronous registry calls;
371 (2) registry calls made while pending calls are being processed.
372 While (1) is very unlikely, (2) is a real possibility.
373 The current code is safe against (2), but not against (1).
374 The safety against (2) is derived from the fact that only one
375 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000376
Guido van Rossuma027efa1997-05-05 20:56:21 +0000377 XXX Darn! With the advent of thread state, we should have an array
378 of pending calls per thread in the thread state! Later...
379*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000380
Guido van Rossuma9672091994-09-14 13:31:22 +0000381#define NPENDINGCALLS 32
382static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000383 int (*func)(void *);
384 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000385} pendingcalls[NPENDINGCALLS];
386static volatile int pendingfirst = 0;
387static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000388static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389
390int
Thomas Wouters334fb892000-07-25 12:56:38 +0000391Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000392{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000393 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000394 int i, j;
395 /* XXX Begin critical section */
396 /* XXX If you want this to be safe against nested
397 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000398 if (busy)
399 return -1;
400 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000401 i = pendinglast;
402 j = (i + 1) % NPENDINGCALLS;
403 if (j == pendingfirst)
404 return -1; /* Queue full */
405 pendingcalls[i].func = func;
406 pendingcalls[i].arg = arg;
407 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000408 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000409 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000410 /* XXX End critical section */
411 return 0;
412}
413
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000415Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000416{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000419 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 return 0;
421#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000423 return 0;
424 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000426 for (;;) {
427 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000428 int (*func)(void *);
429 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000430 i = pendingfirst;
431 if (i == pendinglast)
432 break; /* Queue empty */
433 func = pendingcalls[i].func;
434 arg = pendingcalls[i].arg;
435 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000436 if (func(arg) < 0) {
437 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000438 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000439 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000440 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000441 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000442 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000443 return 0;
444}
445
446
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000447/* The interpreter's recursion limit */
448
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000449static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000450
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000451int
452Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000453{
454 return recursion_limit;
455}
456
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000457void
458Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000459{
460 recursion_limit = new_limit;
461}
462
Guido van Rossum374a9221991-04-04 10:40:29 +0000463/* Status code for main loop (reason for stack unwind) */
464
465enum why_code {
466 WHY_NOT, /* No error */
467 WHY_EXCEPTION, /* Exception occurred */
468 WHY_RERAISE, /* Exception re-raised by 'finally' */
469 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000470 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000471 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000472 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000473};
474
Tim Petersdbd9ba62000-07-09 03:09:57 +0000475static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000476static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000477
Guido van Rossum374a9221991-04-04 10:40:29 +0000478
Guido van Rossumb209a111997-04-29 18:18:01 +0000479PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000480PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000482 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 (PyObject **)NULL, 0,
485 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000486 (PyObject **)NULL, 0,
487 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488}
489
490
491/* Interpreter main loop */
492
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000494eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000495{
Guido van Rossum950361c1997-01-24 13:49:28 +0000496#ifdef DXPAIRS
497 int lastopcode = 0;
498#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000499 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000500 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000501 register int opcode=0; /* Current opcode */
502 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000503 register enum why_code why; /* Reason for block stack unwind */
504 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 register PyObject *x; /* Result object -- NULL if error */
506 register PyObject *v; /* Temporary objects popped off stack */
507 register PyObject *w;
508 register PyObject *u;
509 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000510 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000511 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000512 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000513 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000514 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000515 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000516#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000517 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000518#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000519#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000521 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000522#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000523
524/* Code access macros */
525
526#define GETCONST(i) Getconst(f, i)
527#define GETNAME(i) Getname(f, i)
528#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000529#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000530#define NEXTOP() (*next_instr++)
531#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000532#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000533#define JUMPBY(x) (next_instr += (x))
534
535/* Stack manipulation macros */
536
537#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
538#define EMPTY() (STACK_LEVEL() == 0)
539#define TOP() (stack_pointer[-1])
540#define BASIC_PUSH(v) (*stack_pointer++ = (v))
541#define BASIC_POP() (*--stack_pointer)
542
Guido van Rossum96a42c81992-01-12 02:29:51 +0000543#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000544#define PUSH(v) { (void)(BASIC_PUSH(v), \
545 lltrace && prtrace(TOP(), "push")); \
546 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000547#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000548#else
549#define PUSH(v) BASIC_PUSH(v)
550#define POP() BASIC_POP()
551#endif
552
Guido van Rossum681d79a1995-07-18 14:51:37 +0000553/* Local variable macros */
554
555#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000556
557/* The SETLOCAL() macro must not DECREF the local variable in-place and
558 then store the new value; it must copy the old value to a temporary
559 value, then store the new value, and then DECREF the temporary value.
560 This is because it is possible that during the DECREF the frame is
561 accessed by other code (e.g. a __del__ method or gc.collect()) and the
562 variable would be pointing to already-freed memory. */
563#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
564 GETLOCAL(i) = value; \
565 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000566
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567/* Start of code */
568
Tim Peters5ca576e2001-06-18 22:08:13 +0000569 if (f == NULL)
570 return NULL;
571
Guido van Rossum8861b741996-07-30 16:49:37 +0000572#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000574 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000575 return NULL;
576 }
577#endif
578
Tim Peters5ca576e2001-06-18 22:08:13 +0000579 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000580 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000581 --tstate->recursion_depth;
582 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000583 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000584 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000585 return NULL;
586 }
587
Tim Peters5ca576e2001-06-18 22:08:13 +0000588 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000589 co = f->f_code;
590 fastlocals = f->f_localsplus;
591 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000592 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000593 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000594 stack_pointer = f->f_stacktop;
595 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000596 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000597
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000598 if (tstate->use_tracing) {
599 if (tstate->c_tracefunc != NULL) {
600 /* tstate->c_tracefunc, if defined, is a
601 function that will be called on *every* entry
602 to a code block. Its return value, if not
603 None, is a function that will be called at
604 the start of each executed line of code.
605 (Actually, the function must return itself
606 in order to continue tracing.) The trace
607 functions are called with three arguments:
608 a pointer to the current frame, a string
609 indicating why the function is called, and
610 an argument which depends on the situation.
611 The global trace function is also called
612 whenever an exception is detected. */
613 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
614 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000615 /* Trace function raised an error */
616 return NULL;
617 }
618 }
619 if (tstate->c_profilefunc != NULL) {
620 /* Similar for c_profilefunc, except it needn't
621 return itself and isn't called for "line" events */
622 if (call_trace(tstate->c_profilefunc,
623 tstate->c_profileobj,
624 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000625 /* Profile function raised an error */
626 return NULL;
627 }
628 }
629 }
630
Tim Peters5ca576e2001-06-18 22:08:13 +0000631#ifdef LLTRACE
632 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
633#endif
634#if defined(Py_DEBUG) || defined(LLTRACE)
635 filename = PyString_AsString(co->co_filename);
636#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000637
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 why = WHY_NOT;
639 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000640 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000641 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000642
Guido van Rossum374a9221991-04-04 10:40:29 +0000643 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000644 assert(stack_pointer >= f->f_valuestack); /* else underflow */
645 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000646 /* Do periodic things. Doing this every time through
647 the loop would add too much overhead, so we do it
648 only every Nth instruction. We also do it if
649 ``things_to_do'' is set, i.e. when an asynchronous
650 event needs attention (e.g. a signal handler or
651 async I/O handler); see Py_AddPendingCall() and
652 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000653
Guido van Rossuma027efa1997-05-05 20:56:21 +0000654 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000655 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000656 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000657 if (Py_MakePendingCalls() < 0) {
658 why = WHY_EXCEPTION;
659 goto on_error;
660 }
661 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000662#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000663 /* If we have true signals, the signal handler
664 will call Py_AddPendingCall() so we don't
665 have to call sigcheck(). On the Mac and
666 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000667 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000668 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 goto on_error;
670 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000671#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672
Guido van Rossume59214e1994-08-30 08:01:59 +0000673#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000674 if (interpreter_lock) {
675 /* Give another thread a chance */
676
Guido van Rossum25ce5661997-08-02 03:10:38 +0000677 if (PyThreadState_Swap(NULL) != tstate)
678 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000679 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680
681 /* Other threads may run now */
682
Guido van Rossum65d5b571998-12-21 19:32:43 +0000683 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000684 if (PyThreadState_Swap(tstate) != NULL)
685 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000686 }
687#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000689
Neil Schemenauer63543862002-02-17 19:10:14 +0000690 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000692
Guido van Rossum408027e1996-12-30 16:17:54 +0000693#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000694 f->f_lasti = INSTR_OFFSET();
695#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000696
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 opcode = NEXTOP();
698 if (HAS_ARG(opcode))
699 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000700 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000701#ifdef DYNAMIC_EXECUTION_PROFILE
702#ifdef DXPAIRS
703 dxpairs[lastopcode][opcode]++;
704 lastopcode = opcode;
705#endif
706 dxp[opcode]++;
707#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000708
Guido van Rossum96a42c81992-01-12 02:29:51 +0000709#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000711
Guido van Rossum96a42c81992-01-12 02:29:51 +0000712 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 if (HAS_ARG(opcode)) {
714 printf("%d: %d, %d\n",
715 (int) (INSTR_OFFSET() - 3),
716 opcode, oparg);
717 }
718 else {
719 printf("%d: %d\n",
720 (int) (INSTR_OFFSET() - 1), opcode);
721 }
722 }
723#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000727
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 /* BEWARE!
729 It is essential that any operation that fails sets either
730 x to NULL, err to nonzero, or why to anything but WHY_NOT,
731 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000732
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000734
Neil Schemenauer63543862002-02-17 19:10:14 +0000735 case SET_LINENO:
736#ifdef LLTRACE
737 if (lltrace)
738 printf("--- %s:%d \n", filename, oparg);
739#endif
740 f->f_lineno = oparg;
741 if (tstate->c_tracefunc == NULL || tstate->tracing)
742 goto fast_next_opcode;
743 /* Trace each line of code reached */
744 f->f_lasti = INSTR_OFFSET();
745 /* Inline call_trace() for performance: */
746 tstate->tracing++;
747 tstate->use_tracing = 0;
748 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
749 PyTrace_LINE, Py_None);
750 tstate->use_tracing = (tstate->c_tracefunc
751 || tstate->c_profilefunc);
752 tstate->tracing--;
753 break;
754
755 case LOAD_FAST:
756 x = GETLOCAL(oparg);
757 if (x != NULL) {
758 Py_INCREF(x);
759 PUSH(x);
760 goto fast_next_opcode;
761 }
762 format_exc_check_arg(PyExc_UnboundLocalError,
763 UNBOUNDLOCAL_ERROR_MSG,
764 PyTuple_GetItem(co->co_varnames, oparg));
765 break;
766
767 case LOAD_CONST:
768 x = GETCONST(oparg);
769 Py_INCREF(x);
770 PUSH(x);
771 goto fast_next_opcode;
772
773 case STORE_FAST:
774 v = POP();
775 SETLOCAL(oparg, v);
776 goto fast_next_opcode;
777
Guido van Rossum374a9221991-04-04 10:40:29 +0000778 case POP_TOP:
779 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000780 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000781 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000782
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 case ROT_TWO:
784 v = POP();
785 w = POP();
786 PUSH(v);
787 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000789
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 case ROT_THREE:
791 v = POP();
792 w = POP();
793 x = POP();
794 PUSH(v);
795 PUSH(x);
796 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000797 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000798
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 case ROT_FOUR:
800 u = POP();
801 v = POP();
802 w = POP();
803 x = POP();
804 PUSH(u);
805 PUSH(x);
806 PUSH(w);
807 PUSH(v);
808 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000809
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 case DUP_TOP:
811 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000812 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000814 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000815
Thomas Wouters434d0822000-08-24 20:11:32 +0000816 case DUP_TOPX:
817 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000818 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000819 x = TOP();
820 Py_INCREF(x);
821 PUSH(x);
822 continue;
823 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000824 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000825 Py_INCREF(x);
826 w = TOP();
827 Py_INCREF(w);
828 PUSH(x);
829 PUSH(w);
830 PUSH(x);
831 continue;
832 case 3:
833 x = POP();
834 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000835 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000836 Py_INCREF(w);
837 v = TOP();
838 Py_INCREF(v);
839 PUSH(w);
840 PUSH(x);
841 PUSH(v);
842 PUSH(w);
843 PUSH(x);
844 continue;
845 case 4:
846 x = POP();
847 Py_INCREF(x);
848 w = POP();
849 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000850 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000851 Py_INCREF(v);
852 u = TOP();
853 Py_INCREF(u);
854 PUSH(v);
855 PUSH(w);
856 PUSH(x);
857 PUSH(u);
858 PUSH(v);
859 PUSH(w);
860 PUSH(x);
861 continue;
862 case 5:
863 x = POP();
864 Py_INCREF(x);
865 w = POP();
866 Py_INCREF(w);
867 v = POP();
868 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000869 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000870 Py_INCREF(u);
871 t = TOP();
872 Py_INCREF(t);
873 PUSH(u);
874 PUSH(v);
875 PUSH(w);
876 PUSH(x);
877 PUSH(t);
878 PUSH(u);
879 PUSH(v);
880 PUSH(w);
881 PUSH(x);
882 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000883 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000884 Py_FatalError("invalid argument to DUP_TOPX"
885 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000886 }
Tim Peters35ba6892000-10-11 07:04:49 +0000887 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000888
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 case UNARY_POSITIVE:
890 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000891 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000892 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000896
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 case UNARY_NEGATIVE:
898 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000899 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000900 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000904
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 case UNARY_NOT:
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000909 if (err == 0) {
910 Py_INCREF(Py_True);
911 PUSH(Py_True);
912 continue;
913 }
914 else if (err > 0) {
915 Py_INCREF(Py_False);
916 PUSH(Py_False);
917 err = 0;
918 continue;
919 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000921
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 case UNARY_CONVERT:
923 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 x = PyObject_Repr(v);
925 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000927 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000929
Guido van Rossum7928cd71991-10-24 14:59:31 +0000930 case UNARY_INVERT:
931 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000932 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000933 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000935 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000936 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000937
Guido van Rossum50564e81996-01-12 01:13:16 +0000938 case BINARY_POWER:
939 w = POP();
940 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000941 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_MULTIPLY:
949 w = POP();
950 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000951 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000952 Py_DECREF(v);
953 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000955 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000957
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000959 if (!_Py_QnewFlag) {
960 w = POP();
961 v = POP();
962 x = PyNumber_Divide(v, w);
963 Py_DECREF(v);
964 Py_DECREF(w);
965 PUSH(x);
966 if (x != NULL) continue;
967 break;
968 }
969 /* -Qnew is in effect: fall through to
970 BINARY_TRUE_DIVIDE */
971 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 w = POP();
973 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000974 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000975 Py_DECREF(v);
976 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000978 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000980
Guido van Rossum4668b002001-08-08 05:00:18 +0000981 case BINARY_FLOOR_DIVIDE:
982 w = POP();
983 v = POP();
984 x = PyNumber_FloorDivide(v, w);
985 Py_DECREF(v);
986 Py_DECREF(w);
987 PUSH(x);
988 if (x != NULL) continue;
989 break;
990
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 case BINARY_MODULO:
992 w = POP();
993 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000994 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000995 Py_DECREF(v);
996 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000998 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001000
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 case BINARY_ADD:
1002 w = POP();
1003 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001004 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001005 /* INLINE: int + int */
1006 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001007 a = PyInt_AS_LONG(v);
1008 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001010 if ((i^a) < 0 && (i^b) < 0)
1011 goto slow_add;
1012 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001013 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001014 else {
1015 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001016 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001017 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001018 Py_DECREF(v);
1019 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001020 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001021 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001023
Guido van Rossum374a9221991-04-04 10:40:29 +00001024 case BINARY_SUBTRACT:
1025 w = POP();
1026 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001027 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001028 /* INLINE: int - int */
1029 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001030 a = PyInt_AS_LONG(v);
1031 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001032 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001033 if ((i^a) < 0 && (i^~b) < 0)
1034 goto slow_sub;
1035 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001036 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001037 else {
1038 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001039 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001040 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001041 Py_DECREF(v);
1042 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001044 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001046
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 case BINARY_SUBSCR:
1048 w = POP();
1049 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001050 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001051 /* INLINE: list[int] */
1052 long i = PyInt_AsLong(w);
1053 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001054 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001055 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001056 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001057 PyErr_SetString(PyExc_IndexError,
1058 "list index out of range");
1059 x = NULL;
1060 }
1061 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001062 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001063 Py_INCREF(x);
1064 }
1065 }
1066 else
1067 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001068 Py_DECREF(v);
1069 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001070 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001071 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001073
Guido van Rossum7928cd71991-10-24 14:59:31 +00001074 case BINARY_LSHIFT:
1075 w = POP();
1076 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001077 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001078 Py_DECREF(v);
1079 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001080 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001081 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001082 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001083
Guido van Rossum7928cd71991-10-24 14:59:31 +00001084 case BINARY_RSHIFT:
1085 w = POP();
1086 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001087 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001088 Py_DECREF(v);
1089 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001090 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001091 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001092 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001093
Guido van Rossum7928cd71991-10-24 14:59:31 +00001094 case BINARY_AND:
1095 w = POP();
1096 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001097 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001098 Py_DECREF(v);
1099 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001100 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001101 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001102 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001103
Guido van Rossum7928cd71991-10-24 14:59:31 +00001104 case BINARY_XOR:
1105 w = POP();
1106 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001107 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001108 Py_DECREF(v);
1109 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001110 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001111 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001112 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001113
Guido van Rossum7928cd71991-10-24 14:59:31 +00001114 case BINARY_OR:
1115 w = POP();
1116 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001117 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001118 Py_DECREF(v);
1119 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001120 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001121 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001122 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001123
1124 case INPLACE_POWER:
1125 w = POP();
1126 v = POP();
1127 x = PyNumber_InPlacePower(v, w, Py_None);
1128 Py_DECREF(v);
1129 Py_DECREF(w);
1130 PUSH(x);
1131 if (x != NULL) continue;
1132 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001133
Thomas Wouters434d0822000-08-24 20:11:32 +00001134 case INPLACE_MULTIPLY:
1135 w = POP();
1136 v = POP();
1137 x = PyNumber_InPlaceMultiply(v, w);
1138 Py_DECREF(v);
1139 Py_DECREF(w);
1140 PUSH(x);
1141 if (x != NULL) continue;
1142 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001143
Thomas Wouters434d0822000-08-24 20:11:32 +00001144 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001145 if (!_Py_QnewFlag) {
1146 w = POP();
1147 v = POP();
1148 x = PyNumber_InPlaceDivide(v, w);
1149 Py_DECREF(v);
1150 Py_DECREF(w);
1151 PUSH(x);
1152 if (x != NULL) continue;
1153 break;
1154 }
1155 /* -Qnew is in effect: fall through to
1156 INPLACE_TRUE_DIVIDE */
1157 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001158 w = POP();
1159 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001160 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001161 Py_DECREF(v);
1162 Py_DECREF(w);
1163 PUSH(x);
1164 if (x != NULL) continue;
1165 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001166
Guido van Rossum4668b002001-08-08 05:00:18 +00001167 case INPLACE_FLOOR_DIVIDE:
1168 w = POP();
1169 v = POP();
1170 x = PyNumber_InPlaceFloorDivide(v, w);
1171 Py_DECREF(v);
1172 Py_DECREF(w);
1173 PUSH(x);
1174 if (x != NULL) continue;
1175 break;
1176
Thomas Wouters434d0822000-08-24 20:11:32 +00001177 case INPLACE_MODULO:
1178 w = POP();
1179 v = POP();
1180 x = PyNumber_InPlaceRemainder(v, w);
1181 Py_DECREF(v);
1182 Py_DECREF(w);
1183 PUSH(x);
1184 if (x != NULL) continue;
1185 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001186
Thomas Wouters434d0822000-08-24 20:11:32 +00001187 case INPLACE_ADD:
1188 w = POP();
1189 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001190 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001191 /* INLINE: int + int */
1192 register long a, b, i;
1193 a = PyInt_AS_LONG(v);
1194 b = PyInt_AS_LONG(w);
1195 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001196 if ((i^a) < 0 && (i^b) < 0)
1197 goto slow_iadd;
1198 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001199 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001200 else {
1201 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001202 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001203 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001204 Py_DECREF(v);
1205 Py_DECREF(w);
1206 PUSH(x);
1207 if (x != NULL) continue;
1208 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001209
Thomas Wouters434d0822000-08-24 20:11:32 +00001210 case INPLACE_SUBTRACT:
1211 w = POP();
1212 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001213 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001214 /* INLINE: int - int */
1215 register long a, b, i;
1216 a = PyInt_AS_LONG(v);
1217 b = PyInt_AS_LONG(w);
1218 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001219 if ((i^a) < 0 && (i^~b) < 0)
1220 goto slow_isub;
1221 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001222 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001223 else {
1224 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001225 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001226 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001227 Py_DECREF(v);
1228 Py_DECREF(w);
1229 PUSH(x);
1230 if (x != NULL) continue;
1231 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001232
Thomas Wouters434d0822000-08-24 20:11:32 +00001233 case INPLACE_LSHIFT:
1234 w = POP();
1235 v = POP();
1236 x = PyNumber_InPlaceLshift(v, w);
1237 Py_DECREF(v);
1238 Py_DECREF(w);
1239 PUSH(x);
1240 if (x != NULL) continue;
1241 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001242
Thomas Wouters434d0822000-08-24 20:11:32 +00001243 case INPLACE_RSHIFT:
1244 w = POP();
1245 v = POP();
1246 x = PyNumber_InPlaceRshift(v, w);
1247 Py_DECREF(v);
1248 Py_DECREF(w);
1249 PUSH(x);
1250 if (x != NULL) continue;
1251 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001252
Thomas Wouters434d0822000-08-24 20:11:32 +00001253 case INPLACE_AND:
1254 w = POP();
1255 v = POP();
1256 x = PyNumber_InPlaceAnd(v, w);
1257 Py_DECREF(v);
1258 Py_DECREF(w);
1259 PUSH(x);
1260 if (x != NULL) continue;
1261 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001262
Thomas Wouters434d0822000-08-24 20:11:32 +00001263 case INPLACE_XOR:
1264 w = POP();
1265 v = POP();
1266 x = PyNumber_InPlaceXor(v, w);
1267 Py_DECREF(v);
1268 Py_DECREF(w);
1269 PUSH(x);
1270 if (x != NULL) continue;
1271 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001272
Thomas Wouters434d0822000-08-24 20:11:32 +00001273 case INPLACE_OR:
1274 w = POP();
1275 v = POP();
1276 x = PyNumber_InPlaceOr(v, w);
1277 Py_DECREF(v);
1278 Py_DECREF(w);
1279 PUSH(x);
1280 if (x != NULL) continue;
1281 break;
1282
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 case SLICE+0:
1284 case SLICE+1:
1285 case SLICE+2:
1286 case SLICE+3:
1287 if ((opcode-SLICE) & 2)
1288 w = POP();
1289 else
1290 w = NULL;
1291 if ((opcode-SLICE) & 1)
1292 v = POP();
1293 else
1294 v = NULL;
1295 u = POP();
1296 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 Py_DECREF(u);
1298 Py_XDECREF(v);
1299 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001301 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001303
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 case STORE_SLICE+0:
1305 case STORE_SLICE+1:
1306 case STORE_SLICE+2:
1307 case STORE_SLICE+3:
1308 if ((opcode-STORE_SLICE) & 2)
1309 w = POP();
1310 else
1311 w = NULL;
1312 if ((opcode-STORE_SLICE) & 1)
1313 v = POP();
1314 else
1315 v = NULL;
1316 u = POP();
1317 t = POP();
1318 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 Py_DECREF(t);
1320 Py_DECREF(u);
1321 Py_XDECREF(v);
1322 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001323 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001325
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 case DELETE_SLICE+0:
1327 case DELETE_SLICE+1:
1328 case DELETE_SLICE+2:
1329 case DELETE_SLICE+3:
1330 if ((opcode-DELETE_SLICE) & 2)
1331 w = POP();
1332 else
1333 w = NULL;
1334 if ((opcode-DELETE_SLICE) & 1)
1335 v = POP();
1336 else
1337 v = NULL;
1338 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001339 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001341 Py_DECREF(u);
1342 Py_XDECREF(v);
1343 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001344 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001346
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 case STORE_SUBSCR:
1348 w = POP();
1349 v = POP();
1350 u = POP();
1351 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001352 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 Py_DECREF(u);
1354 Py_DECREF(v);
1355 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001356 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001358
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 case DELETE_SUBSCR:
1360 w = POP();
1361 v = POP();
1362 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001363 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001364 Py_DECREF(v);
1365 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001366 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001368
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 case PRINT_EXPR:
1370 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001371 w = PySys_GetObject("displayhook");
1372 if (w == NULL) {
1373 PyErr_SetString(PyExc_RuntimeError,
1374 "lost sys.displayhook");
1375 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001376 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001377 }
1378 if (err == 0) {
1379 x = Py_BuildValue("(O)", v);
1380 if (x == NULL)
1381 err = -1;
1382 }
1383 if (err == 0) {
1384 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001385 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001386 if (w == NULL)
1387 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001390 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001392
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001393 case PRINT_ITEM_TO:
1394 w = stream = POP();
1395 /* fall through to PRINT_ITEM */
1396
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 case PRINT_ITEM:
1398 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001399 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001400 w = PySys_GetObject("stdout");
1401 if (w == NULL) {
1402 PyErr_SetString(PyExc_RuntimeError,
1403 "lost sys.stdout");
1404 err = -1;
1405 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001406 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001407 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001408 err = PyFile_WriteString(" ", w);
1409 if (err == 0)
1410 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001411 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001412 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001413 if (PyString_Check(v)) {
1414 char *s = PyString_AS_STRING(v);
1415 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001416 if (len == 0 ||
1417 !isspace(Py_CHARMASK(s[len-1])) ||
1418 s[len-1] == ' ')
1419 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001420 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001421#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001422 else if (PyUnicode_Check(v)) {
1423 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1424 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001425 if (len == 0 ||
1426 !Py_UNICODE_ISSPACE(s[len-1]) ||
1427 s[len-1] == ' ')
1428 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001429 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001430#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001431 else
1432 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001434 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001435 Py_XDECREF(stream);
1436 stream = NULL;
1437 if (err == 0)
1438 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001440
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001441 case PRINT_NEWLINE_TO:
1442 w = stream = POP();
1443 /* fall through to PRINT_NEWLINE */
1444
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001446 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001447 w = PySys_GetObject("stdout");
1448 if (w == NULL)
1449 PyErr_SetString(PyExc_RuntimeError,
1450 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001451 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001452 if (w != NULL) {
1453 err = PyFile_WriteString("\n", w);
1454 if (err == 0)
1455 PyFile_SoftSpace(w, 0);
1456 }
1457 Py_XDECREF(stream);
1458 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001460
Thomas Wouters434d0822000-08-24 20:11:32 +00001461
1462#ifdef CASE_TOO_BIG
1463 default: switch (opcode) {
1464#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 case BREAK_LOOP:
1466 why = WHY_BREAK;
1467 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001468
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001469 case CONTINUE_LOOP:
1470 retval = PyInt_FromLong(oparg);
1471 why = WHY_CONTINUE;
1472 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001473
Guido van Rossumf10570b1995-07-07 22:53:21 +00001474 case RAISE_VARARGS:
1475 u = v = w = NULL;
1476 switch (oparg) {
1477 case 3:
1478 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001479 /* Fallthrough */
1480 case 2:
1481 v = POP(); /* value */
1482 /* Fallthrough */
1483 case 1:
1484 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001485 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001486 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001487 break;
1488 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001489 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001490 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001491 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001492 break;
1493 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001495
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001497 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001498 PyErr_SetString(PyExc_SystemError,
1499 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001500 break;
1501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001503 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001505
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 case RETURN_VALUE:
1507 retval = POP();
1508 why = WHY_RETURN;
1509 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001510
Tim Peters5ca576e2001-06-18 22:08:13 +00001511 case YIELD_VALUE:
1512 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001513 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001514 f->f_lasti = INSTR_OFFSET();
1515 why = WHY_YIELD;
1516 break;
1517
1518
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001519 case EXEC_STMT:
1520 w = POP();
1521 v = POP();
1522 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001523 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 Py_DECREF(u);
1525 Py_DECREF(v);
1526 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case POP_BLOCK:
1530 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 while (STACK_LEVEL() > b->b_level) {
1533 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 }
1536 }
1537 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001538
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 case END_FINALLY:
1540 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 if (PyInt_Check(v)) {
1542 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001543 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001544 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001545 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001546 retval = POP();
1547 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001548 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001553 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 else if (v != Py_None) {
1556 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 "'finally' pops bad exception");
1558 why = WHY_EXCEPTION;
1559 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001562
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001564 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001566 w = POP();
1567 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 Py_DECREF(u);
1570 Py_DECREF(v);
1571 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001573
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 case STORE_NAME:
1575 w = GETNAMEV(oparg);
1576 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001577 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001578 PyErr_Format(PyExc_SystemError,
1579 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001580 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001581 break;
1582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 err = PyDict_SetItem(x, w, v);
1584 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001586
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001588 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001590 PyErr_Format(PyExc_SystemError,
1591 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001592 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 break;
1594 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001596 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001597 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001599
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001600 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001602 if (PyTuple_Check(v)) {
1603 if (PyTuple_Size(v) != oparg) {
1604 PyErr_SetString(PyExc_ValueError,
1605 "unpack tuple of wrong size");
1606 why = WHY_EXCEPTION;
1607 }
1608 else {
1609 for (; --oparg >= 0; ) {
1610 w = PyTuple_GET_ITEM(v, oparg);
1611 Py_INCREF(w);
1612 PUSH(w);
1613 }
1614 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001616 else if (PyList_Check(v)) {
1617 if (PyList_Size(v) != oparg) {
1618 PyErr_SetString(PyExc_ValueError,
1619 "unpack list of wrong size");
1620 why = WHY_EXCEPTION;
1621 }
1622 else {
1623 for (; --oparg >= 0; ) {
1624 w = PyList_GET_ITEM(v, oparg);
1625 Py_INCREF(w);
1626 PUSH(w);
1627 }
1628 }
1629 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001630 else if (unpack_iterable(v, oparg,
1631 stack_pointer + oparg))
1632 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001633 else {
1634 if (PyErr_ExceptionMatches(PyExc_TypeError))
1635 PyErr_SetString(PyExc_TypeError,
1636 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001637 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001638 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001639 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001641
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001643 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 v = POP();
1645 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1647 Py_DECREF(v);
1648 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001650
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001652 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001654 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1655 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001658
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001659 case STORE_GLOBAL:
1660 w = GETNAMEV(oparg);
1661 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 err = PyDict_SetItem(f->f_globals, w, v);
1663 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001664 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001665
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001666 case DELETE_GLOBAL:
1667 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001669 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001670 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001671 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001672
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001674 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001675 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001676 PyErr_Format(PyExc_SystemError,
1677 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001678 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 break;
1680 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001683 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001687 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001688 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001689 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 break;
1691 }
1692 }
1693 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001694 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 PUSH(x);
1696 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001697
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001699 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001702 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001704 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001705 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001706 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 break;
1708 }
1709 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 PUSH(x);
1712 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001713
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001714 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001715 x = GETLOCAL(oparg);
1716 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001717 format_exc_check_arg(
1718 PyExc_UnboundLocalError,
1719 UNBOUNDLOCAL_ERROR_MSG,
1720 PyTuple_GetItem(co->co_varnames, oparg)
1721 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001722 break;
1723 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001726
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001727 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001728 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001729 Py_INCREF(x);
1730 PUSH(x);
1731 break;
1732
1733 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001734 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001735 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001736 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001737 err = -1;
1738 /* Don't stomp existing exception */
1739 if (PyErr_Occurred())
1740 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001741 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001742 v = PyTuple_GetItem(co->co_cellvars,
1743 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001744 format_exc_check_arg(
1745 PyExc_UnboundLocalError,
1746 UNBOUNDLOCAL_ERROR_MSG,
1747 v);
1748 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001749 v = PyTuple_GetItem(
1750 co->co_freevars,
1751 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001752 format_exc_check_arg(
1753 PyExc_NameError,
1754 UNBOUNDFREE_ERROR_MSG,
1755 v);
1756 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001757 break;
1758 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001759 PUSH(w);
1760 break;
1761
1762 case STORE_DEREF:
1763 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001764 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001765 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001766 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001767 continue;
1768
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001770 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 if (x != NULL) {
1772 for (; --oparg >= 0;) {
1773 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 }
1776 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001777 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 }
1779 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001780
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 if (x != NULL) {
1784 for (; --oparg >= 0;) {
1785 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001786 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 }
1788 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001789 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 }
1791 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001792
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001796 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001798
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001800 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 x = PyObject_GetAttr(v, w);
1803 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001805 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001807
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 case COMPARE_OP:
1809 w = POP();
1810 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001811 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001812 /* INLINE: cmp(int, int) */
1813 register long a, b;
1814 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001815 a = PyInt_AS_LONG(v);
1816 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001817 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001818 case PyCmp_LT: res = a < b; break;
1819 case PyCmp_LE: res = a <= b; break;
1820 case PyCmp_EQ: res = a == b; break;
1821 case PyCmp_NE: res = a != b; break;
1822 case PyCmp_GT: res = a > b; break;
1823 case PyCmp_GE: res = a >= b; break;
1824 case PyCmp_IS: res = v == w; break;
1825 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001826 default: goto slow_compare;
1827 }
1828 x = res ? Py_True : Py_False;
1829 Py_INCREF(x);
1830 }
1831 else {
1832 slow_compare:
1833 x = cmp_outcome(oparg, v, w);
1834 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001835 Py_DECREF(v);
1836 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001838 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001840
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001842 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001844 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001846 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001847 break;
1848 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001849 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001850 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001851 w,
1852 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001853 f->f_locals == NULL ?
1854 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001855 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001857 if (w == NULL) {
1858 x = NULL;
1859 break;
1860 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 x = PyEval_CallObject(x, w);
1862 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001863 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001864 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001866
Thomas Wouters52152252000-08-17 22:55:00 +00001867 case IMPORT_STAR:
1868 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001869 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001870 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001871 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001872 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001873 break;
1874 }
Thomas Wouters52152252000-08-17 22:55:00 +00001875 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001877 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001878 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001880
Thomas Wouters52152252000-08-17 22:55:00 +00001881 case IMPORT_FROM:
1882 w = GETNAMEV(oparg);
1883 v = TOP();
1884 x = import_from(v, w);
1885 PUSH(x);
1886 if (x != NULL) continue;
1887 break;
1888
Guido van Rossum374a9221991-04-04 10:40:29 +00001889 case JUMP_FORWARD:
1890 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001891 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001892
Guido van Rossum374a9221991-04-04 10:40:29 +00001893 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001894 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001895 if (err > 0)
1896 err = 0;
1897 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001898 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001899 else
1900 break;
1901 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001902
Guido van Rossum374a9221991-04-04 10:40:29 +00001903 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001904 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001905 if (err > 0) {
1906 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001908 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001909 else if (err == 0)
1910 ;
1911 else
1912 break;
1913 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001914
Guido van Rossum374a9221991-04-04 10:40:29 +00001915 case JUMP_ABSOLUTE:
1916 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001917 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001918
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001919 case GET_ITER:
1920 /* before: [obj]; after [getiter(obj)] */
1921 v = POP();
1922 x = PyObject_GetIter(v);
1923 Py_DECREF(v);
1924 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001925 PUSH(x);
1926 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001927 }
1928 break;
1929
1930 case FOR_ITER:
1931 /* before: [iter]; after: [iter, iter()] *or* [] */
1932 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001933 x = PyIter_Next(v);
1934 if (x != NULL) {
1935 PUSH(x);
1936 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001937 }
Tim Petersf4848da2001-05-05 00:14:56 +00001938 if (!PyErr_Occurred()) {
1939 /* iterator ended normally */
1940 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001941 Py_DECREF(v);
1942 JUMPBY(oparg);
1943 continue;
1944 }
1945 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001946
Guido van Rossum374a9221991-04-04 10:40:29 +00001947 case SETUP_LOOP:
1948 case SETUP_EXCEPT:
1949 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001950 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001951 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001952 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001953
Guido van Rossumf10570b1995-07-07 22:53:21 +00001954 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001955 {
1956 int na = oparg & 0xff;
1957 int nk = (oparg>>8) & 0xff;
1958 int n = na + 2 * nk;
1959 PyObject **pfunc = stack_pointer - n - 1;
1960 PyObject *func = *pfunc;
1961 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1962
1963 /* Always dispatch PyCFunction first, because
1964 these are presumed to be the most frequent
1965 callable object.
1966 */
1967 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001968 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001969 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001970 x = do_call(func, &stack_pointer,
1971 na, nk);
1972 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001973 PyObject *callargs;
1974 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001975 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001976 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001977 } else
1978 x = fast_cfunction(func,
1979 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001980 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001981 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001982 && PyMethod_GET_SELF(func) != NULL) {
1983 /* optimize access to bound methods */
1984 PyObject *self = PyMethod_GET_SELF(func);
1985 Py_INCREF(self);
1986 func = PyMethod_GET_FUNCTION(func);
1987 Py_INCREF(func);
1988 Py_DECREF(*pfunc);
1989 *pfunc = self;
1990 na++;
1991 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001992 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001993 Py_INCREF(func);
1994 if (PyFunction_Check(func)) {
1995 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001996 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001997 } else {
1998 x = do_call(func, &stack_pointer,
1999 na, nk);
2000 }
2001 Py_DECREF(func);
2002 }
2003
2004 while (stack_pointer > pfunc) {
2005 w = POP();
2006 Py_DECREF(w);
2007 }
2008 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002009 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002010 continue;
2011 break;
2012 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002013
Jeremy Hylton76901512000-03-28 23:49:17 +00002014 case CALL_FUNCTION_VAR:
2015 case CALL_FUNCTION_KW:
2016 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002017 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002018 int na = oparg & 0xff;
2019 int nk = (oparg>>8) & 0xff;
2020 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002021 int n = na + 2 * nk;
2022 PyObject **pfunc, *func;
2023 if (flags & CALL_FLAG_VAR)
2024 n++;
2025 if (flags & CALL_FLAG_KW)
2026 n++;
2027 pfunc = stack_pointer - n - 1;
2028 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002029 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002030
Guido van Rossumac7be682001-01-17 15:42:30 +00002031 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002032 && PyMethod_GET_SELF(func) != NULL) {
2033 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002034 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002035 func = PyMethod_GET_FUNCTION(func);
2036 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002037 Py_DECREF(*pfunc);
2038 *pfunc = self;
2039 na++;
2040 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002041 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002042 Py_INCREF(func);
2043 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002044 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002045
Jeremy Hylton76901512000-03-28 23:49:17 +00002046 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002047 w = POP();
2048 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002049 }
2050 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002051 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002052 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002053 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002054 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002055
Guido van Rossum681d79a1995-07-18 14:51:37 +00002056 case MAKE_FUNCTION:
2057 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 x = PyFunction_New(v, f->f_globals);
2059 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 /* XXX Maybe this should be a separate opcode? */
2061 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002063 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002065 x = NULL;
2066 break;
2067 }
2068 while (--oparg >= 0) {
2069 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002071 }
2072 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 }
2075 PUSH(x);
2076 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002077
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002078 case MAKE_CLOSURE:
2079 {
2080 int nfree;
2081 v = POP(); /* code object */
2082 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002083 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002084 Py_DECREF(v);
2085 /* XXX Maybe this should be a separate opcode? */
2086 if (x != NULL && nfree > 0) {
2087 v = PyTuple_New(nfree);
2088 if (v == NULL) {
2089 Py_DECREF(x);
2090 x = NULL;
2091 break;
2092 }
2093 while (--nfree >= 0) {
2094 w = POP();
2095 PyTuple_SET_ITEM(v, nfree, w);
2096 }
2097 err = PyFunction_SetClosure(x, v);
2098 Py_DECREF(v);
2099 }
2100 if (x != NULL && oparg > 0) {
2101 v = PyTuple_New(oparg);
2102 if (v == NULL) {
2103 Py_DECREF(x);
2104 x = NULL;
2105 break;
2106 }
2107 while (--oparg >= 0) {
2108 w = POP();
2109 PyTuple_SET_ITEM(v, oparg, w);
2110 }
2111 err = PyFunction_SetDefaults(x, v);
2112 Py_DECREF(v);
2113 }
2114 PUSH(x);
2115 break;
2116 }
2117
Guido van Rossum8861b741996-07-30 16:49:37 +00002118 case BUILD_SLICE:
2119 if (oparg == 3)
2120 w = POP();
2121 else
2122 w = NULL;
2123 v = POP();
2124 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002125 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 Py_DECREF(u);
2127 Py_DECREF(v);
2128 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002129 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002130 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002131 break;
2132
Fred Drakeef8ace32000-08-24 00:32:09 +00002133 case EXTENDED_ARG:
2134 opcode = NEXTOP();
2135 oparg = oparg<<16 | NEXTARG();
2136 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002137
Guido van Rossum374a9221991-04-04 10:40:29 +00002138 default:
2139 fprintf(stderr,
2140 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002141 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002142 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002143 why = WHY_EXCEPTION;
2144 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002145
2146#ifdef CASE_TOO_BIG
2147 }
2148#endif
2149
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 } /* switch */
2151
2152 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002153
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002155
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002157 if (err == 0 && x != NULL) {
2158#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002159 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002160 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 fprintf(stderr,
2162 "XXX undetected error\n");
2163 else
2164#endif
2165 continue; /* Normal, fast path */
2166 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 err = 0;
2170 }
2171
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002173
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002175 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002176 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002177 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 why = WHY_EXCEPTION;
2179 }
2180 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002181#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002183 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002185 fprintf(stderr,
2186 "XXX undetected error (why=%d)\n",
2187 why);
2188 why = WHY_EXCEPTION;
2189 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 }
2191#endif
2192
2193 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002194
Guido van Rossum374a9221991-04-04 10:40:29 +00002195 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002196 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002198 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002200
Fred Drake8f51f542001-10-04 14:48:42 +00002201 if (tstate->c_tracefunc != NULL)
2202 call_exc_trace(tstate->c_tracefunc,
2203 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002204 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002207
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 if (why == WHY_RERAISE)
2209 why = WHY_EXCEPTION;
2210
2211 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002212
Tim Peters5ca576e2001-06-18 22:08:13 +00002213 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002214 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002215
2216 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2217 /* For a continue inside a try block,
2218 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002219 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2220 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002221 why = WHY_NOT;
2222 JUMPTO(PyInt_AS_LONG(retval));
2223 Py_DECREF(retval);
2224 break;
2225 }
2226
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 while (STACK_LEVEL() > b->b_level) {
2228 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002230 }
2231 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2232 why = WHY_NOT;
2233 JUMPTO(b->b_handler);
2234 break;
2235 }
2236 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002237 (b->b_type == SETUP_EXCEPT &&
2238 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002239 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002240 PyObject *exc, *val, *tb;
2241 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002242 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002243 val = Py_None;
2244 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002245 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 /* Make the raw exception data
2247 available to the handler,
2248 so a program can emulate the
2249 Python main loop. Don't do
2250 this for 'finally'. */
2251 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002252 PyErr_NormalizeException(
2253 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002254 set_exc_info(tstate,
2255 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002257 if (tb == NULL) {
2258 Py_INCREF(Py_None);
2259 PUSH(Py_None);
2260 } else
2261 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002262 PUSH(val);
2263 PUSH(exc);
2264 }
2265 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002266 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002267 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002268 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002269 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002270 PUSH(v);
2271 }
2272 why = WHY_NOT;
2273 JUMPTO(b->b_handler);
2274 break;
2275 }
2276 } /* unwind stack */
2277
2278 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002279
Guido van Rossum374a9221991-04-04 10:40:29 +00002280 if (why != WHY_NOT)
2281 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002282
Guido van Rossum374a9221991-04-04 10:40:29 +00002283 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002284
Guido van Rossum35974fb2001-12-06 21:28:18 +00002285 if (why != WHY_YIELD) {
2286 /* Pop remaining stack entries -- but when yielding */
2287 while (!EMPTY()) {
2288 v = POP();
2289 Py_XDECREF(v);
2290 }
2291 }
2292
Tim Peters5ca576e2001-06-18 22:08:13 +00002293 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002294 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002295
Fred Drake9e3ad782001-07-03 23:39:52 +00002296 if (tstate->use_tracing) {
2297 if (tstate->c_tracefunc
2298 && (why == WHY_RETURN || why == WHY_YIELD)) {
2299 if (call_trace(tstate->c_tracefunc,
2300 tstate->c_traceobj, f,
2301 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002303 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002304 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002305 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002306 }
Fred Drake8f51f542001-10-04 14:48:42 +00002307 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002308 if (why == WHY_EXCEPTION)
2309 call_trace_protected(tstate->c_profilefunc,
2310 tstate->c_profileobj, f,
2311 PyTrace_RETURN);
2312 else if (call_trace(tstate->c_profilefunc,
2313 tstate->c_profileobj, f,
2314 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002315 Py_XDECREF(retval);
2316 retval = NULL;
2317 why = WHY_EXCEPTION;
2318 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002319 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002320 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002321
Guido van Rossuma027efa1997-05-05 20:56:21 +00002322 reset_exc_info(tstate);
2323
Tim Peters5ca576e2001-06-18 22:08:13 +00002324 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002325 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002326 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002327
Guido van Rossum96a42c81992-01-12 02:29:51 +00002328 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002329}
2330
Tim Peters6d6c1a32001-08-02 04:15:00 +00002331PyObject *
2332PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002333 PyObject **args, int argcount, PyObject **kws, int kwcount,
2334 PyObject **defs, int defcount, PyObject *closure)
2335{
2336 register PyFrameObject *f;
2337 register PyObject *retval = NULL;
2338 register PyObject **fastlocals, **freevars;
2339 PyThreadState *tstate = PyThreadState_GET();
2340 PyObject *x, *u;
2341
2342 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002343 PyErr_SetString(PyExc_SystemError,
2344 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002345 return NULL;
2346 }
2347
2348 f = PyFrame_New(tstate, /*back*/
2349 co, /*code*/
2350 globals, locals);
2351 if (f == NULL)
2352 return NULL;
2353
2354 fastlocals = f->f_localsplus;
2355 freevars = f->f_localsplus + f->f_nlocals;
2356
2357 if (co->co_argcount > 0 ||
2358 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2359 int i;
2360 int n = argcount;
2361 PyObject *kwdict = NULL;
2362 if (co->co_flags & CO_VARKEYWORDS) {
2363 kwdict = PyDict_New();
2364 if (kwdict == NULL)
2365 goto fail;
2366 i = co->co_argcount;
2367 if (co->co_flags & CO_VARARGS)
2368 i++;
2369 SETLOCAL(i, kwdict);
2370 }
2371 if (argcount > co->co_argcount) {
2372 if (!(co->co_flags & CO_VARARGS)) {
2373 PyErr_Format(PyExc_TypeError,
2374 "%.200s() takes %s %d "
2375 "%sargument%s (%d given)",
2376 PyString_AsString(co->co_name),
2377 defcount ? "at most" : "exactly",
2378 co->co_argcount,
2379 kwcount ? "non-keyword " : "",
2380 co->co_argcount == 1 ? "" : "s",
2381 argcount);
2382 goto fail;
2383 }
2384 n = co->co_argcount;
2385 }
2386 for (i = 0; i < n; i++) {
2387 x = args[i];
2388 Py_INCREF(x);
2389 SETLOCAL(i, x);
2390 }
2391 if (co->co_flags & CO_VARARGS) {
2392 u = PyTuple_New(argcount - n);
2393 if (u == NULL)
2394 goto fail;
2395 SETLOCAL(co->co_argcount, u);
2396 for (i = n; i < argcount; i++) {
2397 x = args[i];
2398 Py_INCREF(x);
2399 PyTuple_SET_ITEM(u, i-n, x);
2400 }
2401 }
2402 for (i = 0; i < kwcount; i++) {
2403 PyObject *keyword = kws[2*i];
2404 PyObject *value = kws[2*i + 1];
2405 int j;
2406 if (keyword == NULL || !PyString_Check(keyword)) {
2407 PyErr_Format(PyExc_TypeError,
2408 "%.200s() keywords must be strings",
2409 PyString_AsString(co->co_name));
2410 goto fail;
2411 }
2412 /* XXX slow -- speed up using dictionary? */
2413 for (j = 0; j < co->co_argcount; j++) {
2414 PyObject *nm = PyTuple_GET_ITEM(
2415 co->co_varnames, j);
2416 int cmp = PyObject_RichCompareBool(
2417 keyword, nm, Py_EQ);
2418 if (cmp > 0)
2419 break;
2420 else if (cmp < 0)
2421 goto fail;
2422 }
2423 /* Check errors from Compare */
2424 if (PyErr_Occurred())
2425 goto fail;
2426 if (j >= co->co_argcount) {
2427 if (kwdict == NULL) {
2428 PyErr_Format(PyExc_TypeError,
2429 "%.200s() got an unexpected "
2430 "keyword argument '%.400s'",
2431 PyString_AsString(co->co_name),
2432 PyString_AsString(keyword));
2433 goto fail;
2434 }
2435 PyDict_SetItem(kwdict, keyword, value);
2436 }
2437 else {
2438 if (GETLOCAL(j) != NULL) {
2439 PyErr_Format(PyExc_TypeError,
2440 "%.200s() got multiple "
2441 "values for keyword "
2442 "argument '%.400s'",
2443 PyString_AsString(co->co_name),
2444 PyString_AsString(keyword));
2445 goto fail;
2446 }
2447 Py_INCREF(value);
2448 SETLOCAL(j, value);
2449 }
2450 }
2451 if (argcount < co->co_argcount) {
2452 int m = co->co_argcount - defcount;
2453 for (i = argcount; i < m; i++) {
2454 if (GETLOCAL(i) == NULL) {
2455 PyErr_Format(PyExc_TypeError,
2456 "%.200s() takes %s %d "
2457 "%sargument%s (%d given)",
2458 PyString_AsString(co->co_name),
2459 ((co->co_flags & CO_VARARGS) ||
2460 defcount) ? "at least"
2461 : "exactly",
2462 m, kwcount ? "non-keyword " : "",
2463 m == 1 ? "" : "s", i);
2464 goto fail;
2465 }
2466 }
2467 if (n > m)
2468 i = n - m;
2469 else
2470 i = 0;
2471 for (; i < defcount; i++) {
2472 if (GETLOCAL(m+i) == NULL) {
2473 PyObject *def = defs[i];
2474 Py_INCREF(def);
2475 SETLOCAL(m+i, def);
2476 }
2477 }
2478 }
2479 }
2480 else {
2481 if (argcount > 0 || kwcount > 0) {
2482 PyErr_Format(PyExc_TypeError,
2483 "%.200s() takes no arguments (%d given)",
2484 PyString_AsString(co->co_name),
2485 argcount + kwcount);
2486 goto fail;
2487 }
2488 }
2489 /* Allocate and initialize storage for cell vars, and copy free
2490 vars into frame. This isn't too efficient right now. */
2491 if (f->f_ncells) {
2492 int i = 0, j = 0, nargs, found;
2493 char *cellname, *argname;
2494 PyObject *c;
2495
2496 nargs = co->co_argcount;
2497 if (co->co_flags & CO_VARARGS)
2498 nargs++;
2499 if (co->co_flags & CO_VARKEYWORDS)
2500 nargs++;
2501
2502 /* Check for cells that shadow args */
2503 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2504 cellname = PyString_AS_STRING(
2505 PyTuple_GET_ITEM(co->co_cellvars, i));
2506 found = 0;
2507 while (j < nargs) {
2508 argname = PyString_AS_STRING(
2509 PyTuple_GET_ITEM(co->co_varnames, j));
2510 if (strcmp(cellname, argname) == 0) {
2511 c = PyCell_New(GETLOCAL(j));
2512 if (c == NULL)
2513 goto fail;
2514 GETLOCAL(f->f_nlocals + i) = c;
2515 found = 1;
2516 break;
2517 }
2518 j++;
2519 }
2520 if (found == 0) {
2521 c = PyCell_New(NULL);
2522 if (c == NULL)
2523 goto fail;
2524 SETLOCAL(f->f_nlocals + i, c);
2525 }
2526 }
2527 /* Initialize any that are left */
2528 while (i < f->f_ncells) {
2529 c = PyCell_New(NULL);
2530 if (c == NULL)
2531 goto fail;
2532 SETLOCAL(f->f_nlocals + i, c);
2533 i++;
2534 }
2535 }
2536 if (f->f_nfreevars) {
2537 int i;
2538 for (i = 0; i < f->f_nfreevars; ++i) {
2539 PyObject *o = PyTuple_GET_ITEM(closure, i);
2540 Py_INCREF(o);
2541 freevars[f->f_ncells + i] = o;
2542 }
2543 }
2544
Tim Peters5ca576e2001-06-18 22:08:13 +00002545 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002546 /* Don't need to keep the reference to f_back, it will be set
2547 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002548 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002549 f->f_back = NULL;
2550
2551 /* Create a new generator that owns the ready to run frame
2552 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002553 return gen_new(f);
2554 }
2555
2556 retval = eval_frame(f);
2557
2558 fail: /* Jump here from prelude on failure */
2559
Tim Petersb13680b2001-11-27 23:29:29 +00002560 /* decref'ing the frame can cause __del__ methods to get invoked,
2561 which can call back into Python. While we're done with the
2562 current Python frame (f), the associated C stack is still in use,
2563 so recursion_depth must be boosted for the duration.
2564 */
2565 assert(tstate != NULL);
2566 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002567 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002568 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002569 return retval;
2570}
2571
2572
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002574set_exc_info(PyThreadState *tstate,
2575 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002576{
2577 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002578 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002579
Guido van Rossuma027efa1997-05-05 20:56:21 +00002580 frame = tstate->frame;
2581 if (frame->f_exc_type == NULL) {
2582 /* This frame didn't catch an exception before */
2583 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584 if (tstate->exc_type == NULL) {
2585 Py_INCREF(Py_None);
2586 tstate->exc_type = Py_None;
2587 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002588 tmp_type = frame->f_exc_type;
2589 tmp_value = frame->f_exc_value;
2590 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 Py_XINCREF(tstate->exc_type);
2592 Py_XINCREF(tstate->exc_value);
2593 Py_XINCREF(tstate->exc_traceback);
2594 frame->f_exc_type = tstate->exc_type;
2595 frame->f_exc_value = tstate->exc_value;
2596 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002597 Py_XDECREF(tmp_type);
2598 Py_XDECREF(tmp_value);
2599 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600 }
2601 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002602 tmp_type = tstate->exc_type;
2603 tmp_value = tstate->exc_value;
2604 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605 Py_XINCREF(type);
2606 Py_XINCREF(value);
2607 Py_XINCREF(tb);
2608 tstate->exc_type = type;
2609 tstate->exc_value = value;
2610 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002611 Py_XDECREF(tmp_type);
2612 Py_XDECREF(tmp_value);
2613 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002614 /* For b/w compatibility */
2615 PySys_SetObject("exc_type", type);
2616 PySys_SetObject("exc_value", value);
2617 PySys_SetObject("exc_traceback", tb);
2618}
2619
2620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002621reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002622{
2623 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002624 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002625 frame = tstate->frame;
2626 if (frame->f_exc_type != NULL) {
2627 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002628 tmp_type = tstate->exc_type;
2629 tmp_value = tstate->exc_value;
2630 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002631 Py_XINCREF(frame->f_exc_type);
2632 Py_XINCREF(frame->f_exc_value);
2633 Py_XINCREF(frame->f_exc_traceback);
2634 tstate->exc_type = frame->f_exc_type;
2635 tstate->exc_value = frame->f_exc_value;
2636 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002637 Py_XDECREF(tmp_type);
2638 Py_XDECREF(tmp_value);
2639 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640 /* For b/w compatibility */
2641 PySys_SetObject("exc_type", frame->f_exc_type);
2642 PySys_SetObject("exc_value", frame->f_exc_value);
2643 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2644 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002645 tmp_type = frame->f_exc_type;
2646 tmp_value = frame->f_exc_value;
2647 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002648 frame->f_exc_type = NULL;
2649 frame->f_exc_value = NULL;
2650 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002651 Py_XDECREF(tmp_type);
2652 Py_XDECREF(tmp_value);
2653 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002654}
2655
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002656/* Logic for the raise statement (too complicated for inlining).
2657 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002658static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002659do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002660{
Guido van Rossumd295f121998-04-09 21:39:57 +00002661 if (type == NULL) {
2662 /* Reraise */
2663 PyThreadState *tstate = PyThreadState_Get();
2664 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2665 value = tstate->exc_value;
2666 tb = tstate->exc_traceback;
2667 Py_XINCREF(type);
2668 Py_XINCREF(value);
2669 Py_XINCREF(tb);
2670 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002671
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002672 /* We support the following forms of raise:
2673 raise <class>, <classinstance>
2674 raise <class>, <argument tuple>
2675 raise <class>, None
2676 raise <class>, <argument>
2677 raise <classinstance>, None
2678 raise <string>, <object>
2679 raise <string>, None
2680
2681 An omitted second argument is the same as None.
2682
2683 In addition, raise <tuple>, <anything> is the same as
2684 raising the tuple's first item (and it better have one!);
2685 this rule is applied recursively.
2686
2687 Finally, an optional third argument can be supplied, which
2688 gives the traceback to be substituted (useful when
2689 re-raising an exception after examining it). */
2690
2691 /* First, check the traceback argument, replacing None with
2692 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002693 if (tb == Py_None) {
2694 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002695 tb = NULL;
2696 }
2697 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002698 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002699 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002700 goto raise_error;
2701 }
2702
2703 /* Next, replace a missing value with None */
2704 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 value = Py_None;
2706 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002707 }
2708
2709 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2711 PyObject *tmp = type;
2712 type = PyTuple_GET_ITEM(type, 0);
2713 Py_INCREF(type);
2714 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002715 }
2716
Tim Petersafb2c802002-04-18 18:06:20 +00002717 if (PyString_CheckExact(type))
2718 /* Raising builtin string is deprecated but still allowed --
2719 * do nothing. Raising an instance of a new-style str
2720 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002721 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002722
2723 else if (PyClass_Check(type))
2724 PyErr_NormalizeException(&type, &value, &tb);
2725
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002727 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 if (value != Py_None) {
2729 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002730 "instance exception may not have a separate value");
2731 goto raise_error;
2732 }
2733 else {
2734 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2738 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002739 }
2740 }
2741 else {
2742 /* Not something you can raise. You get an exception
2743 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002744 PyErr_Format(PyExc_TypeError,
2745 "exceptions must be strings, classes, or "
2746 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002747 goto raise_error;
2748 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002750 if (tb == NULL)
2751 return WHY_EXCEPTION;
2752 else
2753 return WHY_RERAISE;
2754 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 Py_XDECREF(value);
2756 Py_XDECREF(type);
2757 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002758 return WHY_EXCEPTION;
2759}
2760
Tim Petersd6d010b2001-06-21 02:49:55 +00002761/* Iterate v argcnt times and store the results on the stack (via decreasing
2762 sp). Return 1 for success, 0 if error. */
2763
Barry Warsawe42b18f1997-08-25 22:13:04 +00002764static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002765unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002766{
Tim Petersd6d010b2001-06-21 02:49:55 +00002767 int i = 0;
2768 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002769 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002770
Tim Petersd6d010b2001-06-21 02:49:55 +00002771 assert(v != NULL);
2772
2773 it = PyObject_GetIter(v);
2774 if (it == NULL)
2775 goto Error;
2776
2777 for (; i < argcnt; i++) {
2778 w = PyIter_Next(it);
2779 if (w == NULL) {
2780 /* Iterator done, via error or exhaustion. */
2781 if (!PyErr_Occurred()) {
2782 PyErr_Format(PyExc_ValueError,
2783 "need more than %d value%s to unpack",
2784 i, i == 1 ? "" : "s");
2785 }
2786 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002787 }
2788 *--sp = w;
2789 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002790
2791 /* We better have exhausted the iterator now. */
2792 w = PyIter_Next(it);
2793 if (w == NULL) {
2794 if (PyErr_Occurred())
2795 goto Error;
2796 Py_DECREF(it);
2797 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002798 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002799 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002800 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002801 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002802Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002803 for (; i > 0; i--, sp++)
2804 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002805 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002806 return 0;
2807}
2808
2809
Guido van Rossum96a42c81992-01-12 02:29:51 +00002810#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002812prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 if (PyObject_Print(v, stdout, 0) != 0)
2816 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002817 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002818 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002820#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822static void
Fred Drake5755ce62001-06-27 19:19:46 +00002823call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002824{
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002826 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002828 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 value = Py_None;
2830 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002831 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002833 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002834 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002835 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002836 }
Fred Drake5755ce62001-06-27 19:19:46 +00002837 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002839 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002841 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 Py_XDECREF(type);
2843 Py_XDECREF(value);
2844 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002845 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002846}
2847
Fred Drake4ec5d562001-10-04 19:26:43 +00002848static void
2849call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2850 int what)
2851{
2852 PyObject *type, *value, *traceback;
2853 int err;
2854 PyErr_Fetch(&type, &value, &traceback);
2855 err = call_trace(func, obj, frame, what, NULL);
2856 if (err == 0)
2857 PyErr_Restore(type, value, traceback);
2858 else {
2859 Py_XDECREF(type);
2860 Py_XDECREF(value);
2861 Py_XDECREF(traceback);
2862 }
2863}
2864
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002865static int
Fred Drake5755ce62001-06-27 19:19:46 +00002866call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2867 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002868{
Fred Drake5755ce62001-06-27 19:19:46 +00002869 register PyThreadState *tstate = frame->f_tstate;
2870 int result;
2871 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002872 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002873 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002874 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002875 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002876 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2877 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002878 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002879 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002880}
2881
Fred Drake5755ce62001-06-27 19:19:46 +00002882void
2883PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002884{
Fred Drake5755ce62001-06-27 19:19:46 +00002885 PyThreadState *tstate = PyThreadState_Get();
2886 PyObject *temp = tstate->c_profileobj;
2887 Py_XINCREF(arg);
2888 tstate->c_profilefunc = NULL;
2889 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002890 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002891 Py_XDECREF(temp);
2892 tstate->c_profilefunc = func;
2893 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002894 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002895}
2896
2897void
2898PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2899{
2900 PyThreadState *tstate = PyThreadState_Get();
2901 PyObject *temp = tstate->c_traceobj;
2902 Py_XINCREF(arg);
2903 tstate->c_tracefunc = NULL;
2904 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002905 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002906 Py_XDECREF(temp);
2907 tstate->c_tracefunc = func;
2908 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002909 tstate->use_tracing = ((func != NULL)
2910 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002911}
2912
Guido van Rossumb209a111997-04-29 18:18:01 +00002913PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002914PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002915{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002916 PyThreadState *tstate = PyThreadState_Get();
2917 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002918 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002919 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002920 else
2921 return current_frame->f_builtins;
2922}
2923
Guido van Rossumb209a111997-04-29 18:18:01 +00002924PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002926{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002927 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002928 if (current_frame == NULL)
2929 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002930 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002931 return current_frame->f_locals;
2932}
2933
Guido van Rossumb209a111997-04-29 18:18:01 +00002934PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002936{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002937 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002938 if (current_frame == NULL)
2939 return NULL;
2940 else
2941 return current_frame->f_globals;
2942}
2943
Guido van Rossumb209a111997-04-29 18:18:01 +00002944PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002945PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002946{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002947 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002948 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002949}
2950
Guido van Rossum6135a871995-01-09 17:53:26 +00002951int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002952PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002953{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002954 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002955 return current_frame == NULL ? 0 : current_frame->f_restricted;
2956}
2957
Guido van Rossumbe270261997-05-22 22:26:18 +00002958int
Tim Peters5ba58662001-07-16 02:29:45 +00002959PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002960{
2961 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002962 int result = 0;
2963
2964 if (current_frame != NULL) {
2965 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002966 const int compilerflags = codeflags & PyCF_MASK;
2967 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002968 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002969 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002970 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002971#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002972 if (codeflags & CO_GENERATOR_ALLOWED) {
2973 result = 1;
2974 cf->cf_flags |= CO_GENERATOR_ALLOWED;
2975 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002976#endif
Tim Peters5ba58662001-07-16 02:29:45 +00002977 }
2978 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002979}
2980
2981int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002982Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983{
Guido van Rossumb209a111997-04-29 18:18:01 +00002984 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002985 if (f == NULL)
2986 return 0;
2987 if (!PyFile_SoftSpace(f, 0))
2988 return 0;
2989 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990}
2991
Guido van Rossum3f5da241990-12-20 15:06:42 +00002992
Guido van Rossum681d79a1995-07-18 14:51:37 +00002993/* External interface to call any callable object.
2994 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002995
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002996#undef PyEval_CallObject
2997/* for backward compatibility: export this interface */
2998
Guido van Rossumb209a111997-04-29 18:18:01 +00002999PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003000PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003001{
Guido van Rossumb209a111997-04-29 18:18:01 +00003002 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003004#define PyEval_CallObject(func,arg) \
3005 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003006
Guido van Rossumb209a111997-04-29 18:18:01 +00003007PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003008PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003009{
Jeremy Hylton52820442001-01-03 23:52:36 +00003010 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003011
3012 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003013 arg = PyTuple_New(0);
3014 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003015 PyErr_SetString(PyExc_TypeError,
3016 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003017 return NULL;
3018 }
3019 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003021
Guido van Rossumb209a111997-04-29 18:18:01 +00003022 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003023 PyErr_SetString(PyExc_TypeError,
3024 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003025 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003026 return NULL;
3027 }
3028
Tim Peters6d6c1a32001-08-02 04:15:00 +00003029 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003030 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003031 return result;
3032}
3033
Tim Peters6d6c1a32001-08-02 04:15:00 +00003034char *
3035PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003036{
3037 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003038 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003039 else if (PyFunction_Check(func))
3040 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3041 else if (PyCFunction_Check(func))
3042 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3043 else if (PyClass_Check(func))
3044 return PyString_AsString(((PyClassObject*)func)->cl_name);
3045 else if (PyInstance_Check(func)) {
3046 return PyString_AsString(
3047 ((PyInstanceObject*)func)->in_class->cl_name);
3048 } else {
3049 return func->ob_type->tp_name;
3050 }
3051}
3052
Tim Peters6d6c1a32001-08-02 04:15:00 +00003053char *
3054PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003055{
3056 if (PyMethod_Check(func))
3057 return "()";
3058 else if (PyFunction_Check(func))
3059 return "()";
3060 else if (PyCFunction_Check(func))
3061 return "()";
3062 else if (PyClass_Check(func))
3063 return " constructor";
3064 else if (PyInstance_Check(func)) {
3065 return " instance";
3066 } else {
3067 return " object";
3068 }
3069}
3070
Jeremy Hylton52820442001-01-03 23:52:36 +00003071#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3072
3073/* The two fast_xxx() functions optimize calls for which no argument
3074 tuple is necessary; the objects are passed directly from the stack.
3075 fast_cfunction() is called for METH_OLDARGS functions.
3076 fast_function() is for functions with no special argument handling.
3077*/
3078
3079static PyObject *
3080fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3081{
3082 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3083 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003084 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003085
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003086 switch (flags) {
3087 case METH_OLDARGS:
3088 if (na == 0)
3089 return (*meth)(self, NULL);
3090 else if (na == 1) {
3091 PyObject *arg = EXT_POP(*pp_stack);
3092 PyObject *result = (*meth)(self, arg);
3093 Py_DECREF(arg);
3094 return result;
3095 } else {
3096 PyObject *args = load_args(pp_stack, na);
3097 PyObject *result = (*meth)(self, args);
3098 Py_DECREF(args);
3099 return result;
3100 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003101 case METH_NOARGS:
3102 if (na == 0)
3103 return (*meth)(self, NULL);
3104 PyErr_Format(PyExc_TypeError,
3105 "%.200s() takes no arguments (%d given)",
3106 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3107 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003108 case METH_O:
3109 if (na == 1) {
3110 PyObject *arg = EXT_POP(*pp_stack);
3111 PyObject *result = (*meth)(self, arg);
3112 Py_DECREF(arg);
3113 return result;
3114 }
3115 PyErr_Format(PyExc_TypeError,
3116 "%.200s() takes exactly one argument (%d given)",
3117 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3118 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003119 default:
3120 fprintf(stderr, "%.200s() flags = %d\n",
3121 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3122 PyErr_BadInternalCall();
3123 return NULL;
3124 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003125}
3126
3127static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003128fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003129{
3130 PyObject *co = PyFunction_GET_CODE(func);
3131 PyObject *globals = PyFunction_GET_GLOBALS(func);
3132 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003133 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003134 PyObject **d = NULL;
3135 int nd = 0;
3136
3137 if (argdefs != NULL) {
3138 d = &PyTuple_GET_ITEM(argdefs, 0);
3139 nd = ((PyTupleObject *)argdefs)->ob_size;
3140 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003141 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003142 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003143 (*pp_stack)-2*nk, nk, d, nd,
3144 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003145}
3146
3147static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003148update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3149 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003150{
3151 PyObject *kwdict = NULL;
3152 if (orig_kwdict == NULL)
3153 kwdict = PyDict_New();
3154 else {
3155 kwdict = PyDict_Copy(orig_kwdict);
3156 Py_DECREF(orig_kwdict);
3157 }
3158 if (kwdict == NULL)
3159 return NULL;
3160 while (--nk >= 0) {
3161 int err;
3162 PyObject *value = EXT_POP(*pp_stack);
3163 PyObject *key = EXT_POP(*pp_stack);
3164 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003165 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003166 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003167 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003168 PyEval_GetFuncName(func),
3169 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003170 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003171 Py_DECREF(key);
3172 Py_DECREF(value);
3173 Py_DECREF(kwdict);
3174 return NULL;
3175 }
3176 err = PyDict_SetItem(kwdict, key, value);
3177 Py_DECREF(key);
3178 Py_DECREF(value);
3179 if (err) {
3180 Py_DECREF(kwdict);
3181 return NULL;
3182 }
3183 }
3184 return kwdict;
3185}
3186
3187static PyObject *
3188update_star_args(int nstack, int nstar, PyObject *stararg,
3189 PyObject ***pp_stack)
3190{
3191 PyObject *callargs, *w;
3192
3193 callargs = PyTuple_New(nstack + nstar);
3194 if (callargs == NULL) {
3195 return NULL;
3196 }
3197 if (nstar) {
3198 int i;
3199 for (i = 0; i < nstar; i++) {
3200 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3201 Py_INCREF(a);
3202 PyTuple_SET_ITEM(callargs, nstack + i, a);
3203 }
3204 }
3205 while (--nstack >= 0) {
3206 w = EXT_POP(*pp_stack);
3207 PyTuple_SET_ITEM(callargs, nstack, w);
3208 }
3209 return callargs;
3210}
3211
3212static PyObject *
3213load_args(PyObject ***pp_stack, int na)
3214{
3215 PyObject *args = PyTuple_New(na);
3216 PyObject *w;
3217
3218 if (args == NULL)
3219 return NULL;
3220 while (--na >= 0) {
3221 w = EXT_POP(*pp_stack);
3222 PyTuple_SET_ITEM(args, na, w);
3223 }
3224 return args;
3225}
3226
3227static PyObject *
3228do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3229{
3230 PyObject *callargs = NULL;
3231 PyObject *kwdict = NULL;
3232 PyObject *result = NULL;
3233
3234 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003235 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003236 if (kwdict == NULL)
3237 goto call_fail;
3238 }
3239 callargs = load_args(pp_stack, na);
3240 if (callargs == NULL)
3241 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003242 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003243 call_fail:
3244 Py_XDECREF(callargs);
3245 Py_XDECREF(kwdict);
3246 return result;
3247}
3248
3249static PyObject *
3250ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3251{
3252 int nstar = 0;
3253 PyObject *callargs = NULL;
3254 PyObject *stararg = NULL;
3255 PyObject *kwdict = NULL;
3256 PyObject *result = NULL;
3257
3258 if (flags & CALL_FLAG_KW) {
3259 kwdict = EXT_POP(*pp_stack);
3260 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003261 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003262 "%s%s argument after ** "
3263 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003264 PyEval_GetFuncName(func),
3265 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003266 goto ext_call_fail;
3267 }
3268 }
3269 if (flags & CALL_FLAG_VAR) {
3270 stararg = EXT_POP(*pp_stack);
3271 if (!PyTuple_Check(stararg)) {
3272 PyObject *t = NULL;
3273 t = PySequence_Tuple(stararg);
3274 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003275 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3276 PyErr_Format(PyExc_TypeError,
3277 "%s%s argument after * "
3278 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003279 PyEval_GetFuncName(func),
3280 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003281 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003282 goto ext_call_fail;
3283 }
3284 Py_DECREF(stararg);
3285 stararg = t;
3286 }
3287 nstar = PyTuple_GET_SIZE(stararg);
3288 }
3289 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003290 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003291 if (kwdict == NULL)
3292 goto ext_call_fail;
3293 }
3294 callargs = update_star_args(na, nstar, stararg, pp_stack);
3295 if (callargs == NULL)
3296 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003297 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003298 ext_call_fail:
3299 Py_XDECREF(callargs);
3300 Py_XDECREF(kwdict);
3301 Py_XDECREF(stararg);
3302 return result;
3303}
3304
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003305#define SLICE_ERROR_MSG \
3306 "standard sequence type does not support step size other than one"
3307
Tim Peterscb479e72001-12-16 19:11:44 +00003308/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3309 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3310 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3311*/
Tim Petersb5196382001-12-16 19:44:20 +00003312/* Note: If v is NULL, return success without storing into *pi. This
3313 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3314 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003315*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003316int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003317_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318{
Tim Petersb5196382001-12-16 19:44:20 +00003319 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003320 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003321 if (PyInt_Check(v)) {
3322 x = PyInt_AsLong(v);
3323 } else if (PyLong_Check(v)) {
3324 x = PyLong_AsLong(v);
3325 if (x==-1 && PyErr_Occurred()) {
3326 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003327 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003328
Guido van Rossumac7be682001-01-17 15:42:30 +00003329 if (!PyErr_ExceptionMatches(
3330 PyExc_OverflowError)) {
3331 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003332 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003333 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003334 }
3335
Guido van Rossumac7be682001-01-17 15:42:30 +00003336 /* Clear the OverflowError */
3337 PyErr_Clear();
3338
3339 /* It's an overflow error, so we need to
3340 check the sign of the long integer,
3341 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003342 the error. */
3343
3344 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003345 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003346 if (long_zero == NULL)
3347 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003348
3349 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003350 cmp = PyObject_RichCompareBool(v, long_zero,
3351 Py_GT);
3352 Py_DECREF(long_zero);
3353 if (cmp < 0)
3354 return 0;
3355 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003356 x = INT_MAX;
3357 else
3358 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003359 }
3360 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003361 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003362 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003363 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003365 /* Truncate -- very long indices are truncated anyway */
3366 if (x > INT_MAX)
3367 x = INT_MAX;
3368 else if (x < -INT_MAX)
3369 x = 0;
3370 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003372 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003373}
3374
Guido van Rossum50d756e2001-08-18 17:43:36 +00003375#undef ISINT
3376#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3377
Guido van Rossumb209a111997-04-29 18:18:01 +00003378static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003379apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003381 PyTypeObject *tp = u->ob_type;
3382 PySequenceMethods *sq = tp->tp_as_sequence;
3383
3384 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3385 int ilow = 0, ihigh = INT_MAX;
3386 if (!_PyEval_SliceIndex(v, &ilow))
3387 return NULL;
3388 if (!_PyEval_SliceIndex(w, &ihigh))
3389 return NULL;
3390 return PySequence_GetSlice(u, ilow, ihigh);
3391 }
3392 else {
3393 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003394 if (slice != NULL) {
3395 PyObject *res = PyObject_GetItem(u, slice);
3396 Py_DECREF(slice);
3397 return res;
3398 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003399 else
3400 return NULL;
3401 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003403
3404static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003405assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3406 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003408 PyTypeObject *tp = u->ob_type;
3409 PySequenceMethods *sq = tp->tp_as_sequence;
3410
3411 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3412 int ilow = 0, ihigh = INT_MAX;
3413 if (!_PyEval_SliceIndex(v, &ilow))
3414 return -1;
3415 if (!_PyEval_SliceIndex(w, &ihigh))
3416 return -1;
3417 if (x == NULL)
3418 return PySequence_DelSlice(u, ilow, ihigh);
3419 else
3420 return PySequence_SetSlice(u, ilow, ihigh, x);
3421 }
3422 else {
3423 PyObject *slice = PySlice_New(v, w, NULL);
3424 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003425 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003426 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003427 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003428 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003429 res = PyObject_DelItem(u, slice);
3430 Py_DECREF(slice);
3431 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003432 }
3433 else
3434 return -1;
3435 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003436}
3437
Guido van Rossumb209a111997-04-29 18:18:01 +00003438static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003439cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440{
Guido van Rossumac7be682001-01-17 15:42:30 +00003441 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003443 case PyCmp_IS:
3444 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003445 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003446 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003447 res = !res;
3448 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003449 case PyCmp_IN:
3450 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003451 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003452 if (res < 0)
3453 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003454 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003455 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003457 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003458 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459 break;
3460 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003461 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003462 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003463 v = res ? Py_True : Py_False;
3464 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465 return v;
3466}
3467
Thomas Wouters52152252000-08-17 22:55:00 +00003468static PyObject *
3469import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003470{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003471 PyObject *x;
3472
3473 x = PyObject_GetAttr(v, name);
3474 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003475 PyErr_Format(PyExc_ImportError,
3476 "cannot import name %.230s",
3477 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003478 }
Thomas Wouters52152252000-08-17 22:55:00 +00003479 return x;
3480}
Guido van Rossumac7be682001-01-17 15:42:30 +00003481
Thomas Wouters52152252000-08-17 22:55:00 +00003482static int
3483import_all_from(PyObject *locals, PyObject *v)
3484{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003485 PyObject *all = PyObject_GetAttrString(v, "__all__");
3486 PyObject *dict, *name, *value;
3487 int skip_leading_underscores = 0;
3488 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003489
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003490 if (all == NULL) {
3491 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3492 return -1; /* Unexpected error */
3493 PyErr_Clear();
3494 dict = PyObject_GetAttrString(v, "__dict__");
3495 if (dict == NULL) {
3496 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3497 return -1;
3498 PyErr_SetString(PyExc_ImportError,
3499 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003500 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003501 }
3502 all = PyMapping_Keys(dict);
3503 Py_DECREF(dict);
3504 if (all == NULL)
3505 return -1;
3506 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003507 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003508
3509 for (pos = 0, err = 0; ; pos++) {
3510 name = PySequence_GetItem(all, pos);
3511 if (name == NULL) {
3512 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3513 err = -1;
3514 else
3515 PyErr_Clear();
3516 break;
3517 }
3518 if (skip_leading_underscores &&
3519 PyString_Check(name) &&
3520 PyString_AS_STRING(name)[0] == '_')
3521 {
3522 Py_DECREF(name);
3523 continue;
3524 }
3525 value = PyObject_GetAttr(v, name);
3526 if (value == NULL)
3527 err = -1;
3528 else
3529 err = PyDict_SetItem(locals, name, value);
3530 Py_DECREF(name);
3531 Py_XDECREF(value);
3532 if (err != 0)
3533 break;
3534 }
3535 Py_DECREF(all);
3536 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003537}
3538
Guido van Rossumb209a111997-04-29 18:18:01 +00003539static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003540build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003541{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003542 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003543
3544 if (PyDict_Check(methods))
3545 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003546 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003547 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003548 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3549 base = PyTuple_GET_ITEM(bases, 0);
3550 metaclass = PyObject_GetAttrString(base, "__class__");
3551 if (metaclass == NULL) {
3552 PyErr_Clear();
3553 metaclass = (PyObject *)base->ob_type;
3554 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003555 }
3556 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003557 else {
3558 PyObject *g = PyEval_GetGlobals();
3559 if (g != NULL && PyDict_Check(g))
3560 metaclass = PyDict_GetItemString(g, "__metaclass__");
3561 if (metaclass == NULL)
3562 metaclass = (PyObject *) &PyClass_Type;
3563 Py_INCREF(metaclass);
3564 }
3565 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3566 Py_DECREF(metaclass);
3567 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003568}
3569
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003570static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003571exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3572 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003573{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003574 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003575 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003576 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003577
Guido van Rossumb209a111997-04-29 18:18:01 +00003578 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3579 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003580 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003581 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003582 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003583 locals = PyTuple_GetItem(prog, 2);
3584 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003585 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003586 if (globals == Py_None) {
3587 globals = PyEval_GetGlobals();
3588 if (locals == Py_None) {
3589 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003590 plain = 1;
3591 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003592 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003593 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003594 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003595 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003596 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003597 !PyCode_Check(prog) &&
3598 !PyFile_Check(prog)) {
3599 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003600 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003601 return -1;
3602 }
Fred Drake661ea262000-10-24 19:57:45 +00003603 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003604 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003605 "exec: arg 2 must be a dictionary or None");
3606 return -1;
3607 }
3608 if (!PyDict_Check(locals)) {
3609 PyErr_SetString(PyExc_TypeError,
3610 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003611 return -1;
3612 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003613 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003614 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003615 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003616 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3617 PyErr_SetString(PyExc_TypeError,
3618 "code object passed to exec may not contain free variables");
3619 return -1;
3620 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003621 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003622 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003623 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003624 FILE *fp = PyFile_AsFile(prog);
3625 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003626 PyCompilerFlags cf;
3627 cf.cf_flags = 0;
3628 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003629 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3630 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003631 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003632 v = PyRun_File(fp, name, Py_file_input, globals,
3633 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003634 }
3635 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003636 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003637 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003638 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003639 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003640 cf.cf_flags = 0;
3641 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003642 v = PyRun_StringFlags(str, Py_file_input, globals,
3643 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003644 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003645 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003646 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003647 if (plain)
3648 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003649 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003650 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003651 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003652 return 0;
3653}
Guido van Rossum24c13741995-02-14 09:42:43 +00003654
Guido van Rossumac7be682001-01-17 15:42:30 +00003655static void
Paul Prescode68140d2000-08-30 20:25:01 +00003656format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3657{
3658 char *obj_str;
3659
3660 if (!obj)
3661 return;
3662
3663 obj_str = PyString_AsString(obj);
3664 if (!obj_str)
3665 return;
3666
3667 PyErr_Format(exc, format_str, obj_str);
3668}
Guido van Rossum950361c1997-01-24 13:49:28 +00003669
3670#ifdef DYNAMIC_EXECUTION_PROFILE
3671
Skip Montanarof118cb12001-10-15 20:51:38 +00003672static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003673getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003674{
3675 int i;
3676 PyObject *l = PyList_New(256);
3677 if (l == NULL) return NULL;
3678 for (i = 0; i < 256; i++) {
3679 PyObject *x = PyInt_FromLong(a[i]);
3680 if (x == NULL) {
3681 Py_DECREF(l);
3682 return NULL;
3683 }
3684 PyList_SetItem(l, i, x);
3685 }
3686 for (i = 0; i < 256; i++)
3687 a[i] = 0;
3688 return l;
3689}
3690
3691PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003692_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003693{
3694#ifndef DXPAIRS
3695 return getarray(dxp);
3696#else
3697 int i;
3698 PyObject *l = PyList_New(257);
3699 if (l == NULL) return NULL;
3700 for (i = 0; i < 257; i++) {
3701 PyObject *x = getarray(dxpairs[i]);
3702 if (x == NULL) {
3703 Py_DECREF(l);
3704 return NULL;
3705 }
3706 PyList_SetItem(l, i, x);
3707 }
3708 return l;
3709#endif
3710}
3711
3712#endif