blob: 5122c76fa4a4f145bf70d2bfdf46f3b32ab13837 [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
Neal Norwitza81d2202002-07-14 00:27:26 +0000524/* Tuple access macros */
525
526#ifndef Py_DEBUG
527#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
528#else
529#define GETITEM(v, i) PyTuple_GetItem((v), (i))
530#endif
531
Guido van Rossum374a9221991-04-04 10:40:29 +0000532/* Code access macros */
533
Neal Norwitza81d2202002-07-14 00:27:26 +0000534#define GETCONST(i) (GETITEM(co->co_consts, (i)))
535#define GETNAMEV(i) (GETITEM(co->co_names, (i)))
Guido van Rossumd076c731998-10-07 19:42:25 +0000536#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000537#define NEXTOP() (*next_instr++)
538#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000539#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000540#define JUMPBY(x) (next_instr += (x))
541
542/* Stack manipulation macros */
543
544#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
545#define EMPTY() (STACK_LEVEL() == 0)
546#define TOP() (stack_pointer[-1])
547#define BASIC_PUSH(v) (*stack_pointer++ = (v))
548#define BASIC_POP() (*--stack_pointer)
549
Guido van Rossum96a42c81992-01-12 02:29:51 +0000550#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000551#define PUSH(v) { (void)(BASIC_PUSH(v), \
552 lltrace && prtrace(TOP(), "push")); \
553 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000554#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000555#else
556#define PUSH(v) BASIC_PUSH(v)
557#define POP() BASIC_POP()
558#endif
559
Guido van Rossum681d79a1995-07-18 14:51:37 +0000560/* Local variable macros */
561
562#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000563
564/* The SETLOCAL() macro must not DECREF the local variable in-place and
565 then store the new value; it must copy the old value to a temporary
566 value, then store the new value, and then DECREF the temporary value.
567 This is because it is possible that during the DECREF the frame is
568 accessed by other code (e.g. a __del__ method or gc.collect()) and the
569 variable would be pointing to already-freed memory. */
570#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
571 GETLOCAL(i) = value; \
572 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000573
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574/* Start of code */
575
Tim Peters5ca576e2001-06-18 22:08:13 +0000576 if (f == NULL)
577 return NULL;
578
Guido van Rossum8861b741996-07-30 16:49:37 +0000579#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000580 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000581 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000582 return NULL;
583 }
584#endif
585
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000587 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000588 --tstate->recursion_depth;
589 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000590 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000591 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000592 return NULL;
593 }
594
Tim Peters5ca576e2001-06-18 22:08:13 +0000595 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000596 co = f->f_code;
597 fastlocals = f->f_localsplus;
598 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000599 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000600 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000601 stack_pointer = f->f_stacktop;
602 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000603 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000604
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000605 if (tstate->use_tracing) {
606 if (tstate->c_tracefunc != NULL) {
607 /* tstate->c_tracefunc, if defined, is a
608 function that will be called on *every* entry
609 to a code block. Its return value, if not
610 None, is a function that will be called at
611 the start of each executed line of code.
612 (Actually, the function must return itself
613 in order to continue tracing.) The trace
614 functions are called with three arguments:
615 a pointer to the current frame, a string
616 indicating why the function is called, and
617 an argument which depends on the situation.
618 The global trace function is also called
619 whenever an exception is detected. */
620 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
621 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000622 /* Trace function raised an error */
623 return NULL;
624 }
625 }
626 if (tstate->c_profilefunc != NULL) {
627 /* Similar for c_profilefunc, except it needn't
628 return itself and isn't called for "line" events */
629 if (call_trace(tstate->c_profilefunc,
630 tstate->c_profileobj,
631 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000632 /* Profile function raised an error */
633 return NULL;
634 }
635 }
636 }
637
Tim Peters5ca576e2001-06-18 22:08:13 +0000638#ifdef LLTRACE
639 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
640#endif
641#if defined(Py_DEBUG) || defined(LLTRACE)
642 filename = PyString_AsString(co->co_filename);
643#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000644
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 why = WHY_NOT;
646 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000647 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000648 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000649
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000651 assert(stack_pointer >= f->f_valuestack); /* else underflow */
652 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000653 /* Do periodic things. Doing this every time through
654 the loop would add too much overhead, so we do it
655 only every Nth instruction. We also do it if
656 ``things_to_do'' is set, i.e. when an asynchronous
657 event needs attention (e.g. a signal handler or
658 async I/O handler); see Py_AddPendingCall() and
659 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000660
Guido van Rossuma027efa1997-05-05 20:56:21 +0000661 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000662 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000663 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000664 if (Py_MakePendingCalls() < 0) {
665 why = WHY_EXCEPTION;
666 goto on_error;
667 }
668 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000669#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000670 /* If we have true signals, the signal handler
671 will call Py_AddPendingCall() so we don't
672 have to call sigcheck(). On the Mac and
673 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000674 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000676 goto on_error;
677 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000678#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679
Guido van Rossume59214e1994-08-30 08:01:59 +0000680#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681 if (interpreter_lock) {
682 /* Give another thread a chance */
683
Guido van Rossum25ce5661997-08-02 03:10:38 +0000684 if (PyThreadState_Swap(NULL) != tstate)
685 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000686 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000687
688 /* Other threads may run now */
689
Guido van Rossum65d5b571998-12-21 19:32:43 +0000690 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000691 if (PyThreadState_Swap(tstate) != NULL)
692 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000693 }
694#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000695 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000696
Neil Schemenauer63543862002-02-17 19:10:14 +0000697 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000699
Guido van Rossum408027e1996-12-30 16:17:54 +0000700#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000701 f->f_lasti = INSTR_OFFSET();
702#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000703
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 opcode = NEXTOP();
705 if (HAS_ARG(opcode))
706 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000707 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000708#ifdef DYNAMIC_EXECUTION_PROFILE
709#ifdef DXPAIRS
710 dxpairs[lastopcode][opcode]++;
711 lastopcode = opcode;
712#endif
713 dxp[opcode]++;
714#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000715
Guido van Rossum96a42c81992-01-12 02:29:51 +0000716#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum96a42c81992-01-12 02:29:51 +0000719 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 if (HAS_ARG(opcode)) {
721 printf("%d: %d, %d\n",
722 (int) (INSTR_OFFSET() - 3),
723 opcode, oparg);
724 }
725 else {
726 printf("%d: %d\n",
727 (int) (INSTR_OFFSET() - 1), opcode);
728 }
729 }
730#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000731 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000732
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000734
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 /* BEWARE!
736 It is essential that any operation that fails sets either
737 x to NULL, err to nonzero, or why to anything but WHY_NOT,
738 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000739
Guido van Rossum374a9221991-04-04 10:40:29 +0000740 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000741
Neil Schemenauer63543862002-02-17 19:10:14 +0000742 case SET_LINENO:
743#ifdef LLTRACE
744 if (lltrace)
745 printf("--- %s:%d \n", filename, oparg);
746#endif
747 f->f_lineno = oparg;
748 if (tstate->c_tracefunc == NULL || tstate->tracing)
749 goto fast_next_opcode;
750 /* Trace each line of code reached */
751 f->f_lasti = INSTR_OFFSET();
752 /* Inline call_trace() for performance: */
753 tstate->tracing++;
754 tstate->use_tracing = 0;
755 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
756 PyTrace_LINE, Py_None);
757 tstate->use_tracing = (tstate->c_tracefunc
758 || tstate->c_profilefunc);
759 tstate->tracing--;
760 break;
761
762 case LOAD_FAST:
763 x = GETLOCAL(oparg);
764 if (x != NULL) {
765 Py_INCREF(x);
766 PUSH(x);
767 goto fast_next_opcode;
768 }
769 format_exc_check_arg(PyExc_UnboundLocalError,
770 UNBOUNDLOCAL_ERROR_MSG,
771 PyTuple_GetItem(co->co_varnames, oparg));
772 break;
773
774 case LOAD_CONST:
775 x = GETCONST(oparg);
776 Py_INCREF(x);
777 PUSH(x);
778 goto fast_next_opcode;
779
780 case STORE_FAST:
781 v = POP();
782 SETLOCAL(oparg, v);
783 goto fast_next_opcode;
784
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 case POP_TOP:
786 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000787 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000788 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000789
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 case ROT_TWO:
791 v = POP();
792 w = POP();
793 PUSH(v);
794 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000795 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000796
Guido van Rossum374a9221991-04-04 10:40:29 +0000797 case ROT_THREE:
798 v = POP();
799 w = POP();
800 x = POP();
801 PUSH(v);
802 PUSH(x);
803 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000804 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000805
Thomas Wouters434d0822000-08-24 20:11:32 +0000806 case ROT_FOUR:
807 u = POP();
808 v = POP();
809 w = POP();
810 x = POP();
811 PUSH(u);
812 PUSH(x);
813 PUSH(w);
814 PUSH(v);
815 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000816
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 case DUP_TOP:
818 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000819 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000821 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000822
Thomas Wouters434d0822000-08-24 20:11:32 +0000823 case DUP_TOPX:
824 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000825 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000826 x = TOP();
827 Py_INCREF(x);
828 PUSH(x);
829 continue;
830 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000831 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000832 Py_INCREF(x);
833 w = TOP();
834 Py_INCREF(w);
835 PUSH(x);
836 PUSH(w);
837 PUSH(x);
838 continue;
839 case 3:
840 x = POP();
841 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000842 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000843 Py_INCREF(w);
844 v = TOP();
845 Py_INCREF(v);
846 PUSH(w);
847 PUSH(x);
848 PUSH(v);
849 PUSH(w);
850 PUSH(x);
851 continue;
852 case 4:
853 x = POP();
854 Py_INCREF(x);
855 w = POP();
856 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000857 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000858 Py_INCREF(v);
859 u = TOP();
860 Py_INCREF(u);
861 PUSH(v);
862 PUSH(w);
863 PUSH(x);
864 PUSH(u);
865 PUSH(v);
866 PUSH(w);
867 PUSH(x);
868 continue;
869 case 5:
870 x = POP();
871 Py_INCREF(x);
872 w = POP();
873 Py_INCREF(w);
874 v = POP();
875 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000876 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000877 Py_INCREF(u);
878 t = TOP();
879 Py_INCREF(t);
880 PUSH(u);
881 PUSH(v);
882 PUSH(w);
883 PUSH(x);
884 PUSH(t);
885 PUSH(u);
886 PUSH(v);
887 PUSH(w);
888 PUSH(x);
889 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000890 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000891 Py_FatalError("invalid argument to DUP_TOPX"
892 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000893 }
Tim Peters35ba6892000-10-11 07:04:49 +0000894 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000895
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 case UNARY_POSITIVE:
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000903
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 case UNARY_NEGATIVE:
905 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000906 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000909 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000911
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 case UNARY_NOT:
913 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000914 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000915 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000916 if (err == 0) {
917 Py_INCREF(Py_True);
918 PUSH(Py_True);
919 continue;
920 }
921 else if (err > 0) {
922 Py_INCREF(Py_False);
923 PUSH(Py_False);
924 err = 0;
925 continue;
926 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000928
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 case UNARY_CONVERT:
930 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000931 x = PyObject_Repr(v);
932 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000934 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000936
Guido van Rossum7928cd71991-10-24 14:59:31 +0000937 case UNARY_INVERT:
938 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000939 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000940 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000941 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000942 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000943 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000944
Guido van Rossum50564e81996-01-12 01:13:16 +0000945 case BINARY_POWER:
946 w = POP();
947 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000948 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000949 Py_DECREF(v);
950 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000951 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000952 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000953 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000954
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 case BINARY_MULTIPLY:
956 w = POP();
957 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000958 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(v);
960 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000962 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000964
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000966 if (!_Py_QnewFlag) {
967 w = POP();
968 v = POP();
969 x = PyNumber_Divide(v, w);
970 Py_DECREF(v);
971 Py_DECREF(w);
972 PUSH(x);
973 if (x != NULL) continue;
974 break;
975 }
976 /* -Qnew is in effect: fall through to
977 BINARY_TRUE_DIVIDE */
978 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 w = POP();
980 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000981 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_DECREF(v);
983 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000984 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000985 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000986 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000987
Guido van Rossum4668b002001-08-08 05:00:18 +0000988 case BINARY_FLOOR_DIVIDE:
989 w = POP();
990 v = POP();
991 x = PyNumber_FloorDivide(v, w);
992 Py_DECREF(v);
993 Py_DECREF(w);
994 PUSH(x);
995 if (x != NULL) continue;
996 break;
997
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 case BINARY_MODULO:
999 w = POP();
1000 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001001 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001002 Py_DECREF(v);
1003 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001004 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001005 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001007
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 case BINARY_ADD:
1009 w = POP();
1010 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001011 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001012 /* INLINE: int + int */
1013 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001014 a = PyInt_AS_LONG(v);
1015 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001016 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001017 if ((i^a) < 0 && (i^b) < 0)
1018 goto slow_add;
1019 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001020 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001021 else {
1022 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001023 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001024 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 Py_DECREF(v);
1026 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001028 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001030
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 case BINARY_SUBTRACT:
1032 w = POP();
1033 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001034 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001035 /* INLINE: int - int */
1036 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001037 a = PyInt_AS_LONG(v);
1038 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001039 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001040 if ((i^a) < 0 && (i^~b) < 0)
1041 goto slow_sub;
1042 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001043 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001044 else {
1045 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001046 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001047 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001048 Py_DECREF(v);
1049 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001051 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001053
Guido van Rossum374a9221991-04-04 10:40:29 +00001054 case BINARY_SUBSCR:
1055 w = POP();
1056 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001057 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001058 /* INLINE: list[int] */
1059 long i = PyInt_AsLong(w);
1060 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001061 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001062 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001063 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001064 PyErr_SetString(PyExc_IndexError,
1065 "list index out of range");
1066 x = NULL;
1067 }
1068 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001069 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001070 Py_INCREF(x);
1071 }
1072 }
1073 else
1074 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001075 Py_DECREF(v);
1076 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001078 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001079 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001080
Guido van Rossum7928cd71991-10-24 14:59:31 +00001081 case BINARY_LSHIFT:
1082 w = POP();
1083 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001084 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001085 Py_DECREF(v);
1086 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001087 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001088 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001089 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001090
Guido van Rossum7928cd71991-10-24 14:59:31 +00001091 case BINARY_RSHIFT:
1092 w = POP();
1093 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001094 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001095 Py_DECREF(v);
1096 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001097 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001098 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001099 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001100
Guido van Rossum7928cd71991-10-24 14:59:31 +00001101 case BINARY_AND:
1102 w = POP();
1103 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001104 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001105 Py_DECREF(v);
1106 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001107 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001108 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001109 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001110
Guido van Rossum7928cd71991-10-24 14:59:31 +00001111 case BINARY_XOR:
1112 w = POP();
1113 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001114 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001115 Py_DECREF(v);
1116 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001117 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001118 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001119 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001120
Guido van Rossum7928cd71991-10-24 14:59:31 +00001121 case BINARY_OR:
1122 w = POP();
1123 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001124 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001125 Py_DECREF(v);
1126 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001127 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001128 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001129 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001130
1131 case INPLACE_POWER:
1132 w = POP();
1133 v = POP();
1134 x = PyNumber_InPlacePower(v, w, Py_None);
1135 Py_DECREF(v);
1136 Py_DECREF(w);
1137 PUSH(x);
1138 if (x != NULL) continue;
1139 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001140
Thomas Wouters434d0822000-08-24 20:11:32 +00001141 case INPLACE_MULTIPLY:
1142 w = POP();
1143 v = POP();
1144 x = PyNumber_InPlaceMultiply(v, w);
1145 Py_DECREF(v);
1146 Py_DECREF(w);
1147 PUSH(x);
1148 if (x != NULL) continue;
1149 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001150
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001152 if (!_Py_QnewFlag) {
1153 w = POP();
1154 v = POP();
1155 x = PyNumber_InPlaceDivide(v, w);
1156 Py_DECREF(v);
1157 Py_DECREF(w);
1158 PUSH(x);
1159 if (x != NULL) continue;
1160 break;
1161 }
1162 /* -Qnew is in effect: fall through to
1163 INPLACE_TRUE_DIVIDE */
1164 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001165 w = POP();
1166 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001167 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 Py_DECREF(v);
1169 Py_DECREF(w);
1170 PUSH(x);
1171 if (x != NULL) continue;
1172 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001173
Guido van Rossum4668b002001-08-08 05:00:18 +00001174 case INPLACE_FLOOR_DIVIDE:
1175 w = POP();
1176 v = POP();
1177 x = PyNumber_InPlaceFloorDivide(v, w);
1178 Py_DECREF(v);
1179 Py_DECREF(w);
1180 PUSH(x);
1181 if (x != NULL) continue;
1182 break;
1183
Thomas Wouters434d0822000-08-24 20:11:32 +00001184 case INPLACE_MODULO:
1185 w = POP();
1186 v = POP();
1187 x = PyNumber_InPlaceRemainder(v, w);
1188 Py_DECREF(v);
1189 Py_DECREF(w);
1190 PUSH(x);
1191 if (x != NULL) continue;
1192 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001193
Thomas Wouters434d0822000-08-24 20:11:32 +00001194 case INPLACE_ADD:
1195 w = POP();
1196 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001197 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001198 /* INLINE: int + int */
1199 register long a, b, i;
1200 a = PyInt_AS_LONG(v);
1201 b = PyInt_AS_LONG(w);
1202 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001203 if ((i^a) < 0 && (i^b) < 0)
1204 goto slow_iadd;
1205 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001206 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001207 else {
1208 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001209 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001210 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001211 Py_DECREF(v);
1212 Py_DECREF(w);
1213 PUSH(x);
1214 if (x != NULL) continue;
1215 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001216
Thomas Wouters434d0822000-08-24 20:11:32 +00001217 case INPLACE_SUBTRACT:
1218 w = POP();
1219 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001220 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001221 /* INLINE: int - int */
1222 register long a, b, i;
1223 a = PyInt_AS_LONG(v);
1224 b = PyInt_AS_LONG(w);
1225 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001226 if ((i^a) < 0 && (i^~b) < 0)
1227 goto slow_isub;
1228 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001229 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001230 else {
1231 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001232 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001233 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001234 Py_DECREF(v);
1235 Py_DECREF(w);
1236 PUSH(x);
1237 if (x != NULL) continue;
1238 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001239
Thomas Wouters434d0822000-08-24 20:11:32 +00001240 case INPLACE_LSHIFT:
1241 w = POP();
1242 v = POP();
1243 x = PyNumber_InPlaceLshift(v, w);
1244 Py_DECREF(v);
1245 Py_DECREF(w);
1246 PUSH(x);
1247 if (x != NULL) continue;
1248 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001249
Thomas Wouters434d0822000-08-24 20:11:32 +00001250 case INPLACE_RSHIFT:
1251 w = POP();
1252 v = POP();
1253 x = PyNumber_InPlaceRshift(v, w);
1254 Py_DECREF(v);
1255 Py_DECREF(w);
1256 PUSH(x);
1257 if (x != NULL) continue;
1258 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001259
Thomas Wouters434d0822000-08-24 20:11:32 +00001260 case INPLACE_AND:
1261 w = POP();
1262 v = POP();
1263 x = PyNumber_InPlaceAnd(v, w);
1264 Py_DECREF(v);
1265 Py_DECREF(w);
1266 PUSH(x);
1267 if (x != NULL) continue;
1268 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001269
Thomas Wouters434d0822000-08-24 20:11:32 +00001270 case INPLACE_XOR:
1271 w = POP();
1272 v = POP();
1273 x = PyNumber_InPlaceXor(v, w);
1274 Py_DECREF(v);
1275 Py_DECREF(w);
1276 PUSH(x);
1277 if (x != NULL) continue;
1278 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001279
Thomas Wouters434d0822000-08-24 20:11:32 +00001280 case INPLACE_OR:
1281 w = POP();
1282 v = POP();
1283 x = PyNumber_InPlaceOr(v, w);
1284 Py_DECREF(v);
1285 Py_DECREF(w);
1286 PUSH(x);
1287 if (x != NULL) continue;
1288 break;
1289
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 case SLICE+0:
1291 case SLICE+1:
1292 case SLICE+2:
1293 case SLICE+3:
1294 if ((opcode-SLICE) & 2)
1295 w = POP();
1296 else
1297 w = NULL;
1298 if ((opcode-SLICE) & 1)
1299 v = POP();
1300 else
1301 v = NULL;
1302 u = POP();
1303 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 Py_DECREF(u);
1305 Py_XDECREF(v);
1306 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001308 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001310
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 case STORE_SLICE+0:
1312 case STORE_SLICE+1:
1313 case STORE_SLICE+2:
1314 case STORE_SLICE+3:
1315 if ((opcode-STORE_SLICE) & 2)
1316 w = POP();
1317 else
1318 w = NULL;
1319 if ((opcode-STORE_SLICE) & 1)
1320 v = POP();
1321 else
1322 v = NULL;
1323 u = POP();
1324 t = POP();
1325 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001326 Py_DECREF(t);
1327 Py_DECREF(u);
1328 Py_XDECREF(v);
1329 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001330 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001332
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 case DELETE_SLICE+0:
1334 case DELETE_SLICE+1:
1335 case DELETE_SLICE+2:
1336 case DELETE_SLICE+3:
1337 if ((opcode-DELETE_SLICE) & 2)
1338 w = POP();
1339 else
1340 w = NULL;
1341 if ((opcode-DELETE_SLICE) & 1)
1342 v = POP();
1343 else
1344 v = NULL;
1345 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001348 Py_DECREF(u);
1349 Py_XDECREF(v);
1350 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001351 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001353
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 case STORE_SUBSCR:
1355 w = POP();
1356 v = POP();
1357 u = POP();
1358 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001359 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 Py_DECREF(u);
1361 Py_DECREF(v);
1362 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001363 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001365
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 case DELETE_SUBSCR:
1367 w = POP();
1368 v = POP();
1369 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001370 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 Py_DECREF(v);
1372 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001373 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001375
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 case PRINT_EXPR:
1377 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001378 w = PySys_GetObject("displayhook");
1379 if (w == NULL) {
1380 PyErr_SetString(PyExc_RuntimeError,
1381 "lost sys.displayhook");
1382 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001383 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001384 }
1385 if (err == 0) {
1386 x = Py_BuildValue("(O)", v);
1387 if (x == NULL)
1388 err = -1;
1389 }
1390 if (err == 0) {
1391 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001392 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001393 if (w == NULL)
1394 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001397 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001399
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001400 case PRINT_ITEM_TO:
1401 w = stream = POP();
1402 /* fall through to PRINT_ITEM */
1403
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 case PRINT_ITEM:
1405 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001406 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001407 w = PySys_GetObject("stdout");
1408 if (w == NULL) {
1409 PyErr_SetString(PyExc_RuntimeError,
1410 "lost sys.stdout");
1411 err = -1;
1412 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001413 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001414 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001415 err = PyFile_WriteString(" ", w);
1416 if (err == 0)
1417 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001418 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001419 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001420 if (PyString_Check(v)) {
1421 char *s = PyString_AS_STRING(v);
1422 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001423 if (len == 0 ||
1424 !isspace(Py_CHARMASK(s[len-1])) ||
1425 s[len-1] == ' ')
1426 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001427 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001428#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001429 else if (PyUnicode_Check(v)) {
1430 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1431 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001432 if (len == 0 ||
1433 !Py_UNICODE_ISSPACE(s[len-1]) ||
1434 s[len-1] == ' ')
1435 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001436 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001437#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001438 else
1439 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001441 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001442 Py_XDECREF(stream);
1443 stream = NULL;
1444 if (err == 0)
1445 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001447
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001448 case PRINT_NEWLINE_TO:
1449 w = stream = POP();
1450 /* fall through to PRINT_NEWLINE */
1451
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001453 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001454 w = PySys_GetObject("stdout");
1455 if (w == NULL)
1456 PyErr_SetString(PyExc_RuntimeError,
1457 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001458 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001459 if (w != NULL) {
1460 err = PyFile_WriteString("\n", w);
1461 if (err == 0)
1462 PyFile_SoftSpace(w, 0);
1463 }
1464 Py_XDECREF(stream);
1465 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001467
Thomas Wouters434d0822000-08-24 20:11:32 +00001468
1469#ifdef CASE_TOO_BIG
1470 default: switch (opcode) {
1471#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 case BREAK_LOOP:
1473 why = WHY_BREAK;
1474 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001475
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001476 case CONTINUE_LOOP:
1477 retval = PyInt_FromLong(oparg);
1478 why = WHY_CONTINUE;
1479 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480
Guido van Rossumf10570b1995-07-07 22:53:21 +00001481 case RAISE_VARARGS:
1482 u = v = w = NULL;
1483 switch (oparg) {
1484 case 3:
1485 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001486 /* Fallthrough */
1487 case 2:
1488 v = POP(); /* value */
1489 /* Fallthrough */
1490 case 1:
1491 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001492 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001493 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001494 break;
1495 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001497 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001498 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001499 break;
1500 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001502
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001505 PyErr_SetString(PyExc_SystemError,
1506 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001507 break;
1508 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001510 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001512
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 case RETURN_VALUE:
1514 retval = POP();
1515 why = WHY_RETURN;
1516 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001517
Tim Peters5ca576e2001-06-18 22:08:13 +00001518 case YIELD_VALUE:
1519 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001520 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001521 f->f_lasti = INSTR_OFFSET();
1522 why = WHY_YIELD;
1523 break;
1524
1525
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001526 case EXEC_STMT:
1527 w = POP();
1528 v = POP();
1529 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001530 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 Py_DECREF(u);
1532 Py_DECREF(v);
1533 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001534 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001535
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 case POP_BLOCK:
1537 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 while (STACK_LEVEL() > b->b_level) {
1540 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 }
1543 }
1544 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001545
Guido van Rossum374a9221991-04-04 10:40:29 +00001546 case END_FINALLY:
1547 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001548 if (PyInt_Check(v)) {
1549 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001550 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001551 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001552 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 retval = POP();
1554 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001557 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001558 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001560 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 else if (v != Py_None) {
1563 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 "'finally' pops bad exception");
1565 why = WHY_EXCEPTION;
1566 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001567 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001569
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001571 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001573 w = POP();
1574 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 Py_DECREF(u);
1577 Py_DECREF(v);
1578 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001580
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 case STORE_NAME:
1582 w = GETNAMEV(oparg);
1583 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001585 PyErr_Format(PyExc_SystemError,
1586 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001587 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 break;
1589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 err = PyDict_SetItem(x, w, v);
1591 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001593
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001595 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001596 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001597 PyErr_Format(PyExc_SystemError,
1598 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001599 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 break;
1601 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001603 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001604 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001606
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001607 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001609 if (PyTuple_Check(v)) {
1610 if (PyTuple_Size(v) != oparg) {
1611 PyErr_SetString(PyExc_ValueError,
1612 "unpack tuple of wrong size");
1613 why = WHY_EXCEPTION;
1614 }
1615 else {
1616 for (; --oparg >= 0; ) {
1617 w = PyTuple_GET_ITEM(v, oparg);
1618 Py_INCREF(w);
1619 PUSH(w);
1620 }
1621 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001622 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001623 else if (PyList_Check(v)) {
1624 if (PyList_Size(v) != oparg) {
1625 PyErr_SetString(PyExc_ValueError,
1626 "unpack list of wrong size");
1627 why = WHY_EXCEPTION;
1628 }
1629 else {
1630 for (; --oparg >= 0; ) {
1631 w = PyList_GET_ITEM(v, oparg);
1632 Py_INCREF(w);
1633 PUSH(w);
1634 }
1635 }
1636 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001637 else if (unpack_iterable(v, oparg,
1638 stack_pointer + oparg))
1639 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001640 else {
1641 if (PyErr_ExceptionMatches(PyExc_TypeError))
1642 PyErr_SetString(PyExc_TypeError,
1643 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001644 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001645 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001647 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001648
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001650 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 v = POP();
1652 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1654 Py_DECREF(v);
1655 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001657
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001659 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001661 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1662 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001665
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001666 case STORE_GLOBAL:
1667 w = GETNAMEV(oparg);
1668 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 err = PyDict_SetItem(f->f_globals, w, v);
1670 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001671 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001672
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001673 case DELETE_GLOBAL:
1674 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001676 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001677 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001678 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001679
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001681 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001682 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001683 PyErr_Format(PyExc_SystemError,
1684 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001685 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001686 break;
1687 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001690 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001692 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001694 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001695 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001696 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 break;
1698 }
1699 }
1700 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001701 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 PUSH(x);
1703 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001704
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001706 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001707 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001709 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001711 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001712 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001713 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 break;
1715 }
1716 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001717 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 PUSH(x);
1719 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001720
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001721 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001722 x = GETLOCAL(oparg);
1723 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001724 format_exc_check_arg(
1725 PyExc_UnboundLocalError,
1726 UNBOUNDLOCAL_ERROR_MSG,
1727 PyTuple_GetItem(co->co_varnames, oparg)
1728 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001729 break;
1730 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001731 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001732 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001733
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001734 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001735 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001736 Py_INCREF(x);
1737 PUSH(x);
1738 break;
1739
1740 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001741 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001742 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001743 if (w == NULL) {
Jeremy Hylton76c81ee2002-07-11 16:56:38 +00001744 err = -1;
1745 /* Don't stomp existing exception */
1746 if (PyErr_Occurred())
1747 break;
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001748 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001749 v = PyTuple_GetItem(co->co_cellvars,
1750 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001751 format_exc_check_arg(
1752 PyExc_UnboundLocalError,
1753 UNBOUNDLOCAL_ERROR_MSG,
1754 v);
1755 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001756 v = PyTuple_GetItem(
1757 co->co_freevars,
1758 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001759 format_exc_check_arg(
1760 PyExc_NameError,
1761 UNBOUNDFREE_ERROR_MSG,
1762 v);
1763 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001764 break;
1765 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001766 PUSH(w);
1767 break;
1768
1769 case STORE_DEREF:
1770 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001771 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001772 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001773 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001774 continue;
1775
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001777 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 if (x != NULL) {
1779 for (; --oparg >= 0;) {
1780 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001781 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 }
1783 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001784 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 }
1786 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001787
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001789 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 if (x != NULL) {
1791 for (; --oparg >= 0;) {
1792 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001793 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 }
1795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001796 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 }
1798 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001799
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001801 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001803 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001807 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001809 x = PyObject_GetAttr(v, w);
1810 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001812 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001814
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 case COMPARE_OP:
1816 w = POP();
1817 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001818 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001819 /* INLINE: cmp(int, int) */
1820 register long a, b;
1821 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001822 a = PyInt_AS_LONG(v);
1823 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001824 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001825 case PyCmp_LT: res = a < b; break;
1826 case PyCmp_LE: res = a <= b; break;
1827 case PyCmp_EQ: res = a == b; break;
1828 case PyCmp_NE: res = a != b; break;
1829 case PyCmp_GT: res = a > b; break;
1830 case PyCmp_GE: res = a >= b; break;
1831 case PyCmp_IS: res = v == w; break;
1832 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001833 default: goto slow_compare;
1834 }
1835 x = res ? Py_True : Py_False;
1836 Py_INCREF(x);
1837 }
1838 else {
1839 slow_compare:
1840 x = cmp_outcome(oparg, v, w);
1841 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001842 Py_DECREF(v);
1843 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001845 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001847
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001849 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001850 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001851 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001853 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001854 break;
1855 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001856 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001857 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001858 w,
1859 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001860 f->f_locals == NULL ?
1861 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001862 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864 if (w == NULL) {
1865 x = NULL;
1866 break;
1867 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 x = PyEval_CallObject(x, w);
1869 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001871 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001873
Thomas Wouters52152252000-08-17 22:55:00 +00001874 case IMPORT_STAR:
1875 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001877 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001878 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001879 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001880 break;
1881 }
Thomas Wouters52152252000-08-17 22:55:00 +00001882 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001883 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001884 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001885 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001886 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001887
Thomas Wouters52152252000-08-17 22:55:00 +00001888 case IMPORT_FROM:
1889 w = GETNAMEV(oparg);
1890 v = TOP();
1891 x = import_from(v, w);
1892 PUSH(x);
1893 if (x != NULL) continue;
1894 break;
1895
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 case JUMP_FORWARD:
1897 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001898 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001899
Guido van Rossum374a9221991-04-04 10:40:29 +00001900 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001901 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001902 if (err > 0)
1903 err = 0;
1904 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001905 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001906 else
1907 break;
1908 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001909
Guido van Rossum374a9221991-04-04 10:40:29 +00001910 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001911 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001912 if (err > 0) {
1913 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001914 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001915 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001916 else if (err == 0)
1917 ;
1918 else
1919 break;
1920 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001921
Guido van Rossum374a9221991-04-04 10:40:29 +00001922 case JUMP_ABSOLUTE:
1923 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001924 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001925
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001926 case GET_ITER:
1927 /* before: [obj]; after [getiter(obj)] */
1928 v = POP();
1929 x = PyObject_GetIter(v);
1930 Py_DECREF(v);
1931 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001932 PUSH(x);
1933 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001934 }
1935 break;
1936
1937 case FOR_ITER:
1938 /* before: [iter]; after: [iter, iter()] *or* [] */
1939 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001940 x = PyIter_Next(v);
1941 if (x != NULL) {
1942 PUSH(x);
1943 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001944 }
Tim Petersf4848da2001-05-05 00:14:56 +00001945 if (!PyErr_Occurred()) {
1946 /* iterator ended normally */
1947 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001948 Py_DECREF(v);
1949 JUMPBY(oparg);
1950 continue;
1951 }
1952 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001953
Guido van Rossum374a9221991-04-04 10:40:29 +00001954 case SETUP_LOOP:
1955 case SETUP_EXCEPT:
1956 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001957 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001958 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001959 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001960
Guido van Rossumf10570b1995-07-07 22:53:21 +00001961 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001962 {
1963 int na = oparg & 0xff;
1964 int nk = (oparg>>8) & 0xff;
1965 int n = na + 2 * nk;
1966 PyObject **pfunc = stack_pointer - n - 1;
1967 PyObject *func = *pfunc;
1968 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1969
1970 /* Always dispatch PyCFunction first, because
1971 these are presumed to be the most frequent
1972 callable object.
1973 */
1974 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001975 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001976 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001977 x = do_call(func, &stack_pointer,
1978 na, nk);
1979 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001980 PyObject *callargs;
1981 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001982 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001983 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001984 } else
1985 x = fast_cfunction(func,
1986 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001987 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001988 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001989 && PyMethod_GET_SELF(func) != NULL) {
1990 /* optimize access to bound methods */
1991 PyObject *self = PyMethod_GET_SELF(func);
1992 Py_INCREF(self);
1993 func = PyMethod_GET_FUNCTION(func);
1994 Py_INCREF(func);
1995 Py_DECREF(*pfunc);
1996 *pfunc = self;
1997 na++;
1998 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001999 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002000 Py_INCREF(func);
2001 if (PyFunction_Check(func)) {
2002 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002003 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002004 } else {
2005 x = do_call(func, &stack_pointer,
2006 na, nk);
2007 }
2008 Py_DECREF(func);
2009 }
2010
2011 while (stack_pointer > pfunc) {
2012 w = POP();
2013 Py_DECREF(w);
2014 }
2015 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002016 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002017 continue;
2018 break;
2019 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002020
Jeremy Hylton76901512000-03-28 23:49:17 +00002021 case CALL_FUNCTION_VAR:
2022 case CALL_FUNCTION_KW:
2023 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002024 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002025 int na = oparg & 0xff;
2026 int nk = (oparg>>8) & 0xff;
2027 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002028 int n = na + 2 * nk;
2029 PyObject **pfunc, *func;
2030 if (flags & CALL_FLAG_VAR)
2031 n++;
2032 if (flags & CALL_FLAG_KW)
2033 n++;
2034 pfunc = stack_pointer - n - 1;
2035 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002036 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002037
Guido van Rossumac7be682001-01-17 15:42:30 +00002038 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002039 && PyMethod_GET_SELF(func) != NULL) {
2040 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002041 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002042 func = PyMethod_GET_FUNCTION(func);
2043 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002044 Py_DECREF(*pfunc);
2045 *pfunc = self;
2046 na++;
2047 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002048 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002049 Py_INCREF(func);
2050 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002051 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002052
Jeremy Hylton76901512000-03-28 23:49:17 +00002053 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002054 w = POP();
2055 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002056 }
2057 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002058 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002059 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002060 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002061 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002062
Guido van Rossum681d79a1995-07-18 14:51:37 +00002063 case MAKE_FUNCTION:
2064 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002065 x = PyFunction_New(v, f->f_globals);
2066 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002067 /* XXX Maybe this should be a separate opcode? */
2068 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002069 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002070 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002072 x = NULL;
2073 break;
2074 }
2075 while (--oparg >= 0) {
2076 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002078 }
2079 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002081 }
2082 PUSH(x);
2083 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002084
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002085 case MAKE_CLOSURE:
2086 {
2087 int nfree;
2088 v = POP(); /* code object */
2089 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002090 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002091 Py_DECREF(v);
2092 /* XXX Maybe this should be a separate opcode? */
2093 if (x != NULL && nfree > 0) {
2094 v = PyTuple_New(nfree);
2095 if (v == NULL) {
2096 Py_DECREF(x);
2097 x = NULL;
2098 break;
2099 }
2100 while (--nfree >= 0) {
2101 w = POP();
2102 PyTuple_SET_ITEM(v, nfree, w);
2103 }
2104 err = PyFunction_SetClosure(x, v);
2105 Py_DECREF(v);
2106 }
2107 if (x != NULL && oparg > 0) {
2108 v = PyTuple_New(oparg);
2109 if (v == NULL) {
2110 Py_DECREF(x);
2111 x = NULL;
2112 break;
2113 }
2114 while (--oparg >= 0) {
2115 w = POP();
2116 PyTuple_SET_ITEM(v, oparg, w);
2117 }
2118 err = PyFunction_SetDefaults(x, v);
2119 Py_DECREF(v);
2120 }
2121 PUSH(x);
2122 break;
2123 }
2124
Guido van Rossum8861b741996-07-30 16:49:37 +00002125 case BUILD_SLICE:
2126 if (oparg == 3)
2127 w = POP();
2128 else
2129 w = NULL;
2130 v = POP();
2131 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002132 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 Py_DECREF(u);
2134 Py_DECREF(v);
2135 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002136 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002137 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002138 break;
2139
Fred Drakeef8ace32000-08-24 00:32:09 +00002140 case EXTENDED_ARG:
2141 opcode = NEXTOP();
2142 oparg = oparg<<16 | NEXTARG();
2143 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002144
Guido van Rossum374a9221991-04-04 10:40:29 +00002145 default:
2146 fprintf(stderr,
2147 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002148 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002149 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 why = WHY_EXCEPTION;
2151 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002152
2153#ifdef CASE_TOO_BIG
2154 }
2155#endif
2156
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 } /* switch */
2158
2159 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002160
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002162
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002164 if (err == 0 && x != NULL) {
2165#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002166 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002168 fprintf(stderr,
2169 "XXX undetected error\n");
2170 else
2171#endif
2172 continue; /* Normal, fast path */
2173 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002175 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002176 err = 0;
2177 }
2178
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002180
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002182 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002183 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002184 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 why = WHY_EXCEPTION;
2186 }
2187 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002188#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002189 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002190 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002192 fprintf(stderr,
2193 "XXX undetected error (why=%d)\n",
2194 why);
2195 why = WHY_EXCEPTION;
2196 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 }
2198#endif
2199
2200 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002201
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002203 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002205 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002207
Fred Drake8f51f542001-10-04 14:48:42 +00002208 if (tstate->c_tracefunc != NULL)
2209 call_exc_trace(tstate->c_tracefunc,
2210 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002211 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002212
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002214
Guido van Rossum374a9221991-04-04 10:40:29 +00002215 if (why == WHY_RERAISE)
2216 why = WHY_EXCEPTION;
2217
2218 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002219
Tim Peters5ca576e2001-06-18 22:08:13 +00002220 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002222
2223 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2224 /* For a continue inside a try block,
2225 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002226 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2227 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002228 why = WHY_NOT;
2229 JUMPTO(PyInt_AS_LONG(retval));
2230 Py_DECREF(retval);
2231 break;
2232 }
2233
Guido van Rossum374a9221991-04-04 10:40:29 +00002234 while (STACK_LEVEL() > b->b_level) {
2235 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002236 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002237 }
2238 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2239 why = WHY_NOT;
2240 JUMPTO(b->b_handler);
2241 break;
2242 }
2243 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002244 (b->b_type == SETUP_EXCEPT &&
2245 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002247 PyObject *exc, *val, *tb;
2248 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002249 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002250 val = Py_None;
2251 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002252 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 /* Make the raw exception data
2254 available to the handler,
2255 so a program can emulate the
2256 Python main loop. Don't do
2257 this for 'finally'. */
2258 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002259 PyErr_NormalizeException(
2260 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002261 set_exc_info(tstate,
2262 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002263 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002264 if (tb == NULL) {
2265 Py_INCREF(Py_None);
2266 PUSH(Py_None);
2267 } else
2268 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002269 PUSH(val);
2270 PUSH(exc);
2271 }
2272 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002273 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002274 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002275 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002276 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002277 PUSH(v);
2278 }
2279 why = WHY_NOT;
2280 JUMPTO(b->b_handler);
2281 break;
2282 }
2283 } /* unwind stack */
2284
2285 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002286
Guido van Rossum374a9221991-04-04 10:40:29 +00002287 if (why != WHY_NOT)
2288 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002289
Guido van Rossum374a9221991-04-04 10:40:29 +00002290 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002291
Guido van Rossum35974fb2001-12-06 21:28:18 +00002292 if (why != WHY_YIELD) {
2293 /* Pop remaining stack entries -- but when yielding */
2294 while (!EMPTY()) {
2295 v = POP();
2296 Py_XDECREF(v);
2297 }
2298 }
2299
Tim Peters5ca576e2001-06-18 22:08:13 +00002300 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002301 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002302
Fred Drake9e3ad782001-07-03 23:39:52 +00002303 if (tstate->use_tracing) {
2304 if (tstate->c_tracefunc
2305 && (why == WHY_RETURN || why == WHY_YIELD)) {
2306 if (call_trace(tstate->c_tracefunc,
2307 tstate->c_traceobj, f,
2308 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002310 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002311 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002312 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002313 }
Fred Drake8f51f542001-10-04 14:48:42 +00002314 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002315 if (why == WHY_EXCEPTION)
2316 call_trace_protected(tstate->c_profilefunc,
2317 tstate->c_profileobj, f,
2318 PyTrace_RETURN);
2319 else if (call_trace(tstate->c_profilefunc,
2320 tstate->c_profileobj, f,
2321 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002322 Py_XDECREF(retval);
2323 retval = NULL;
2324 why = WHY_EXCEPTION;
2325 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002326 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002327 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002328
Guido van Rossuma027efa1997-05-05 20:56:21 +00002329 reset_exc_info(tstate);
2330
Tim Peters5ca576e2001-06-18 22:08:13 +00002331 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002332 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002333 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002334
Guido van Rossum96a42c81992-01-12 02:29:51 +00002335 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002336}
2337
Tim Peters6d6c1a32001-08-02 04:15:00 +00002338PyObject *
2339PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002340 PyObject **args, int argcount, PyObject **kws, int kwcount,
2341 PyObject **defs, int defcount, PyObject *closure)
2342{
2343 register PyFrameObject *f;
2344 register PyObject *retval = NULL;
2345 register PyObject **fastlocals, **freevars;
2346 PyThreadState *tstate = PyThreadState_GET();
2347 PyObject *x, *u;
2348
2349 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002350 PyErr_SetString(PyExc_SystemError,
2351 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002352 return NULL;
2353 }
2354
2355 f = PyFrame_New(tstate, /*back*/
2356 co, /*code*/
2357 globals, locals);
2358 if (f == NULL)
2359 return NULL;
2360
2361 fastlocals = f->f_localsplus;
2362 freevars = f->f_localsplus + f->f_nlocals;
2363
2364 if (co->co_argcount > 0 ||
2365 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2366 int i;
2367 int n = argcount;
2368 PyObject *kwdict = NULL;
2369 if (co->co_flags & CO_VARKEYWORDS) {
2370 kwdict = PyDict_New();
2371 if (kwdict == NULL)
2372 goto fail;
2373 i = co->co_argcount;
2374 if (co->co_flags & CO_VARARGS)
2375 i++;
2376 SETLOCAL(i, kwdict);
2377 }
2378 if (argcount > co->co_argcount) {
2379 if (!(co->co_flags & CO_VARARGS)) {
2380 PyErr_Format(PyExc_TypeError,
2381 "%.200s() takes %s %d "
2382 "%sargument%s (%d given)",
2383 PyString_AsString(co->co_name),
2384 defcount ? "at most" : "exactly",
2385 co->co_argcount,
2386 kwcount ? "non-keyword " : "",
2387 co->co_argcount == 1 ? "" : "s",
2388 argcount);
2389 goto fail;
2390 }
2391 n = co->co_argcount;
2392 }
2393 for (i = 0; i < n; i++) {
2394 x = args[i];
2395 Py_INCREF(x);
2396 SETLOCAL(i, x);
2397 }
2398 if (co->co_flags & CO_VARARGS) {
2399 u = PyTuple_New(argcount - n);
2400 if (u == NULL)
2401 goto fail;
2402 SETLOCAL(co->co_argcount, u);
2403 for (i = n; i < argcount; i++) {
2404 x = args[i];
2405 Py_INCREF(x);
2406 PyTuple_SET_ITEM(u, i-n, x);
2407 }
2408 }
2409 for (i = 0; i < kwcount; i++) {
2410 PyObject *keyword = kws[2*i];
2411 PyObject *value = kws[2*i + 1];
2412 int j;
2413 if (keyword == NULL || !PyString_Check(keyword)) {
2414 PyErr_Format(PyExc_TypeError,
2415 "%.200s() keywords must be strings",
2416 PyString_AsString(co->co_name));
2417 goto fail;
2418 }
2419 /* XXX slow -- speed up using dictionary? */
2420 for (j = 0; j < co->co_argcount; j++) {
2421 PyObject *nm = PyTuple_GET_ITEM(
2422 co->co_varnames, j);
2423 int cmp = PyObject_RichCompareBool(
2424 keyword, nm, Py_EQ);
2425 if (cmp > 0)
2426 break;
2427 else if (cmp < 0)
2428 goto fail;
2429 }
2430 /* Check errors from Compare */
2431 if (PyErr_Occurred())
2432 goto fail;
2433 if (j >= co->co_argcount) {
2434 if (kwdict == NULL) {
2435 PyErr_Format(PyExc_TypeError,
2436 "%.200s() got an unexpected "
2437 "keyword argument '%.400s'",
2438 PyString_AsString(co->co_name),
2439 PyString_AsString(keyword));
2440 goto fail;
2441 }
2442 PyDict_SetItem(kwdict, keyword, value);
2443 }
2444 else {
2445 if (GETLOCAL(j) != NULL) {
2446 PyErr_Format(PyExc_TypeError,
2447 "%.200s() got multiple "
2448 "values for keyword "
2449 "argument '%.400s'",
2450 PyString_AsString(co->co_name),
2451 PyString_AsString(keyword));
2452 goto fail;
2453 }
2454 Py_INCREF(value);
2455 SETLOCAL(j, value);
2456 }
2457 }
2458 if (argcount < co->co_argcount) {
2459 int m = co->co_argcount - defcount;
2460 for (i = argcount; i < m; i++) {
2461 if (GETLOCAL(i) == NULL) {
2462 PyErr_Format(PyExc_TypeError,
2463 "%.200s() takes %s %d "
2464 "%sargument%s (%d given)",
2465 PyString_AsString(co->co_name),
2466 ((co->co_flags & CO_VARARGS) ||
2467 defcount) ? "at least"
2468 : "exactly",
2469 m, kwcount ? "non-keyword " : "",
2470 m == 1 ? "" : "s", i);
2471 goto fail;
2472 }
2473 }
2474 if (n > m)
2475 i = n - m;
2476 else
2477 i = 0;
2478 for (; i < defcount; i++) {
2479 if (GETLOCAL(m+i) == NULL) {
2480 PyObject *def = defs[i];
2481 Py_INCREF(def);
2482 SETLOCAL(m+i, def);
2483 }
2484 }
2485 }
2486 }
2487 else {
2488 if (argcount > 0 || kwcount > 0) {
2489 PyErr_Format(PyExc_TypeError,
2490 "%.200s() takes no arguments (%d given)",
2491 PyString_AsString(co->co_name),
2492 argcount + kwcount);
2493 goto fail;
2494 }
2495 }
2496 /* Allocate and initialize storage for cell vars, and copy free
2497 vars into frame. This isn't too efficient right now. */
2498 if (f->f_ncells) {
2499 int i = 0, j = 0, nargs, found;
2500 char *cellname, *argname;
2501 PyObject *c;
2502
2503 nargs = co->co_argcount;
2504 if (co->co_flags & CO_VARARGS)
2505 nargs++;
2506 if (co->co_flags & CO_VARKEYWORDS)
2507 nargs++;
2508
2509 /* Check for cells that shadow args */
2510 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2511 cellname = PyString_AS_STRING(
2512 PyTuple_GET_ITEM(co->co_cellvars, i));
2513 found = 0;
2514 while (j < nargs) {
2515 argname = PyString_AS_STRING(
2516 PyTuple_GET_ITEM(co->co_varnames, j));
2517 if (strcmp(cellname, argname) == 0) {
2518 c = PyCell_New(GETLOCAL(j));
2519 if (c == NULL)
2520 goto fail;
2521 GETLOCAL(f->f_nlocals + i) = c;
2522 found = 1;
2523 break;
2524 }
2525 j++;
2526 }
2527 if (found == 0) {
2528 c = PyCell_New(NULL);
2529 if (c == NULL)
2530 goto fail;
2531 SETLOCAL(f->f_nlocals + i, c);
2532 }
2533 }
2534 /* Initialize any that are left */
2535 while (i < f->f_ncells) {
2536 c = PyCell_New(NULL);
2537 if (c == NULL)
2538 goto fail;
2539 SETLOCAL(f->f_nlocals + i, c);
2540 i++;
2541 }
2542 }
2543 if (f->f_nfreevars) {
2544 int i;
2545 for (i = 0; i < f->f_nfreevars; ++i) {
2546 PyObject *o = PyTuple_GET_ITEM(closure, i);
2547 Py_INCREF(o);
2548 freevars[f->f_ncells + i] = o;
2549 }
2550 }
2551
Tim Peters5ca576e2001-06-18 22:08:13 +00002552 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002553 /* Don't need to keep the reference to f_back, it will be set
2554 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002555 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002556 f->f_back = NULL;
2557
2558 /* Create a new generator that owns the ready to run frame
2559 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002560 return gen_new(f);
2561 }
2562
2563 retval = eval_frame(f);
2564
2565 fail: /* Jump here from prelude on failure */
2566
Tim Petersb13680b2001-11-27 23:29:29 +00002567 /* decref'ing the frame can cause __del__ methods to get invoked,
2568 which can call back into Python. While we're done with the
2569 current Python frame (f), the associated C stack is still in use,
2570 so recursion_depth must be boosted for the duration.
2571 */
2572 assert(tstate != NULL);
2573 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002574 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002575 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002576 return retval;
2577}
2578
2579
Guido van Rossuma027efa1997-05-05 20:56:21 +00002580static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002581set_exc_info(PyThreadState *tstate,
2582 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002583{
2584 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002585 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002586
Guido van Rossuma027efa1997-05-05 20:56:21 +00002587 frame = tstate->frame;
2588 if (frame->f_exc_type == NULL) {
2589 /* This frame didn't catch an exception before */
2590 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 if (tstate->exc_type == NULL) {
2592 Py_INCREF(Py_None);
2593 tstate->exc_type = Py_None;
2594 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002595 tmp_type = frame->f_exc_type;
2596 tmp_value = frame->f_exc_value;
2597 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002598 Py_XINCREF(tstate->exc_type);
2599 Py_XINCREF(tstate->exc_value);
2600 Py_XINCREF(tstate->exc_traceback);
2601 frame->f_exc_type = tstate->exc_type;
2602 frame->f_exc_value = tstate->exc_value;
2603 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002604 Py_XDECREF(tmp_type);
2605 Py_XDECREF(tmp_value);
2606 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607 }
2608 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002609 tmp_type = tstate->exc_type;
2610 tmp_value = tstate->exc_value;
2611 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002612 Py_XINCREF(type);
2613 Py_XINCREF(value);
2614 Py_XINCREF(tb);
2615 tstate->exc_type = type;
2616 tstate->exc_value = value;
2617 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002618 Py_XDECREF(tmp_type);
2619 Py_XDECREF(tmp_value);
2620 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002621 /* For b/w compatibility */
2622 PySys_SetObject("exc_type", type);
2623 PySys_SetObject("exc_value", value);
2624 PySys_SetObject("exc_traceback", tb);
2625}
2626
2627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002628reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002629{
2630 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002632 frame = tstate->frame;
2633 if (frame->f_exc_type != NULL) {
2634 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002635 tmp_type = tstate->exc_type;
2636 tmp_value = tstate->exc_value;
2637 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002638 Py_XINCREF(frame->f_exc_type);
2639 Py_XINCREF(frame->f_exc_value);
2640 Py_XINCREF(frame->f_exc_traceback);
2641 tstate->exc_type = frame->f_exc_type;
2642 tstate->exc_value = frame->f_exc_value;
2643 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002644 Py_XDECREF(tmp_type);
2645 Py_XDECREF(tmp_value);
2646 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002647 /* For b/w compatibility */
2648 PySys_SetObject("exc_type", frame->f_exc_type);
2649 PySys_SetObject("exc_value", frame->f_exc_value);
2650 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2651 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002652 tmp_type = frame->f_exc_type;
2653 tmp_value = frame->f_exc_value;
2654 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002655 frame->f_exc_type = NULL;
2656 frame->f_exc_value = NULL;
2657 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002658 Py_XDECREF(tmp_type);
2659 Py_XDECREF(tmp_value);
2660 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002661}
2662
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002663/* Logic for the raise statement (too complicated for inlining).
2664 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002665static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002666do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002667{
Guido van Rossumd295f121998-04-09 21:39:57 +00002668 if (type == NULL) {
2669 /* Reraise */
2670 PyThreadState *tstate = PyThreadState_Get();
2671 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2672 value = tstate->exc_value;
2673 tb = tstate->exc_traceback;
2674 Py_XINCREF(type);
2675 Py_XINCREF(value);
2676 Py_XINCREF(tb);
2677 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002678
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002679 /* We support the following forms of raise:
2680 raise <class>, <classinstance>
2681 raise <class>, <argument tuple>
2682 raise <class>, None
2683 raise <class>, <argument>
2684 raise <classinstance>, None
2685 raise <string>, <object>
2686 raise <string>, None
2687
2688 An omitted second argument is the same as None.
2689
2690 In addition, raise <tuple>, <anything> is the same as
2691 raising the tuple's first item (and it better have one!);
2692 this rule is applied recursively.
2693
2694 Finally, an optional third argument can be supplied, which
2695 gives the traceback to be substituted (useful when
2696 re-raising an exception after examining it). */
2697
2698 /* First, check the traceback argument, replacing None with
2699 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002700 if (tb == Py_None) {
2701 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002702 tb = NULL;
2703 }
2704 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002706 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002707 goto raise_error;
2708 }
2709
2710 /* Next, replace a missing value with None */
2711 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 value = Py_None;
2713 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002714 }
2715
2716 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2718 PyObject *tmp = type;
2719 type = PyTuple_GET_ITEM(type, 0);
2720 Py_INCREF(type);
2721 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002722 }
2723
Tim Petersafb2c802002-04-18 18:06:20 +00002724 if (PyString_CheckExact(type))
2725 /* Raising builtin string is deprecated but still allowed --
2726 * do nothing. Raising an instance of a new-style str
2727 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002728 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002729
2730 else if (PyClass_Check(type))
2731 PyErr_NormalizeException(&type, &value, &tb);
2732
Guido van Rossumb209a111997-04-29 18:18:01 +00002733 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002734 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 if (value != Py_None) {
2736 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002737 "instance exception may not have a separate value");
2738 goto raise_error;
2739 }
2740 else {
2741 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002743 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2745 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002746 }
2747 }
2748 else {
2749 /* Not something you can raise. You get an exception
2750 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002751 PyErr_Format(PyExc_TypeError,
2752 "exceptions must be strings, classes, or "
2753 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002754 goto raise_error;
2755 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002756 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002757 if (tb == NULL)
2758 return WHY_EXCEPTION;
2759 else
2760 return WHY_RERAISE;
2761 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 Py_XDECREF(value);
2763 Py_XDECREF(type);
2764 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002765 return WHY_EXCEPTION;
2766}
2767
Tim Petersd6d010b2001-06-21 02:49:55 +00002768/* Iterate v argcnt times and store the results on the stack (via decreasing
2769 sp). Return 1 for success, 0 if error. */
2770
Barry Warsawe42b18f1997-08-25 22:13:04 +00002771static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002772unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002773{
Tim Petersd6d010b2001-06-21 02:49:55 +00002774 int i = 0;
2775 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002776 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002777
Tim Petersd6d010b2001-06-21 02:49:55 +00002778 assert(v != NULL);
2779
2780 it = PyObject_GetIter(v);
2781 if (it == NULL)
2782 goto Error;
2783
2784 for (; i < argcnt; i++) {
2785 w = PyIter_Next(it);
2786 if (w == NULL) {
2787 /* Iterator done, via error or exhaustion. */
2788 if (!PyErr_Occurred()) {
2789 PyErr_Format(PyExc_ValueError,
2790 "need more than %d value%s to unpack",
2791 i, i == 1 ? "" : "s");
2792 }
2793 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002794 }
2795 *--sp = w;
2796 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002797
2798 /* We better have exhausted the iterator now. */
2799 w = PyIter_Next(it);
2800 if (w == NULL) {
2801 if (PyErr_Occurred())
2802 goto Error;
2803 Py_DECREF(it);
2804 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002805 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002806 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002807 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002808 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002809Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002810 for (; i > 0; i--, sp++)
2811 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002812 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002813 return 0;
2814}
2815
2816
Guido van Rossum96a42c81992-01-12 02:29:51 +00002817#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002818static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002819prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002821 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 if (PyObject_Print(v, stdout, 0) != 0)
2823 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002824 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002825 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002827#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002829static void
Fred Drake5755ce62001-06-27 19:19:46 +00002830call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002831{
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002833 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002834 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002835 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002836 value = Py_None;
2837 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002838 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002839 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002840 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002841 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002842 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002843 }
Fred Drake5755ce62001-06-27 19:19:46 +00002844 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002845 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002846 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002847 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002848 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002849 Py_XDECREF(type);
2850 Py_XDECREF(value);
2851 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002852 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002853}
2854
Fred Drake4ec5d562001-10-04 19:26:43 +00002855static void
2856call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2857 int what)
2858{
2859 PyObject *type, *value, *traceback;
2860 int err;
2861 PyErr_Fetch(&type, &value, &traceback);
2862 err = call_trace(func, obj, frame, what, NULL);
2863 if (err == 0)
2864 PyErr_Restore(type, value, traceback);
2865 else {
2866 Py_XDECREF(type);
2867 Py_XDECREF(value);
2868 Py_XDECREF(traceback);
2869 }
2870}
2871
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002872static int
Fred Drake5755ce62001-06-27 19:19:46 +00002873call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2874 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002875{
Fred Drake5755ce62001-06-27 19:19:46 +00002876 register PyThreadState *tstate = frame->f_tstate;
2877 int result;
2878 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002879 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002880 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002881 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002882 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002883 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2884 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002885 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002886 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002887}
2888
Fred Drake5755ce62001-06-27 19:19:46 +00002889void
2890PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002891{
Fred Drake5755ce62001-06-27 19:19:46 +00002892 PyThreadState *tstate = PyThreadState_Get();
2893 PyObject *temp = tstate->c_profileobj;
2894 Py_XINCREF(arg);
2895 tstate->c_profilefunc = NULL;
2896 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002897 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002898 Py_XDECREF(temp);
2899 tstate->c_profilefunc = func;
2900 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002901 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002902}
2903
2904void
2905PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2906{
2907 PyThreadState *tstate = PyThreadState_Get();
2908 PyObject *temp = tstate->c_traceobj;
2909 Py_XINCREF(arg);
2910 tstate->c_tracefunc = NULL;
2911 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002912 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002913 Py_XDECREF(temp);
2914 tstate->c_tracefunc = func;
2915 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002916 tstate->use_tracing = ((func != NULL)
2917 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002918}
2919
Guido van Rossumb209a111997-04-29 18:18:01 +00002920PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002921PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002922{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002923 PyThreadState *tstate = PyThreadState_Get();
2924 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002925 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002926 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002927 else
2928 return current_frame->f_builtins;
2929}
2930
Guido van Rossumb209a111997-04-29 18:18:01 +00002931PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002932PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002933{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002934 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002935 if (current_frame == NULL)
2936 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002937 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002938 return current_frame->f_locals;
2939}
2940
Guido van Rossumb209a111997-04-29 18:18:01 +00002941PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002942PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002943{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002944 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002945 if (current_frame == NULL)
2946 return NULL;
2947 else
2948 return current_frame->f_globals;
2949}
2950
Guido van Rossumb209a111997-04-29 18:18:01 +00002951PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002952PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002953{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002954 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002955 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002956}
2957
Guido van Rossum6135a871995-01-09 17:53:26 +00002958int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002959PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002960{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002961 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002962 return current_frame == NULL ? 0 : current_frame->f_restricted;
2963}
2964
Guido van Rossumbe270261997-05-22 22:26:18 +00002965int
Tim Peters5ba58662001-07-16 02:29:45 +00002966PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002967{
2968 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002969 int result = 0;
2970
2971 if (current_frame != NULL) {
2972 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002973 const int compilerflags = codeflags & PyCF_MASK;
2974 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002975 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002976 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002977 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002978#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002979 if (codeflags & CO_GENERATOR_ALLOWED) {
2980 result = 1;
2981 cf->cf_flags |= CO_GENERATOR_ALLOWED;
2982 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002983#endif
Tim Peters5ba58662001-07-16 02:29:45 +00002984 }
2985 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002986}
2987
2988int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002989Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990{
Guido van Rossumb209a111997-04-29 18:18:01 +00002991 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002992 if (f == NULL)
2993 return 0;
2994 if (!PyFile_SoftSpace(f, 0))
2995 return 0;
2996 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997}
2998
Guido van Rossum3f5da241990-12-20 15:06:42 +00002999
Guido van Rossum681d79a1995-07-18 14:51:37 +00003000/* External interface to call any callable object.
3001 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003002
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003003#undef PyEval_CallObject
3004/* for backward compatibility: export this interface */
3005
Guido van Rossumb209a111997-04-29 18:18:01 +00003006PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003007PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003008{
Guido van Rossumb209a111997-04-29 18:18:01 +00003009 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003010}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003011#define PyEval_CallObject(func,arg) \
3012 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003013
Guido van Rossumb209a111997-04-29 18:18:01 +00003014PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003015PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003016{
Jeremy Hylton52820442001-01-03 23:52:36 +00003017 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018
3019 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 arg = PyTuple_New(0);
3021 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003022 PyErr_SetString(PyExc_TypeError,
3023 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003024 return NULL;
3025 }
3026 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003027 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003028
Guido van Rossumb209a111997-04-29 18:18:01 +00003029 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003030 PyErr_SetString(PyExc_TypeError,
3031 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003032 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003033 return NULL;
3034 }
3035
Tim Peters6d6c1a32001-08-02 04:15:00 +00003036 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003037 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003038 return result;
3039}
3040
Tim Peters6d6c1a32001-08-02 04:15:00 +00003041char *
3042PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003043{
3044 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003045 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003046 else if (PyFunction_Check(func))
3047 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3048 else if (PyCFunction_Check(func))
3049 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3050 else if (PyClass_Check(func))
3051 return PyString_AsString(((PyClassObject*)func)->cl_name);
3052 else if (PyInstance_Check(func)) {
3053 return PyString_AsString(
3054 ((PyInstanceObject*)func)->in_class->cl_name);
3055 } else {
3056 return func->ob_type->tp_name;
3057 }
3058}
3059
Tim Peters6d6c1a32001-08-02 04:15:00 +00003060char *
3061PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003062{
3063 if (PyMethod_Check(func))
3064 return "()";
3065 else if (PyFunction_Check(func))
3066 return "()";
3067 else if (PyCFunction_Check(func))
3068 return "()";
3069 else if (PyClass_Check(func))
3070 return " constructor";
3071 else if (PyInstance_Check(func)) {
3072 return " instance";
3073 } else {
3074 return " object";
3075 }
3076}
3077
Jeremy Hylton52820442001-01-03 23:52:36 +00003078#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3079
3080/* The two fast_xxx() functions optimize calls for which no argument
3081 tuple is necessary; the objects are passed directly from the stack.
3082 fast_cfunction() is called for METH_OLDARGS functions.
3083 fast_function() is for functions with no special argument handling.
3084*/
3085
3086static PyObject *
3087fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3088{
3089 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3090 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003091 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003092
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003093 switch (flags) {
3094 case METH_OLDARGS:
3095 if (na == 0)
3096 return (*meth)(self, NULL);
3097 else if (na == 1) {
3098 PyObject *arg = EXT_POP(*pp_stack);
3099 PyObject *result = (*meth)(self, arg);
3100 Py_DECREF(arg);
3101 return result;
3102 } else {
3103 PyObject *args = load_args(pp_stack, na);
3104 PyObject *result = (*meth)(self, args);
3105 Py_DECREF(args);
3106 return result;
3107 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003108 case METH_NOARGS:
3109 if (na == 0)
3110 return (*meth)(self, NULL);
3111 PyErr_Format(PyExc_TypeError,
3112 "%.200s() takes no arguments (%d given)",
3113 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3114 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003115 case METH_O:
3116 if (na == 1) {
3117 PyObject *arg = EXT_POP(*pp_stack);
3118 PyObject *result = (*meth)(self, arg);
3119 Py_DECREF(arg);
3120 return result;
3121 }
3122 PyErr_Format(PyExc_TypeError,
3123 "%.200s() takes exactly one argument (%d given)",
3124 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3125 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003126 default:
3127 fprintf(stderr, "%.200s() flags = %d\n",
3128 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3129 PyErr_BadInternalCall();
3130 return NULL;
3131 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003132}
3133
3134static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003135fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003136{
3137 PyObject *co = PyFunction_GET_CODE(func);
3138 PyObject *globals = PyFunction_GET_GLOBALS(func);
3139 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003140 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003141 PyObject **d = NULL;
3142 int nd = 0;
3143
3144 if (argdefs != NULL) {
3145 d = &PyTuple_GET_ITEM(argdefs, 0);
3146 nd = ((PyTupleObject *)argdefs)->ob_size;
3147 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003148 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003149 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003150 (*pp_stack)-2*nk, nk, d, nd,
3151 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003152}
3153
3154static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003155update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3156 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003157{
3158 PyObject *kwdict = NULL;
3159 if (orig_kwdict == NULL)
3160 kwdict = PyDict_New();
3161 else {
3162 kwdict = PyDict_Copy(orig_kwdict);
3163 Py_DECREF(orig_kwdict);
3164 }
3165 if (kwdict == NULL)
3166 return NULL;
3167 while (--nk >= 0) {
3168 int err;
3169 PyObject *value = EXT_POP(*pp_stack);
3170 PyObject *key = EXT_POP(*pp_stack);
3171 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003172 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003173 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003174 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003175 PyEval_GetFuncName(func),
3176 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003177 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003178 Py_DECREF(key);
3179 Py_DECREF(value);
3180 Py_DECREF(kwdict);
3181 return NULL;
3182 }
3183 err = PyDict_SetItem(kwdict, key, value);
3184 Py_DECREF(key);
3185 Py_DECREF(value);
3186 if (err) {
3187 Py_DECREF(kwdict);
3188 return NULL;
3189 }
3190 }
3191 return kwdict;
3192}
3193
3194static PyObject *
3195update_star_args(int nstack, int nstar, PyObject *stararg,
3196 PyObject ***pp_stack)
3197{
3198 PyObject *callargs, *w;
3199
3200 callargs = PyTuple_New(nstack + nstar);
3201 if (callargs == NULL) {
3202 return NULL;
3203 }
3204 if (nstar) {
3205 int i;
3206 for (i = 0; i < nstar; i++) {
3207 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3208 Py_INCREF(a);
3209 PyTuple_SET_ITEM(callargs, nstack + i, a);
3210 }
3211 }
3212 while (--nstack >= 0) {
3213 w = EXT_POP(*pp_stack);
3214 PyTuple_SET_ITEM(callargs, nstack, w);
3215 }
3216 return callargs;
3217}
3218
3219static PyObject *
3220load_args(PyObject ***pp_stack, int na)
3221{
3222 PyObject *args = PyTuple_New(na);
3223 PyObject *w;
3224
3225 if (args == NULL)
3226 return NULL;
3227 while (--na >= 0) {
3228 w = EXT_POP(*pp_stack);
3229 PyTuple_SET_ITEM(args, na, w);
3230 }
3231 return args;
3232}
3233
3234static PyObject *
3235do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3236{
3237 PyObject *callargs = NULL;
3238 PyObject *kwdict = NULL;
3239 PyObject *result = NULL;
3240
3241 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003242 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003243 if (kwdict == NULL)
3244 goto call_fail;
3245 }
3246 callargs = load_args(pp_stack, na);
3247 if (callargs == NULL)
3248 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003249 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003250 call_fail:
3251 Py_XDECREF(callargs);
3252 Py_XDECREF(kwdict);
3253 return result;
3254}
3255
3256static PyObject *
3257ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3258{
3259 int nstar = 0;
3260 PyObject *callargs = NULL;
3261 PyObject *stararg = NULL;
3262 PyObject *kwdict = NULL;
3263 PyObject *result = NULL;
3264
3265 if (flags & CALL_FLAG_KW) {
3266 kwdict = EXT_POP(*pp_stack);
3267 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003268 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003269 "%s%s argument after ** "
3270 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003271 PyEval_GetFuncName(func),
3272 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003273 goto ext_call_fail;
3274 }
3275 }
3276 if (flags & CALL_FLAG_VAR) {
3277 stararg = EXT_POP(*pp_stack);
3278 if (!PyTuple_Check(stararg)) {
3279 PyObject *t = NULL;
3280 t = PySequence_Tuple(stararg);
3281 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003282 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3283 PyErr_Format(PyExc_TypeError,
3284 "%s%s argument after * "
3285 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003286 PyEval_GetFuncName(func),
3287 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003288 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003289 goto ext_call_fail;
3290 }
3291 Py_DECREF(stararg);
3292 stararg = t;
3293 }
3294 nstar = PyTuple_GET_SIZE(stararg);
3295 }
3296 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003297 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003298 if (kwdict == NULL)
3299 goto ext_call_fail;
3300 }
3301 callargs = update_star_args(na, nstar, stararg, pp_stack);
3302 if (callargs == NULL)
3303 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003304 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003305 ext_call_fail:
3306 Py_XDECREF(callargs);
3307 Py_XDECREF(kwdict);
3308 Py_XDECREF(stararg);
3309 return result;
3310}
3311
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003312#define SLICE_ERROR_MSG \
3313 "standard sequence type does not support step size other than one"
3314
Tim Peterscb479e72001-12-16 19:11:44 +00003315/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3316 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3317 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3318*/
Tim Petersb5196382001-12-16 19:44:20 +00003319/* Note: If v is NULL, return success without storing into *pi. This
3320 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3321 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003322*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003323int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003324_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325{
Tim Petersb5196382001-12-16 19:44:20 +00003326 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003327 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003328 if (PyInt_Check(v)) {
3329 x = PyInt_AsLong(v);
3330 } else if (PyLong_Check(v)) {
3331 x = PyLong_AsLong(v);
3332 if (x==-1 && PyErr_Occurred()) {
3333 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003334 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003335
Guido van Rossumac7be682001-01-17 15:42:30 +00003336 if (!PyErr_ExceptionMatches(
3337 PyExc_OverflowError)) {
3338 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003339 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003340 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003341 }
3342
Guido van Rossumac7be682001-01-17 15:42:30 +00003343 /* Clear the OverflowError */
3344 PyErr_Clear();
3345
3346 /* It's an overflow error, so we need to
3347 check the sign of the long integer,
3348 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003349 the error. */
3350
3351 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003352 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003353 if (long_zero == NULL)
3354 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003355
3356 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003357 cmp = PyObject_RichCompareBool(v, long_zero,
3358 Py_GT);
3359 Py_DECREF(long_zero);
3360 if (cmp < 0)
3361 return 0;
3362 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003363 x = INT_MAX;
3364 else
3365 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003366 }
3367 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003368 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003369 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003370 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003372 /* Truncate -- very long indices are truncated anyway */
3373 if (x > INT_MAX)
3374 x = INT_MAX;
3375 else if (x < -INT_MAX)
3376 x = 0;
3377 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003379 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380}
3381
Guido van Rossum50d756e2001-08-18 17:43:36 +00003382#undef ISINT
3383#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3384
Guido van Rossumb209a111997-04-29 18:18:01 +00003385static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003386apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003388 PyTypeObject *tp = u->ob_type;
3389 PySequenceMethods *sq = tp->tp_as_sequence;
3390
3391 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3392 int ilow = 0, ihigh = INT_MAX;
3393 if (!_PyEval_SliceIndex(v, &ilow))
3394 return NULL;
3395 if (!_PyEval_SliceIndex(w, &ihigh))
3396 return NULL;
3397 return PySequence_GetSlice(u, ilow, ihigh);
3398 }
3399 else {
3400 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003401 if (slice != NULL) {
3402 PyObject *res = PyObject_GetItem(u, slice);
3403 Py_DECREF(slice);
3404 return res;
3405 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003406 else
3407 return NULL;
3408 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003410
3411static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003412assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3413 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003415 PyTypeObject *tp = u->ob_type;
3416 PySequenceMethods *sq = tp->tp_as_sequence;
3417
3418 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3419 int ilow = 0, ihigh = INT_MAX;
3420 if (!_PyEval_SliceIndex(v, &ilow))
3421 return -1;
3422 if (!_PyEval_SliceIndex(w, &ihigh))
3423 return -1;
3424 if (x == NULL)
3425 return PySequence_DelSlice(u, ilow, ihigh);
3426 else
3427 return PySequence_SetSlice(u, ilow, ihigh, x);
3428 }
3429 else {
3430 PyObject *slice = PySlice_New(v, w, NULL);
3431 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003432 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003433 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003434 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003435 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003436 res = PyObject_DelItem(u, slice);
3437 Py_DECREF(slice);
3438 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003439 }
3440 else
3441 return -1;
3442 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443}
3444
Guido van Rossumb209a111997-04-29 18:18:01 +00003445static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003446cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447{
Guido van Rossumac7be682001-01-17 15:42:30 +00003448 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003450 case PyCmp_IS:
3451 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003452 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003453 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003454 res = !res;
3455 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003456 case PyCmp_IN:
3457 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003458 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003459 if (res < 0)
3460 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003461 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003462 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003464 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003465 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003466 break;
3467 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003468 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003469 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003470 v = res ? Py_True : Py_False;
3471 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 return v;
3473}
3474
Thomas Wouters52152252000-08-17 22:55:00 +00003475static PyObject *
3476import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003477{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003478 PyObject *x;
3479
3480 x = PyObject_GetAttr(v, name);
3481 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003482 PyErr_Format(PyExc_ImportError,
3483 "cannot import name %.230s",
3484 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003485 }
Thomas Wouters52152252000-08-17 22:55:00 +00003486 return x;
3487}
Guido van Rossumac7be682001-01-17 15:42:30 +00003488
Thomas Wouters52152252000-08-17 22:55:00 +00003489static int
3490import_all_from(PyObject *locals, PyObject *v)
3491{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003492 PyObject *all = PyObject_GetAttrString(v, "__all__");
3493 PyObject *dict, *name, *value;
3494 int skip_leading_underscores = 0;
3495 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003496
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003497 if (all == NULL) {
3498 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3499 return -1; /* Unexpected error */
3500 PyErr_Clear();
3501 dict = PyObject_GetAttrString(v, "__dict__");
3502 if (dict == NULL) {
3503 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3504 return -1;
3505 PyErr_SetString(PyExc_ImportError,
3506 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003507 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003508 }
3509 all = PyMapping_Keys(dict);
3510 Py_DECREF(dict);
3511 if (all == NULL)
3512 return -1;
3513 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003514 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003515
3516 for (pos = 0, err = 0; ; pos++) {
3517 name = PySequence_GetItem(all, pos);
3518 if (name == NULL) {
3519 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3520 err = -1;
3521 else
3522 PyErr_Clear();
3523 break;
3524 }
3525 if (skip_leading_underscores &&
3526 PyString_Check(name) &&
3527 PyString_AS_STRING(name)[0] == '_')
3528 {
3529 Py_DECREF(name);
3530 continue;
3531 }
3532 value = PyObject_GetAttr(v, name);
3533 if (value == NULL)
3534 err = -1;
3535 else
3536 err = PyDict_SetItem(locals, name, value);
3537 Py_DECREF(name);
3538 Py_XDECREF(value);
3539 if (err != 0)
3540 break;
3541 }
3542 Py_DECREF(all);
3543 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003544}
3545
Guido van Rossumb209a111997-04-29 18:18:01 +00003546static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003547build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003548{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003549 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003550
3551 if (PyDict_Check(methods))
3552 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003553 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003554 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003555 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3556 base = PyTuple_GET_ITEM(bases, 0);
3557 metaclass = PyObject_GetAttrString(base, "__class__");
3558 if (metaclass == NULL) {
3559 PyErr_Clear();
3560 metaclass = (PyObject *)base->ob_type;
3561 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003562 }
3563 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003564 else {
3565 PyObject *g = PyEval_GetGlobals();
3566 if (g != NULL && PyDict_Check(g))
3567 metaclass = PyDict_GetItemString(g, "__metaclass__");
3568 if (metaclass == NULL)
3569 metaclass = (PyObject *) &PyClass_Type;
3570 Py_INCREF(metaclass);
3571 }
3572 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3573 Py_DECREF(metaclass);
3574 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003575}
3576
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003577static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003578exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3579 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003580{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003581 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003582 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003583 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003584
Guido van Rossumb209a111997-04-29 18:18:01 +00003585 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3586 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003587 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003588 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003589 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003590 locals = PyTuple_GetItem(prog, 2);
3591 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003592 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003593 if (globals == Py_None) {
3594 globals = PyEval_GetGlobals();
3595 if (locals == Py_None) {
3596 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003597 plain = 1;
3598 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003599 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003600 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003601 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003602 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003603 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003604 !PyCode_Check(prog) &&
3605 !PyFile_Check(prog)) {
3606 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003607 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003608 return -1;
3609 }
Fred Drake661ea262000-10-24 19:57:45 +00003610 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003611 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003612 "exec: arg 2 must be a dictionary or None");
3613 return -1;
3614 }
3615 if (!PyDict_Check(locals)) {
3616 PyErr_SetString(PyExc_TypeError,
3617 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003618 return -1;
3619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003620 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003621 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003622 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003623 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3624 PyErr_SetString(PyExc_TypeError,
3625 "code object passed to exec may not contain free variables");
3626 return -1;
3627 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003628 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003629 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003630 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003631 FILE *fp = PyFile_AsFile(prog);
3632 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003633 PyCompilerFlags cf;
3634 cf.cf_flags = 0;
3635 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003636 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3637 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003638 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003639 v = PyRun_File(fp, name, Py_file_input, globals,
3640 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003641 }
3642 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003643 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003644 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003645 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003646 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003647 cf.cf_flags = 0;
3648 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003649 v = PyRun_StringFlags(str, Py_file_input, globals,
3650 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003651 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003652 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003653 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003654 if (plain)
3655 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003656 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003657 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003658 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003659 return 0;
3660}
Guido van Rossum24c13741995-02-14 09:42:43 +00003661
Guido van Rossumac7be682001-01-17 15:42:30 +00003662static void
Paul Prescode68140d2000-08-30 20:25:01 +00003663format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3664{
3665 char *obj_str;
3666
3667 if (!obj)
3668 return;
3669
3670 obj_str = PyString_AsString(obj);
3671 if (!obj_str)
3672 return;
3673
3674 PyErr_Format(exc, format_str, obj_str);
3675}
Guido van Rossum950361c1997-01-24 13:49:28 +00003676
3677#ifdef DYNAMIC_EXECUTION_PROFILE
3678
Skip Montanarof118cb12001-10-15 20:51:38 +00003679static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003680getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003681{
3682 int i;
3683 PyObject *l = PyList_New(256);
3684 if (l == NULL) return NULL;
3685 for (i = 0; i < 256; i++) {
3686 PyObject *x = PyInt_FromLong(a[i]);
3687 if (x == NULL) {
3688 Py_DECREF(l);
3689 return NULL;
3690 }
3691 PyList_SetItem(l, i, x);
3692 }
3693 for (i = 0; i < 256; i++)
3694 a[i] = 0;
3695 return l;
3696}
3697
3698PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003699_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003700{
3701#ifndef DXPAIRS
3702 return getarray(dxp);
3703#else
3704 int i;
3705 PyObject *l = PyList_New(257);
3706 if (l == NULL) return NULL;
3707 for (i = 0; i < 257; i++) {
3708 PyObject *x = getarray(dxpairs[i]);
3709 if (x == NULL) {
3710 Py_DECREF(l);
3711 return NULL;
3712 }
3713 PyList_SetItem(l, i, x);
3714 }
3715 return l;
3716#endif
3717}
3718
3719#endif