blob: 7f7d37e0e608fa9f9ec7d8efff9855d52a94cb65 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +000051static void call_trace_protected(Py_tracefunc, PyObject *,
52 PyFrameObject *, int);
Fred Drake5755ce62001-06-27 19:19:46 +000053static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
55static int assign_slice(PyObject *, PyObject *,
56 PyObject *, PyObject *);
57static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000058static PyObject *import_from(PyObject *, PyObject *);
59static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000060static PyObject *build_class(PyObject *, PyObject *, PyObject *);
61static int exec_statement(PyFrameObject *,
62 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
64static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000065static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Paul Prescode68140d2000-08-30 20:25:01 +000067#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000068 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000069#define GLOBAL_NAME_ERROR_MSG \
70 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000071#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000072 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000073#define UNBOUNDFREE_ERROR_MSG \
74 "free variable '%.200s' referenced before assignment" \
75 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000076
Guido van Rossum950361c1997-01-24 13:49:28 +000077/* Dynamic execution profile */
78#ifdef DYNAMIC_EXECUTION_PROFILE
79#ifdef DXPAIRS
80static long dxpairs[257][256];
81#define dxp dxpairs[256]
82#else
83static long dxp[256];
84#endif
85#endif
86
Tim Peters5ca576e2001-06-18 22:08:13 +000087staticforward PyTypeObject gentype;
88
89typedef struct {
90 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000091 /* The gi_ prefix is intended to remind of generator-iterator. */
92
93 PyFrameObject *gi_frame;
94
Tim Peterse77f2e22001-06-26 22:24:51 +000095 /* True if generator is being executed. */
96 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000097} genobject;
98
99static PyObject *
100gen_new(PyFrameObject *f)
101{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000102 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000103 if (gen == NULL) {
104 Py_DECREF(f);
105 return NULL;
106 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000107 gen->gi_frame = f;
108 gen->gi_running = 0;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000109 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000110 return (PyObject *)gen;
111}
112
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000113static int
114gen_traverse(genobject *gen, visitproc visit, void *arg)
115{
116 return visit((PyObject *)gen->gi_frame, arg);
117}
118
Tim Peters5ca576e2001-06-18 22:08:13 +0000119static void
120gen_dealloc(genobject *gen)
121{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000122 _PyObject_GC_UNTRACK(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000123 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000124 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000125}
126
127static PyObject *
128gen_iternext(genobject *gen)
129{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000130 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000131 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000132 PyObject *result;
133
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000134 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000135 PyErr_SetString(PyExc_ValueError,
136 "generator already executing");
137 return NULL;
138 }
Tim Peters8c963692001-06-23 05:26:56 +0000139 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000140 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000141
142 /* Generators always return to their most recent caller, not
143 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000144 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000145 assert(f->f_back == NULL);
146 f->f_back = tstate->frame;
147
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000148 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000150 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000151
152 /* Don't keep the reference to f_back any longer than necessary. It
153 * may keep a chain of frames alive or it could create a reference
154 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000155 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000156 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000157
Tim Petersad1a18b2001-06-23 06:19:16 +0000158 /* If the generator just returned (as opposed to yielding), signal
159 * that the generator is exhausted. */
160 if (result == Py_None && f->f_stacktop == NULL) {
161 Py_DECREF(result);
162 result = NULL;
163 }
164
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000165 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000166}
167
168static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000169gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000170{
171 PyObject *result;
172
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000173 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000174
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000175 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000176 PyErr_SetObject(PyExc_StopIteration, Py_None);
177 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000178 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000179
180 return result;
181}
182
183static PyObject *
184gen_getiter(PyObject *gen)
185{
186 Py_INCREF(gen);
187 return gen;
188}
189
190static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000191 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000192 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000193 {NULL, NULL} /* Sentinel */
194};
195
Guido van Rossum6f799372001-09-20 20:46:19 +0000196static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000197 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
198 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
199 {NULL} /* Sentinel */
200};
Tim Peters5ca576e2001-06-18 22:08:13 +0000201
202statichere PyTypeObject gentype = {
203 PyObject_HEAD_INIT(&PyType_Type)
204 0, /* ob_size */
205 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000206 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000207 0, /* tp_itemsize */
208 /* methods */
209 (destructor)gen_dealloc, /* tp_dealloc */
210 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000212 0, /* tp_setattr */
213 0, /* tp_compare */
214 0, /* tp_repr */
215 0, /* tp_as_number */
216 0, /* tp_as_sequence */
217 0, /* tp_as_mapping */
218 0, /* tp_hash */
219 0, /* tp_call */
220 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000222 0, /* tp_setattro */
223 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000224 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000226 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000227 0, /* tp_clear */
228 0, /* tp_richcompare */
229 0, /* tp_weaklistoffset */
230 (getiterfunc)gen_getiter, /* tp_iter */
231 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000232 gen_methods, /* tp_methods */
233 gen_memberlist, /* tp_members */
234 0, /* tp_getset */
235 0, /* tp_base */
236 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000237};
238
239
Guido van Rossume59214e1994-08-30 08:01:59 +0000240#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000241
Guido van Rossum2571cc81999-04-07 16:07:23 +0000242#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000244#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000245#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000246
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247extern int _PyThread_Started; /* Flag for Py_Exit */
248
Guido van Rossum65d5b571998-12-21 19:32:43 +0000249static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000250static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251
252void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000256 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 interpreter_lock = PyThread_allocate_lock();
259 PyThread_acquire_lock(interpreter_lock, 1);
260 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000262
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000265{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000266 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267}
268
269void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000271{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000272 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273}
274
275void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000276PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000277{
278 if (tstate == NULL)
279 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000280 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000281 if (PyThreadState_Swap(tstate) != NULL)
282 Py_FatalError(
283 "PyEval_AcquireThread: non-NULL old thread state");
284}
285
286void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000287PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000288{
289 if (tstate == NULL)
290 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
291 if (PyThreadState_Swap(NULL) != tstate)
292 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000293 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000294}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000295
296/* This function is called from PyOS_AfterFork to ensure that newly
297 created child processes don't hold locks referring to threads which
298 are not running in the child process. (This could also be done using
299 pthread_atfork mechanism, at least for the pthreads implementation.) */
300
301void
302PyEval_ReInitThreads(void)
303{
304 if (!interpreter_lock)
305 return;
306 /*XXX Can't use PyThread_free_lock here because it does too
307 much error-checking. Doing this cleanly would require
308 adding a new function to each thread_*.h. Instead, just
309 create a new lock and waste a little bit of memory */
310 interpreter_lock = PyThread_allocate_lock();
311 PyThread_acquire_lock(interpreter_lock, 1);
312 main_thread = PyThread_get_thread_ident();
313}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314#endif
315
Guido van Rossumff4949e1992-08-05 19:58:53 +0000316/* Functions save_thread and restore_thread are always defined so
317 dynamically loaded modules needn't be compiled separately for use
318 with and without threads: */
319
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000320PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000321PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000323 PyThreadState *tstate = PyThreadState_Swap(NULL);
324 if (tstate == NULL)
325 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000327 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000328 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000329#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000330 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331}
332
333void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000336 if (tstate == NULL)
337 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000338#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000339 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000340 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000341 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 }
344#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000345 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000346}
347
348
Guido van Rossuma9672091994-09-14 13:31:22 +0000349/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
350 signal handlers or Mac I/O completion routines) can schedule calls
351 to a function to be called synchronously.
352 The synchronous function is called with one void* argument.
353 It should return 0 for success or -1 for failure -- failure should
354 be accompanied by an exception.
355
356 If registry succeeds, the registry function returns 0; if it fails
357 (e.g. due to too many pending calls) it returns -1 (without setting
358 an exception condition).
359
360 Note that because registry may occur from within signal handlers,
361 or other asynchronous events, calling malloc() is unsafe!
362
363#ifdef WITH_THREAD
364 Any thread can schedule pending calls, but only the main thread
365 will execute them.
366#endif
367
368 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
369 There are two possible race conditions:
370 (1) nested asynchronous registry calls;
371 (2) registry calls made while pending calls are being processed.
372 While (1) is very unlikely, (2) is a real possibility.
373 The current code is safe against (2), but not against (1).
374 The safety against (2) is derived from the fact that only one
375 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000376
Guido van Rossuma027efa1997-05-05 20:56:21 +0000377 XXX Darn! With the advent of thread state, we should have an array
378 of pending calls per thread in the thread state! Later...
379*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000380
Guido van Rossuma9672091994-09-14 13:31:22 +0000381#define NPENDINGCALLS 32
382static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000383 int (*func)(void *);
384 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000385} pendingcalls[NPENDINGCALLS];
386static volatile int pendingfirst = 0;
387static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000388static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389
390int
Thomas Wouters334fb892000-07-25 12:56:38 +0000391Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000392{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000393 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000394 int i, j;
395 /* XXX Begin critical section */
396 /* XXX If you want this to be safe against nested
397 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000398 if (busy)
399 return -1;
400 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000401 i = pendinglast;
402 j = (i + 1) % NPENDINGCALLS;
403 if (j == pendingfirst)
404 return -1; /* Queue full */
405 pendingcalls[i].func = func;
406 pendingcalls[i].arg = arg;
407 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000408 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000409 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000410 /* XXX End critical section */
411 return 0;
412}
413
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000415Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000416{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000419 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 return 0;
421#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000423 return 0;
424 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000426 for (;;) {
427 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000428 int (*func)(void *);
429 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000430 i = pendingfirst;
431 if (i == pendinglast)
432 break; /* Queue empty */
433 func = pendingcalls[i].func;
434 arg = pendingcalls[i].arg;
435 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000436 if (func(arg) < 0) {
437 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000438 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000439 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000440 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000441 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000442 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000443 return 0;
444}
445
446
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000447/* The interpreter's recursion limit */
448
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000449static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000450
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000451int
452Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000453{
454 return recursion_limit;
455}
456
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000457void
458Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000459{
460 recursion_limit = new_limit;
461}
462
Guido van Rossum374a9221991-04-04 10:40:29 +0000463/* Status code for main loop (reason for stack unwind) */
464
465enum why_code {
466 WHY_NOT, /* No error */
467 WHY_EXCEPTION, /* Exception occurred */
468 WHY_RERAISE, /* Exception re-raised by 'finally' */
469 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000470 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000471 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000472 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000473};
474
Tim Petersdbd9ba62000-07-09 03:09:57 +0000475static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000476static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000477
Guido van Rossum374a9221991-04-04 10:40:29 +0000478
Guido van Rossumb209a111997-04-29 18:18:01 +0000479PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000480PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000482 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 (PyObject **)NULL, 0,
485 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000486 (PyObject **)NULL, 0,
487 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488}
489
490
491/* Interpreter main loop */
492
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000494eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000495{
Guido van Rossum950361c1997-01-24 13:49:28 +0000496#ifdef DXPAIRS
497 int lastopcode = 0;
498#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000499 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000500 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000501 register int opcode=0; /* Current opcode */
502 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000503 register enum why_code why; /* Reason for block stack unwind */
504 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 register PyObject *x; /* Result object -- NULL if error */
506 register PyObject *v; /* Temporary objects popped off stack */
507 register PyObject *w;
508 register PyObject *u;
509 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000510 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000511 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000512 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000513 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000514 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000515 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000516#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000517 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000518#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000519#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000521 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000522#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000523
524/* Code access macros */
525
526#define GETCONST(i) Getconst(f, i)
527#define GETNAME(i) Getname(f, i)
528#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000529#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000530#define NEXTOP() (*next_instr++)
531#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000532#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000533#define JUMPBY(x) (next_instr += (x))
534
535/* Stack manipulation macros */
536
537#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
538#define EMPTY() (STACK_LEVEL() == 0)
539#define TOP() (stack_pointer[-1])
540#define BASIC_PUSH(v) (*stack_pointer++ = (v))
541#define BASIC_POP() (*--stack_pointer)
542
Guido van Rossum96a42c81992-01-12 02:29:51 +0000543#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000544#define PUSH(v) { (void)(BASIC_PUSH(v), \
545 lltrace && prtrace(TOP(), "push")); \
546 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000547#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000548#else
549#define PUSH(v) BASIC_PUSH(v)
550#define POP() BASIC_POP()
551#endif
552
Guido van Rossum681d79a1995-07-18 14:51:37 +0000553/* Local variable macros */
554
555#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000556
557/* The SETLOCAL() macro must not DECREF the local variable in-place and
558 then store the new value; it must copy the old value to a temporary
559 value, then store the new value, and then DECREF the temporary value.
560 This is because it is possible that during the DECREF the frame is
561 accessed by other code (e.g. a __del__ method or gc.collect()) and the
562 variable would be pointing to already-freed memory. */
563#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
564 GETLOCAL(i) = value; \
565 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000566
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567/* Start of code */
568
Tim Peters5ca576e2001-06-18 22:08:13 +0000569 if (f == NULL)
570 return NULL;
571
Guido van Rossum8861b741996-07-30 16:49:37 +0000572#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000574 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000575 return NULL;
576 }
577#endif
578
Tim Peters5ca576e2001-06-18 22:08:13 +0000579 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000580 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000581 --tstate->recursion_depth;
582 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000583 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000584 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000585 return NULL;
586 }
587
Tim Peters5ca576e2001-06-18 22:08:13 +0000588 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000589 co = f->f_code;
590 fastlocals = f->f_localsplus;
591 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000592 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000593 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000594 stack_pointer = f->f_stacktop;
595 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000596 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000597
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000598 if (tstate->use_tracing) {
599 if (tstate->c_tracefunc != NULL) {
600 /* tstate->c_tracefunc, if defined, is a
601 function that will be called on *every* entry
602 to a code block. Its return value, if not
603 None, is a function that will be called at
604 the start of each executed line of code.
605 (Actually, the function must return itself
606 in order to continue tracing.) The trace
607 functions are called with three arguments:
608 a pointer to the current frame, a string
609 indicating why the function is called, and
610 an argument which depends on the situation.
611 The global trace function is also called
612 whenever an exception is detected. */
613 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
614 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000615 /* Trace function raised an error */
616 return NULL;
617 }
618 }
619 if (tstate->c_profilefunc != NULL) {
620 /* Similar for c_profilefunc, except it needn't
621 return itself and isn't called for "line" events */
622 if (call_trace(tstate->c_profilefunc,
623 tstate->c_profileobj,
624 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000625 /* Profile function raised an error */
626 return NULL;
627 }
628 }
629 }
630
Tim Peters5ca576e2001-06-18 22:08:13 +0000631#ifdef LLTRACE
632 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
633#endif
634#if defined(Py_DEBUG) || defined(LLTRACE)
635 filename = PyString_AsString(co->co_filename);
636#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000637
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 why = WHY_NOT;
639 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000640 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000641 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000642
Guido van Rossum374a9221991-04-04 10:40:29 +0000643 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000644 assert(stack_pointer >= f->f_valuestack); /* else underflow */
645 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000646 /* Do periodic things. Doing this every time through
647 the loop would add too much overhead, so we do it
648 only every Nth instruction. We also do it if
649 ``things_to_do'' is set, i.e. when an asynchronous
650 event needs attention (e.g. a signal handler or
651 async I/O handler); see Py_AddPendingCall() and
652 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000653
Guido van Rossuma027efa1997-05-05 20:56:21 +0000654 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000655 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000656 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000657 if (Py_MakePendingCalls() < 0) {
658 why = WHY_EXCEPTION;
659 goto on_error;
660 }
661 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000662#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000663 /* If we have true signals, the signal handler
664 will call Py_AddPendingCall() so we don't
665 have to call sigcheck(). On the Mac and
666 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000667 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000668 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 goto on_error;
670 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000671#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672
Guido van Rossume59214e1994-08-30 08:01:59 +0000673#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000674 if (interpreter_lock) {
675 /* Give another thread a chance */
676
Guido van Rossum25ce5661997-08-02 03:10:38 +0000677 if (PyThreadState_Swap(NULL) != tstate)
678 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000679 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680
681 /* Other threads may run now */
682
Guido van Rossum65d5b571998-12-21 19:32:43 +0000683 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000684 if (PyThreadState_Swap(tstate) != NULL)
685 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000686 }
687#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000689
Neil Schemenauer63543862002-02-17 19:10:14 +0000690 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000692
Guido van Rossum408027e1996-12-30 16:17:54 +0000693#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000694 f->f_lasti = INSTR_OFFSET();
695#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000696
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 opcode = NEXTOP();
698 if (HAS_ARG(opcode))
699 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000700 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000701#ifdef DYNAMIC_EXECUTION_PROFILE
702#ifdef DXPAIRS
703 dxpairs[lastopcode][opcode]++;
704 lastopcode = opcode;
705#endif
706 dxp[opcode]++;
707#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000708
Guido van Rossum96a42c81992-01-12 02:29:51 +0000709#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000711
Guido van Rossum96a42c81992-01-12 02:29:51 +0000712 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 if (HAS_ARG(opcode)) {
714 printf("%d: %d, %d\n",
715 (int) (INSTR_OFFSET() - 3),
716 opcode, oparg);
717 }
718 else {
719 printf("%d: %d\n",
720 (int) (INSTR_OFFSET() - 1), opcode);
721 }
722 }
723#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000727
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 /* BEWARE!
729 It is essential that any operation that fails sets either
730 x to NULL, err to nonzero, or why to anything but WHY_NOT,
731 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000732
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000734
Neil Schemenauer63543862002-02-17 19:10:14 +0000735 case SET_LINENO:
736#ifdef LLTRACE
737 if (lltrace)
738 printf("--- %s:%d \n", filename, oparg);
739#endif
740 f->f_lineno = oparg;
741 if (tstate->c_tracefunc == NULL || tstate->tracing)
742 goto fast_next_opcode;
743 /* Trace each line of code reached */
744 f->f_lasti = INSTR_OFFSET();
745 /* Inline call_trace() for performance: */
746 tstate->tracing++;
747 tstate->use_tracing = 0;
748 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
749 PyTrace_LINE, Py_None);
750 tstate->use_tracing = (tstate->c_tracefunc
751 || tstate->c_profilefunc);
752 tstate->tracing--;
753 break;
754
755 case LOAD_FAST:
756 x = GETLOCAL(oparg);
757 if (x != NULL) {
758 Py_INCREF(x);
759 PUSH(x);
760 goto fast_next_opcode;
761 }
762 format_exc_check_arg(PyExc_UnboundLocalError,
763 UNBOUNDLOCAL_ERROR_MSG,
764 PyTuple_GetItem(co->co_varnames, oparg));
765 break;
766
767 case LOAD_CONST:
768 x = GETCONST(oparg);
769 Py_INCREF(x);
770 PUSH(x);
771 goto fast_next_opcode;
772
773 case STORE_FAST:
774 v = POP();
775 SETLOCAL(oparg, v);
776 goto fast_next_opcode;
777
Guido van Rossum374a9221991-04-04 10:40:29 +0000778 case POP_TOP:
779 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000780 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000781 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000782
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 case ROT_TWO:
784 v = POP();
785 w = POP();
786 PUSH(v);
787 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000789
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 case ROT_THREE:
791 v = POP();
792 w = POP();
793 x = POP();
794 PUSH(v);
795 PUSH(x);
796 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000797 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000798
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 case ROT_FOUR:
800 u = POP();
801 v = POP();
802 w = POP();
803 x = POP();
804 PUSH(u);
805 PUSH(x);
806 PUSH(w);
807 PUSH(v);
808 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000809
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 case DUP_TOP:
811 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000812 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000814 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000815
Thomas Wouters434d0822000-08-24 20:11:32 +0000816 case DUP_TOPX:
817 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000818 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000819 x = TOP();
820 Py_INCREF(x);
821 PUSH(x);
822 continue;
823 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000824 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000825 Py_INCREF(x);
826 w = TOP();
827 Py_INCREF(w);
828 PUSH(x);
829 PUSH(w);
830 PUSH(x);
831 continue;
832 case 3:
833 x = POP();
834 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000835 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000836 Py_INCREF(w);
837 v = TOP();
838 Py_INCREF(v);
839 PUSH(w);
840 PUSH(x);
841 PUSH(v);
842 PUSH(w);
843 PUSH(x);
844 continue;
845 case 4:
846 x = POP();
847 Py_INCREF(x);
848 w = POP();
849 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000850 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000851 Py_INCREF(v);
852 u = TOP();
853 Py_INCREF(u);
854 PUSH(v);
855 PUSH(w);
856 PUSH(x);
857 PUSH(u);
858 PUSH(v);
859 PUSH(w);
860 PUSH(x);
861 continue;
862 case 5:
863 x = POP();
864 Py_INCREF(x);
865 w = POP();
866 Py_INCREF(w);
867 v = POP();
868 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000869 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000870 Py_INCREF(u);
871 t = TOP();
872 Py_INCREF(t);
873 PUSH(u);
874 PUSH(v);
875 PUSH(w);
876 PUSH(x);
877 PUSH(t);
878 PUSH(u);
879 PUSH(v);
880 PUSH(w);
881 PUSH(x);
882 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000883 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000884 Py_FatalError("invalid argument to DUP_TOPX"
885 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000886 }
Tim Peters35ba6892000-10-11 07:04:49 +0000887 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000888
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 case UNARY_POSITIVE:
890 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000891 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000892 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000896
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 case UNARY_NEGATIVE:
898 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000899 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000900 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000904
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 case UNARY_NOT:
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000909 if (err == 0) {
910 Py_INCREF(Py_True);
911 PUSH(Py_True);
912 continue;
913 }
914 else if (err > 0) {
915 Py_INCREF(Py_False);
916 PUSH(Py_False);
917 err = 0;
918 continue;
919 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000921
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 case UNARY_CONVERT:
923 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 x = PyObject_Repr(v);
925 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000927 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000929
Guido van Rossum7928cd71991-10-24 14:59:31 +0000930 case UNARY_INVERT:
931 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000932 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000933 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000935 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000936 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000937
Guido van Rossum50564e81996-01-12 01:13:16 +0000938 case BINARY_POWER:
939 w = POP();
940 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000941 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_MULTIPLY:
949 w = POP();
950 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000951 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000952 Py_DECREF(v);
953 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000955 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000957
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000959 if (!_Py_QnewFlag) {
960 w = POP();
961 v = POP();
962 x = PyNumber_Divide(v, w);
963 Py_DECREF(v);
964 Py_DECREF(w);
965 PUSH(x);
966 if (x != NULL) continue;
967 break;
968 }
969 /* -Qnew is in effect: fall through to
970 BINARY_TRUE_DIVIDE */
971 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 w = POP();
973 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000974 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000975 Py_DECREF(v);
976 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000978 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000980
Guido van Rossum4668b002001-08-08 05:00:18 +0000981 case BINARY_FLOOR_DIVIDE:
982 w = POP();
983 v = POP();
984 x = PyNumber_FloorDivide(v, w);
985 Py_DECREF(v);
986 Py_DECREF(w);
987 PUSH(x);
988 if (x != NULL) continue;
989 break;
990
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 case BINARY_MODULO:
992 w = POP();
993 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000994 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000995 Py_DECREF(v);
996 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000998 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001000
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 case BINARY_ADD:
1002 w = POP();
1003 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001004 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001005 /* INLINE: int + int */
1006 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001007 a = PyInt_AS_LONG(v);
1008 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001010 if ((i^a) < 0 && (i^b) < 0)
1011 goto slow_add;
1012 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001013 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001014 else {
1015 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001016 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001017 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001018 Py_DECREF(v);
1019 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001020 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001021 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001023
Guido van Rossum374a9221991-04-04 10:40:29 +00001024 case BINARY_SUBTRACT:
1025 w = POP();
1026 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001027 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001028 /* INLINE: int - int */
1029 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001030 a = PyInt_AS_LONG(v);
1031 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001032 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001033 if ((i^a) < 0 && (i^~b) < 0)
1034 goto slow_sub;
1035 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001036 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001037 else {
1038 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001039 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001040 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001041 Py_DECREF(v);
1042 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001044 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001046
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 case BINARY_SUBSCR:
1048 w = POP();
1049 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001050 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001051 /* INLINE: list[int] */
1052 long i = PyInt_AsLong(w);
1053 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001054 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001055 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001056 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001057 PyErr_SetString(PyExc_IndexError,
1058 "list index out of range");
1059 x = NULL;
1060 }
1061 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001062 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001063 Py_INCREF(x);
1064 }
1065 }
1066 else
1067 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001068 Py_DECREF(v);
1069 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001070 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001071 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001073
Guido van Rossum7928cd71991-10-24 14:59:31 +00001074 case BINARY_LSHIFT:
1075 w = POP();
1076 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001077 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001078 Py_DECREF(v);
1079 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001080 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001081 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001082 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001083
Guido van Rossum7928cd71991-10-24 14:59:31 +00001084 case BINARY_RSHIFT:
1085 w = POP();
1086 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001087 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001088 Py_DECREF(v);
1089 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001090 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001091 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001092 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001093
Guido van Rossum7928cd71991-10-24 14:59:31 +00001094 case BINARY_AND:
1095 w = POP();
1096 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001097 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001098 Py_DECREF(v);
1099 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001100 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001101 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001102 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001103
Guido van Rossum7928cd71991-10-24 14:59:31 +00001104 case BINARY_XOR:
1105 w = POP();
1106 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001107 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001108 Py_DECREF(v);
1109 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001110 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001111 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001112 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001113
Guido van Rossum7928cd71991-10-24 14:59:31 +00001114 case BINARY_OR:
1115 w = POP();
1116 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001117 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001118 Py_DECREF(v);
1119 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001120 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001121 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001122 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001123
1124 case INPLACE_POWER:
1125 w = POP();
1126 v = POP();
1127 x = PyNumber_InPlacePower(v, w, Py_None);
1128 Py_DECREF(v);
1129 Py_DECREF(w);
1130 PUSH(x);
1131 if (x != NULL) continue;
1132 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001133
Thomas Wouters434d0822000-08-24 20:11:32 +00001134 case INPLACE_MULTIPLY:
1135 w = POP();
1136 v = POP();
1137 x = PyNumber_InPlaceMultiply(v, w);
1138 Py_DECREF(v);
1139 Py_DECREF(w);
1140 PUSH(x);
1141 if (x != NULL) continue;
1142 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001143
Thomas Wouters434d0822000-08-24 20:11:32 +00001144 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001145 if (!_Py_QnewFlag) {
1146 w = POP();
1147 v = POP();
1148 x = PyNumber_InPlaceDivide(v, w);
1149 Py_DECREF(v);
1150 Py_DECREF(w);
1151 PUSH(x);
1152 if (x != NULL) continue;
1153 break;
1154 }
1155 /* -Qnew is in effect: fall through to
1156 INPLACE_TRUE_DIVIDE */
1157 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001158 w = POP();
1159 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001160 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001161 Py_DECREF(v);
1162 Py_DECREF(w);
1163 PUSH(x);
1164 if (x != NULL) continue;
1165 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001166
Guido van Rossum4668b002001-08-08 05:00:18 +00001167 case INPLACE_FLOOR_DIVIDE:
1168 w = POP();
1169 v = POP();
1170 x = PyNumber_InPlaceFloorDivide(v, w);
1171 Py_DECREF(v);
1172 Py_DECREF(w);
1173 PUSH(x);
1174 if (x != NULL) continue;
1175 break;
1176
Thomas Wouters434d0822000-08-24 20:11:32 +00001177 case INPLACE_MODULO:
1178 w = POP();
1179 v = POP();
1180 x = PyNumber_InPlaceRemainder(v, w);
1181 Py_DECREF(v);
1182 Py_DECREF(w);
1183 PUSH(x);
1184 if (x != NULL) continue;
1185 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001186
Thomas Wouters434d0822000-08-24 20:11:32 +00001187 case INPLACE_ADD:
1188 w = POP();
1189 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001190 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001191 /* INLINE: int + int */
1192 register long a, b, i;
1193 a = PyInt_AS_LONG(v);
1194 b = PyInt_AS_LONG(w);
1195 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001196 if ((i^a) < 0 && (i^b) < 0)
1197 goto slow_iadd;
1198 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001199 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001200 else {
1201 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001202 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001203 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001204 Py_DECREF(v);
1205 Py_DECREF(w);
1206 PUSH(x);
1207 if (x != NULL) continue;
1208 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001209
Thomas Wouters434d0822000-08-24 20:11:32 +00001210 case INPLACE_SUBTRACT:
1211 w = POP();
1212 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001213 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001214 /* INLINE: int - int */
1215 register long a, b, i;
1216 a = PyInt_AS_LONG(v);
1217 b = PyInt_AS_LONG(w);
1218 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001219 if ((i^a) < 0 && (i^~b) < 0)
1220 goto slow_isub;
1221 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001222 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001223 else {
1224 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001225 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001226 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001227 Py_DECREF(v);
1228 Py_DECREF(w);
1229 PUSH(x);
1230 if (x != NULL) continue;
1231 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001232
Thomas Wouters434d0822000-08-24 20:11:32 +00001233 case INPLACE_LSHIFT:
1234 w = POP();
1235 v = POP();
1236 x = PyNumber_InPlaceLshift(v, w);
1237 Py_DECREF(v);
1238 Py_DECREF(w);
1239 PUSH(x);
1240 if (x != NULL) continue;
1241 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001242
Thomas Wouters434d0822000-08-24 20:11:32 +00001243 case INPLACE_RSHIFT:
1244 w = POP();
1245 v = POP();
1246 x = PyNumber_InPlaceRshift(v, w);
1247 Py_DECREF(v);
1248 Py_DECREF(w);
1249 PUSH(x);
1250 if (x != NULL) continue;
1251 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001252
Thomas Wouters434d0822000-08-24 20:11:32 +00001253 case INPLACE_AND:
1254 w = POP();
1255 v = POP();
1256 x = PyNumber_InPlaceAnd(v, w);
1257 Py_DECREF(v);
1258 Py_DECREF(w);
1259 PUSH(x);
1260 if (x != NULL) continue;
1261 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001262
Thomas Wouters434d0822000-08-24 20:11:32 +00001263 case INPLACE_XOR:
1264 w = POP();
1265 v = POP();
1266 x = PyNumber_InPlaceXor(v, w);
1267 Py_DECREF(v);
1268 Py_DECREF(w);
1269 PUSH(x);
1270 if (x != NULL) continue;
1271 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001272
Thomas Wouters434d0822000-08-24 20:11:32 +00001273 case INPLACE_OR:
1274 w = POP();
1275 v = POP();
1276 x = PyNumber_InPlaceOr(v, w);
1277 Py_DECREF(v);
1278 Py_DECREF(w);
1279 PUSH(x);
1280 if (x != NULL) continue;
1281 break;
1282
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 case SLICE+0:
1284 case SLICE+1:
1285 case SLICE+2:
1286 case SLICE+3:
1287 if ((opcode-SLICE) & 2)
1288 w = POP();
1289 else
1290 w = NULL;
1291 if ((opcode-SLICE) & 1)
1292 v = POP();
1293 else
1294 v = NULL;
1295 u = POP();
1296 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 Py_DECREF(u);
1298 Py_XDECREF(v);
1299 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001301 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001303
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 case STORE_SLICE+0:
1305 case STORE_SLICE+1:
1306 case STORE_SLICE+2:
1307 case STORE_SLICE+3:
1308 if ((opcode-STORE_SLICE) & 2)
1309 w = POP();
1310 else
1311 w = NULL;
1312 if ((opcode-STORE_SLICE) & 1)
1313 v = POP();
1314 else
1315 v = NULL;
1316 u = POP();
1317 t = POP();
1318 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 Py_DECREF(t);
1320 Py_DECREF(u);
1321 Py_XDECREF(v);
1322 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001323 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001325
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 case DELETE_SLICE+0:
1327 case DELETE_SLICE+1:
1328 case DELETE_SLICE+2:
1329 case DELETE_SLICE+3:
1330 if ((opcode-DELETE_SLICE) & 2)
1331 w = POP();
1332 else
1333 w = NULL;
1334 if ((opcode-DELETE_SLICE) & 1)
1335 v = POP();
1336 else
1337 v = NULL;
1338 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001339 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001341 Py_DECREF(u);
1342 Py_XDECREF(v);
1343 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001344 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001346
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 case STORE_SUBSCR:
1348 w = POP();
1349 v = POP();
1350 u = POP();
1351 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001352 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 Py_DECREF(u);
1354 Py_DECREF(v);
1355 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001356 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001358
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 case DELETE_SUBSCR:
1360 w = POP();
1361 v = POP();
1362 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001363 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001364 Py_DECREF(v);
1365 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001366 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001368
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 case PRINT_EXPR:
1370 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001371 w = PySys_GetObject("displayhook");
1372 if (w == NULL) {
1373 PyErr_SetString(PyExc_RuntimeError,
1374 "lost sys.displayhook");
1375 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001376 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001377 }
1378 if (err == 0) {
1379 x = Py_BuildValue("(O)", v);
1380 if (x == NULL)
1381 err = -1;
1382 }
1383 if (err == 0) {
1384 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001385 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001386 if (w == NULL)
1387 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001390 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001392
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001393 case PRINT_ITEM_TO:
1394 w = stream = POP();
1395 /* fall through to PRINT_ITEM */
1396
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 case PRINT_ITEM:
1398 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001399 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001400 w = PySys_GetObject("stdout");
1401 if (w == NULL) {
1402 PyErr_SetString(PyExc_RuntimeError,
1403 "lost sys.stdout");
1404 err = -1;
1405 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001406 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001407 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001408 err = PyFile_WriteString(" ", w);
1409 if (err == 0)
1410 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001411 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001412 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001413 if (PyString_Check(v)) {
1414 char *s = PyString_AS_STRING(v);
1415 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001416 if (len == 0 ||
1417 !isspace(Py_CHARMASK(s[len-1])) ||
1418 s[len-1] == ' ')
1419 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001420 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001421#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001422 else if (PyUnicode_Check(v)) {
1423 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1424 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001425 if (len == 0 ||
1426 !Py_UNICODE_ISSPACE(s[len-1]) ||
1427 s[len-1] == ' ')
1428 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001429 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001430#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001431 else
1432 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001434 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001435 Py_XDECREF(stream);
1436 stream = NULL;
1437 if (err == 0)
1438 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001440
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001441 case PRINT_NEWLINE_TO:
1442 w = stream = POP();
1443 /* fall through to PRINT_NEWLINE */
1444
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001446 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001447 w = PySys_GetObject("stdout");
1448 if (w == NULL)
1449 PyErr_SetString(PyExc_RuntimeError,
1450 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001451 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001452 if (w != NULL) {
1453 err = PyFile_WriteString("\n", w);
1454 if (err == 0)
1455 PyFile_SoftSpace(w, 0);
1456 }
1457 Py_XDECREF(stream);
1458 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001460
Thomas Wouters434d0822000-08-24 20:11:32 +00001461
1462#ifdef CASE_TOO_BIG
1463 default: switch (opcode) {
1464#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 case BREAK_LOOP:
1466 why = WHY_BREAK;
1467 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001468
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001469 case CONTINUE_LOOP:
1470 retval = PyInt_FromLong(oparg);
1471 why = WHY_CONTINUE;
1472 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001473
Guido van Rossumf10570b1995-07-07 22:53:21 +00001474 case RAISE_VARARGS:
1475 u = v = w = NULL;
1476 switch (oparg) {
1477 case 3:
1478 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001479 /* Fallthrough */
1480 case 2:
1481 v = POP(); /* value */
1482 /* Fallthrough */
1483 case 1:
1484 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001485 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001486 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001487 break;
1488 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001489 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001490 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001491 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001492 break;
1493 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001495
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001497 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001498 PyErr_SetString(PyExc_SystemError,
1499 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001500 break;
1501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001503 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001505
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 case RETURN_VALUE:
1507 retval = POP();
1508 why = WHY_RETURN;
1509 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001510
Tim Peters5ca576e2001-06-18 22:08:13 +00001511 case YIELD_VALUE:
1512 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001513 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001514 f->f_lasti = INSTR_OFFSET();
1515 why = WHY_YIELD;
1516 break;
1517
1518
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001519 case EXEC_STMT:
1520 w = POP();
1521 v = POP();
1522 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001523 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 Py_DECREF(u);
1525 Py_DECREF(v);
1526 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case POP_BLOCK:
1530 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 while (STACK_LEVEL() > b->b_level) {
1533 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 }
1536 }
1537 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001538
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 case END_FINALLY:
1540 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 if (PyInt_Check(v)) {
1542 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001543 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001544 why == WHY_YIELD ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00001545 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001546 retval = POP();
1547 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001548 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001553 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 else if (v != Py_None) {
1556 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 "'finally' pops bad exception");
1558 why = WHY_EXCEPTION;
1559 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001562
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001564 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001566 w = POP();
1567 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 Py_DECREF(u);
1570 Py_DECREF(v);
1571 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001573
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 case STORE_NAME:
1575 w = GETNAMEV(oparg);
1576 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001577 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001578 PyErr_Format(PyExc_SystemError,
1579 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001580 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001581 break;
1582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 err = PyDict_SetItem(x, w, v);
1584 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001586
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001588 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001590 PyErr_Format(PyExc_SystemError,
1591 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001592 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 break;
1594 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001596 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001597 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001599
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001600 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001602 if (PyTuple_Check(v)) {
1603 if (PyTuple_Size(v) != oparg) {
1604 PyErr_SetString(PyExc_ValueError,
1605 "unpack tuple of wrong size");
1606 why = WHY_EXCEPTION;
1607 }
1608 else {
1609 for (; --oparg >= 0; ) {
1610 w = PyTuple_GET_ITEM(v, oparg);
1611 Py_INCREF(w);
1612 PUSH(w);
1613 }
1614 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001616 else if (PyList_Check(v)) {
1617 if (PyList_Size(v) != oparg) {
1618 PyErr_SetString(PyExc_ValueError,
1619 "unpack list of wrong size");
1620 why = WHY_EXCEPTION;
1621 }
1622 else {
1623 for (; --oparg >= 0; ) {
1624 w = PyList_GET_ITEM(v, oparg);
1625 Py_INCREF(w);
1626 PUSH(w);
1627 }
1628 }
1629 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001630 else if (unpack_iterable(v, oparg,
1631 stack_pointer + oparg))
1632 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001633 else {
1634 if (PyErr_ExceptionMatches(PyExc_TypeError))
1635 PyErr_SetString(PyExc_TypeError,
1636 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001637 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001638 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001639 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001641
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001643 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 v = POP();
1645 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1647 Py_DECREF(v);
1648 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001650
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001652 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001654 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1655 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001658
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001659 case STORE_GLOBAL:
1660 w = GETNAMEV(oparg);
1661 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 err = PyDict_SetItem(f->f_globals, w, v);
1663 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001664 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001665
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001666 case DELETE_GLOBAL:
1667 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001669 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001670 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001671 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001672
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001674 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001675 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001676 PyErr_Format(PyExc_SystemError,
1677 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001678 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 break;
1680 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001683 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001687 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001688 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001689 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 break;
1691 }
1692 }
1693 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001694 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 PUSH(x);
1696 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001697
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001699 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001702 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001704 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001705 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001706 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 break;
1708 }
1709 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 PUSH(x);
1712 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001713
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001714 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001715 x = GETLOCAL(oparg);
1716 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001717 format_exc_check_arg(
1718 PyExc_UnboundLocalError,
1719 UNBOUNDLOCAL_ERROR_MSG,
1720 PyTuple_GetItem(co->co_varnames, oparg)
1721 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001722 break;
1723 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001726
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001727 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001728 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001729 Py_INCREF(x);
1730 PUSH(x);
1731 break;
1732
1733 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001734 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001735 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001736 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001737 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001738 v = PyTuple_GetItem(co->co_cellvars,
1739 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001740 format_exc_check_arg(
1741 PyExc_UnboundLocalError,
1742 UNBOUNDLOCAL_ERROR_MSG,
1743 v);
1744 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001745 v = PyTuple_GetItem(
1746 co->co_freevars,
1747 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001748 format_exc_check_arg(
1749 PyExc_NameError,
1750 UNBOUNDFREE_ERROR_MSG,
1751 v);
1752 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001753 err = -1;
1754 break;
1755 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001756 PUSH(w);
1757 break;
1758
1759 case STORE_DEREF:
1760 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001761 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001762 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001763 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001764 continue;
1765
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 if (x != NULL) {
1769 for (; --oparg >= 0;) {
1770 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001771 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 }
1773 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001774 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 }
1776 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001777
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 if (x != NULL) {
1781 for (; --oparg >= 0;) {
1782 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001783 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 }
1785 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001786 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 }
1788 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001789
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001791 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001793 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001795
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001797 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001799 x = PyObject_GetAttr(v, w);
1800 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001802 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001804
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 case COMPARE_OP:
1806 w = POP();
1807 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001808 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001809 /* INLINE: cmp(int, int) */
1810 register long a, b;
1811 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001812 a = PyInt_AS_LONG(v);
1813 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001814 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001815 case PyCmp_LT: res = a < b; break;
1816 case PyCmp_LE: res = a <= b; break;
1817 case PyCmp_EQ: res = a == b; break;
1818 case PyCmp_NE: res = a != b; break;
1819 case PyCmp_GT: res = a > b; break;
1820 case PyCmp_GE: res = a >= b; break;
1821 case PyCmp_IS: res = v == w; break;
1822 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001823 default: goto slow_compare;
1824 }
1825 x = res ? Py_True : Py_False;
1826 Py_INCREF(x);
1827 }
1828 else {
1829 slow_compare:
1830 x = cmp_outcome(oparg, v, w);
1831 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001832 Py_DECREF(v);
1833 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001834 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001835 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001836 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001837
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001839 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001840 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001841 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001842 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001843 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001844 break;
1845 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001846 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001848 w,
1849 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001850 f->f_locals == NULL ?
1851 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001852 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001853 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001854 if (w == NULL) {
1855 x = NULL;
1856 break;
1857 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001858 x = PyEval_CallObject(x, w);
1859 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001860 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001861 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001863
Thomas Wouters52152252000-08-17 22:55:00 +00001864 case IMPORT_STAR:
1865 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001866 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001867 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001868 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001869 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001870 break;
1871 }
Thomas Wouters52152252000-08-17 22:55:00 +00001872 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001873 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001874 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001875 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001876 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001877
Thomas Wouters52152252000-08-17 22:55:00 +00001878 case IMPORT_FROM:
1879 w = GETNAMEV(oparg);
1880 v = TOP();
1881 x = import_from(v, w);
1882 PUSH(x);
1883 if (x != NULL) continue;
1884 break;
1885
Guido van Rossum374a9221991-04-04 10:40:29 +00001886 case JUMP_FORWARD:
1887 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001888 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001889
Guido van Rossum374a9221991-04-04 10:40:29 +00001890 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001891 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001892 if (err > 0)
1893 err = 0;
1894 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001895 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001896 else
1897 break;
1898 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001899
Guido van Rossum374a9221991-04-04 10:40:29 +00001900 case JUMP_IF_TRUE:
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;
Guido van Rossum374a9221991-04-04 10:40:29 +00001904 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001905 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001906 else if (err == 0)
1907 ;
1908 else
1909 break;
1910 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001911
Guido van Rossum374a9221991-04-04 10:40:29 +00001912 case JUMP_ABSOLUTE:
1913 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001914 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001915
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001916 case GET_ITER:
1917 /* before: [obj]; after [getiter(obj)] */
1918 v = POP();
1919 x = PyObject_GetIter(v);
1920 Py_DECREF(v);
1921 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001922 PUSH(x);
1923 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001924 }
1925 break;
1926
1927 case FOR_ITER:
1928 /* before: [iter]; after: [iter, iter()] *or* [] */
1929 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001930 x = PyIter_Next(v);
1931 if (x != NULL) {
1932 PUSH(x);
1933 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001934 }
Tim Petersf4848da2001-05-05 00:14:56 +00001935 if (!PyErr_Occurred()) {
1936 /* iterator ended normally */
1937 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001938 Py_DECREF(v);
1939 JUMPBY(oparg);
1940 continue;
1941 }
1942 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001943
Guido van Rossum374a9221991-04-04 10:40:29 +00001944 case SETUP_LOOP:
1945 case SETUP_EXCEPT:
1946 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001947 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001948 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001949 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001950
Guido van Rossumf10570b1995-07-07 22:53:21 +00001951 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001952 {
1953 int na = oparg & 0xff;
1954 int nk = (oparg>>8) & 0xff;
1955 int n = na + 2 * nk;
1956 PyObject **pfunc = stack_pointer - n - 1;
1957 PyObject *func = *pfunc;
1958 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1959
1960 /* Always dispatch PyCFunction first, because
1961 these are presumed to be the most frequent
1962 callable object.
1963 */
1964 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001965 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001966 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001967 x = do_call(func, &stack_pointer,
1968 na, nk);
1969 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001970 PyObject *callargs;
1971 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001972 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001973 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001974 } else
1975 x = fast_cfunction(func,
1976 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001977 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001978 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 && PyMethod_GET_SELF(func) != NULL) {
1980 /* optimize access to bound methods */
1981 PyObject *self = PyMethod_GET_SELF(func);
1982 Py_INCREF(self);
1983 func = PyMethod_GET_FUNCTION(func);
1984 Py_INCREF(func);
1985 Py_DECREF(*pfunc);
1986 *pfunc = self;
1987 na++;
1988 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001989 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001990 Py_INCREF(func);
1991 if (PyFunction_Check(func)) {
1992 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001993 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001994 } else {
1995 x = do_call(func, &stack_pointer,
1996 na, nk);
1997 }
1998 Py_DECREF(func);
1999 }
2000
2001 while (stack_pointer > pfunc) {
2002 w = POP();
2003 Py_DECREF(w);
2004 }
2005 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002006 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002007 continue;
2008 break;
2009 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002010
Jeremy Hylton76901512000-03-28 23:49:17 +00002011 case CALL_FUNCTION_VAR:
2012 case CALL_FUNCTION_KW:
2013 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002014 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002015 int na = oparg & 0xff;
2016 int nk = (oparg>>8) & 0xff;
2017 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002018 int n = na + 2 * nk;
2019 PyObject **pfunc, *func;
2020 if (flags & CALL_FLAG_VAR)
2021 n++;
2022 if (flags & CALL_FLAG_KW)
2023 n++;
2024 pfunc = stack_pointer - n - 1;
2025 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002026 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002027
Guido van Rossumac7be682001-01-17 15:42:30 +00002028 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002029 && PyMethod_GET_SELF(func) != NULL) {
2030 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002031 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002032 func = PyMethod_GET_FUNCTION(func);
2033 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002034 Py_DECREF(*pfunc);
2035 *pfunc = self;
2036 na++;
2037 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002038 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002039 Py_INCREF(func);
2040 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002041 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002042
Jeremy Hylton76901512000-03-28 23:49:17 +00002043 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002044 w = POP();
2045 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002046 }
2047 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002048 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002049 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002050 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002051 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002052
Guido van Rossum681d79a1995-07-18 14:51:37 +00002053 case MAKE_FUNCTION:
2054 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002055 x = PyFunction_New(v, f->f_globals);
2056 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002057 /* XXX Maybe this should be a separate opcode? */
2058 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002062 x = NULL;
2063 break;
2064 }
2065 while (--oparg >= 0) {
2066 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002067 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002068 }
2069 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002071 }
2072 PUSH(x);
2073 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002074
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002075 case MAKE_CLOSURE:
2076 {
2077 int nfree;
2078 v = POP(); /* code object */
2079 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002080 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002081 Py_DECREF(v);
2082 /* XXX Maybe this should be a separate opcode? */
2083 if (x != NULL && nfree > 0) {
2084 v = PyTuple_New(nfree);
2085 if (v == NULL) {
2086 Py_DECREF(x);
2087 x = NULL;
2088 break;
2089 }
2090 while (--nfree >= 0) {
2091 w = POP();
2092 PyTuple_SET_ITEM(v, nfree, w);
2093 }
2094 err = PyFunction_SetClosure(x, v);
2095 Py_DECREF(v);
2096 }
2097 if (x != NULL && oparg > 0) {
2098 v = PyTuple_New(oparg);
2099 if (v == NULL) {
2100 Py_DECREF(x);
2101 x = NULL;
2102 break;
2103 }
2104 while (--oparg >= 0) {
2105 w = POP();
2106 PyTuple_SET_ITEM(v, oparg, w);
2107 }
2108 err = PyFunction_SetDefaults(x, v);
2109 Py_DECREF(v);
2110 }
2111 PUSH(x);
2112 break;
2113 }
2114
Guido van Rossum8861b741996-07-30 16:49:37 +00002115 case BUILD_SLICE:
2116 if (oparg == 3)
2117 w = POP();
2118 else
2119 w = NULL;
2120 v = POP();
2121 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002122 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 Py_DECREF(u);
2124 Py_DECREF(v);
2125 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002126 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002127 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002128 break;
2129
Fred Drakeef8ace32000-08-24 00:32:09 +00002130 case EXTENDED_ARG:
2131 opcode = NEXTOP();
2132 oparg = oparg<<16 | NEXTARG();
2133 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002134
Guido van Rossum374a9221991-04-04 10:40:29 +00002135 default:
2136 fprintf(stderr,
2137 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002138 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002140 why = WHY_EXCEPTION;
2141 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002142
2143#ifdef CASE_TOO_BIG
2144 }
2145#endif
2146
Guido van Rossum374a9221991-04-04 10:40:29 +00002147 } /* switch */
2148
2149 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002150
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002152
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002154 if (err == 0 && x != NULL) {
2155#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002156 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002157 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002158 fprintf(stderr,
2159 "XXX undetected error\n");
2160 else
2161#endif
2162 continue; /* Normal, fast path */
2163 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 err = 0;
2167 }
2168
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002170
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002173 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002174 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 why = WHY_EXCEPTION;
2176 }
2177 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002178#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002180 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182 fprintf(stderr,
2183 "XXX undetected error (why=%d)\n",
2184 why);
2185 why = WHY_EXCEPTION;
2186 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 }
2188#endif
2189
2190 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002191
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002193 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002195 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002197
Fred Drake8f51f542001-10-04 14:48:42 +00002198 if (tstate->c_tracefunc != NULL)
2199 call_exc_trace(tstate->c_tracefunc,
2200 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002201 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002202
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002204
Guido van Rossum374a9221991-04-04 10:40:29 +00002205 if (why == WHY_RERAISE)
2206 why = WHY_EXCEPTION;
2207
2208 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002209
Tim Peters5ca576e2001-06-18 22:08:13 +00002210 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002211 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002212
2213 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2214 /* For a continue inside a try block,
2215 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002216 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2217 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002218 why = WHY_NOT;
2219 JUMPTO(PyInt_AS_LONG(retval));
2220 Py_DECREF(retval);
2221 break;
2222 }
2223
Guido van Rossum374a9221991-04-04 10:40:29 +00002224 while (STACK_LEVEL() > b->b_level) {
2225 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 }
2228 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2229 why = WHY_NOT;
2230 JUMPTO(b->b_handler);
2231 break;
2232 }
2233 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002234 (b->b_type == SETUP_EXCEPT &&
2235 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002236 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002237 PyObject *exc, *val, *tb;
2238 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002239 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002240 val = Py_None;
2241 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002242 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002243 /* Make the raw exception data
2244 available to the handler,
2245 so a program can emulate the
2246 Python main loop. Don't do
2247 this for 'finally'. */
2248 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002249 PyErr_NormalizeException(
2250 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002251 set_exc_info(tstate,
2252 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002254 if (tb == NULL) {
2255 Py_INCREF(Py_None);
2256 PUSH(Py_None);
2257 } else
2258 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002259 PUSH(val);
2260 PUSH(exc);
2261 }
2262 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002263 if (why == WHY_RETURN ||
Guido van Rossumc5fe5eb2002-06-12 03:45:21 +00002264 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00002265 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002266 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002267 PUSH(v);
2268 }
2269 why = WHY_NOT;
2270 JUMPTO(b->b_handler);
2271 break;
2272 }
2273 } /* unwind stack */
2274
2275 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002276
Guido van Rossum374a9221991-04-04 10:40:29 +00002277 if (why != WHY_NOT)
2278 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002279
Guido van Rossum374a9221991-04-04 10:40:29 +00002280 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002281
Guido van Rossum35974fb2001-12-06 21:28:18 +00002282 if (why != WHY_YIELD) {
2283 /* Pop remaining stack entries -- but when yielding */
2284 while (!EMPTY()) {
2285 v = POP();
2286 Py_XDECREF(v);
2287 }
2288 }
2289
Tim Peters5ca576e2001-06-18 22:08:13 +00002290 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002291 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002292
Fred Drake9e3ad782001-07-03 23:39:52 +00002293 if (tstate->use_tracing) {
2294 if (tstate->c_tracefunc
2295 && (why == WHY_RETURN || why == WHY_YIELD)) {
2296 if (call_trace(tstate->c_tracefunc,
2297 tstate->c_traceobj, f,
2298 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002299 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002300 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002301 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002302 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002303 }
Fred Drake8f51f542001-10-04 14:48:42 +00002304 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002305 if (why == WHY_EXCEPTION)
2306 call_trace_protected(tstate->c_profilefunc,
2307 tstate->c_profileobj, f,
2308 PyTrace_RETURN);
2309 else if (call_trace(tstate->c_profilefunc,
2310 tstate->c_profileobj, f,
2311 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002312 Py_XDECREF(retval);
2313 retval = NULL;
2314 why = WHY_EXCEPTION;
2315 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002316 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002317 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002318
Guido van Rossuma027efa1997-05-05 20:56:21 +00002319 reset_exc_info(tstate);
2320
Tim Peters5ca576e2001-06-18 22:08:13 +00002321 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002322 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002323 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002324
Guido van Rossum96a42c81992-01-12 02:29:51 +00002325 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002326}
2327
Tim Peters6d6c1a32001-08-02 04:15:00 +00002328PyObject *
2329PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002330 PyObject **args, int argcount, PyObject **kws, int kwcount,
2331 PyObject **defs, int defcount, PyObject *closure)
2332{
2333 register PyFrameObject *f;
2334 register PyObject *retval = NULL;
2335 register PyObject **fastlocals, **freevars;
2336 PyThreadState *tstate = PyThreadState_GET();
2337 PyObject *x, *u;
2338
2339 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002340 PyErr_SetString(PyExc_SystemError,
2341 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002342 return NULL;
2343 }
2344
2345 f = PyFrame_New(tstate, /*back*/
2346 co, /*code*/
2347 globals, locals);
2348 if (f == NULL)
2349 return NULL;
2350
2351 fastlocals = f->f_localsplus;
2352 freevars = f->f_localsplus + f->f_nlocals;
2353
2354 if (co->co_argcount > 0 ||
2355 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2356 int i;
2357 int n = argcount;
2358 PyObject *kwdict = NULL;
2359 if (co->co_flags & CO_VARKEYWORDS) {
2360 kwdict = PyDict_New();
2361 if (kwdict == NULL)
2362 goto fail;
2363 i = co->co_argcount;
2364 if (co->co_flags & CO_VARARGS)
2365 i++;
2366 SETLOCAL(i, kwdict);
2367 }
2368 if (argcount > co->co_argcount) {
2369 if (!(co->co_flags & CO_VARARGS)) {
2370 PyErr_Format(PyExc_TypeError,
2371 "%.200s() takes %s %d "
2372 "%sargument%s (%d given)",
2373 PyString_AsString(co->co_name),
2374 defcount ? "at most" : "exactly",
2375 co->co_argcount,
2376 kwcount ? "non-keyword " : "",
2377 co->co_argcount == 1 ? "" : "s",
2378 argcount);
2379 goto fail;
2380 }
2381 n = co->co_argcount;
2382 }
2383 for (i = 0; i < n; i++) {
2384 x = args[i];
2385 Py_INCREF(x);
2386 SETLOCAL(i, x);
2387 }
2388 if (co->co_flags & CO_VARARGS) {
2389 u = PyTuple_New(argcount - n);
2390 if (u == NULL)
2391 goto fail;
2392 SETLOCAL(co->co_argcount, u);
2393 for (i = n; i < argcount; i++) {
2394 x = args[i];
2395 Py_INCREF(x);
2396 PyTuple_SET_ITEM(u, i-n, x);
2397 }
2398 }
2399 for (i = 0; i < kwcount; i++) {
2400 PyObject *keyword = kws[2*i];
2401 PyObject *value = kws[2*i + 1];
2402 int j;
2403 if (keyword == NULL || !PyString_Check(keyword)) {
2404 PyErr_Format(PyExc_TypeError,
2405 "%.200s() keywords must be strings",
2406 PyString_AsString(co->co_name));
2407 goto fail;
2408 }
2409 /* XXX slow -- speed up using dictionary? */
2410 for (j = 0; j < co->co_argcount; j++) {
2411 PyObject *nm = PyTuple_GET_ITEM(
2412 co->co_varnames, j);
2413 int cmp = PyObject_RichCompareBool(
2414 keyword, nm, Py_EQ);
2415 if (cmp > 0)
2416 break;
2417 else if (cmp < 0)
2418 goto fail;
2419 }
2420 /* Check errors from Compare */
2421 if (PyErr_Occurred())
2422 goto fail;
2423 if (j >= co->co_argcount) {
2424 if (kwdict == NULL) {
2425 PyErr_Format(PyExc_TypeError,
2426 "%.200s() got an unexpected "
2427 "keyword argument '%.400s'",
2428 PyString_AsString(co->co_name),
2429 PyString_AsString(keyword));
2430 goto fail;
2431 }
2432 PyDict_SetItem(kwdict, keyword, value);
2433 }
2434 else {
2435 if (GETLOCAL(j) != NULL) {
2436 PyErr_Format(PyExc_TypeError,
2437 "%.200s() got multiple "
2438 "values for keyword "
2439 "argument '%.400s'",
2440 PyString_AsString(co->co_name),
2441 PyString_AsString(keyword));
2442 goto fail;
2443 }
2444 Py_INCREF(value);
2445 SETLOCAL(j, value);
2446 }
2447 }
2448 if (argcount < co->co_argcount) {
2449 int m = co->co_argcount - defcount;
2450 for (i = argcount; i < m; i++) {
2451 if (GETLOCAL(i) == NULL) {
2452 PyErr_Format(PyExc_TypeError,
2453 "%.200s() takes %s %d "
2454 "%sargument%s (%d given)",
2455 PyString_AsString(co->co_name),
2456 ((co->co_flags & CO_VARARGS) ||
2457 defcount) ? "at least"
2458 : "exactly",
2459 m, kwcount ? "non-keyword " : "",
2460 m == 1 ? "" : "s", i);
2461 goto fail;
2462 }
2463 }
2464 if (n > m)
2465 i = n - m;
2466 else
2467 i = 0;
2468 for (; i < defcount; i++) {
2469 if (GETLOCAL(m+i) == NULL) {
2470 PyObject *def = defs[i];
2471 Py_INCREF(def);
2472 SETLOCAL(m+i, def);
2473 }
2474 }
2475 }
2476 }
2477 else {
2478 if (argcount > 0 || kwcount > 0) {
2479 PyErr_Format(PyExc_TypeError,
2480 "%.200s() takes no arguments (%d given)",
2481 PyString_AsString(co->co_name),
2482 argcount + kwcount);
2483 goto fail;
2484 }
2485 }
2486 /* Allocate and initialize storage for cell vars, and copy free
2487 vars into frame. This isn't too efficient right now. */
2488 if (f->f_ncells) {
2489 int i = 0, j = 0, nargs, found;
2490 char *cellname, *argname;
2491 PyObject *c;
2492
2493 nargs = co->co_argcount;
2494 if (co->co_flags & CO_VARARGS)
2495 nargs++;
2496 if (co->co_flags & CO_VARKEYWORDS)
2497 nargs++;
2498
2499 /* Check for cells that shadow args */
2500 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2501 cellname = PyString_AS_STRING(
2502 PyTuple_GET_ITEM(co->co_cellvars, i));
2503 found = 0;
2504 while (j < nargs) {
2505 argname = PyString_AS_STRING(
2506 PyTuple_GET_ITEM(co->co_varnames, j));
2507 if (strcmp(cellname, argname) == 0) {
2508 c = PyCell_New(GETLOCAL(j));
2509 if (c == NULL)
2510 goto fail;
2511 GETLOCAL(f->f_nlocals + i) = c;
2512 found = 1;
2513 break;
2514 }
2515 j++;
2516 }
2517 if (found == 0) {
2518 c = PyCell_New(NULL);
2519 if (c == NULL)
2520 goto fail;
2521 SETLOCAL(f->f_nlocals + i, c);
2522 }
2523 }
2524 /* Initialize any that are left */
2525 while (i < f->f_ncells) {
2526 c = PyCell_New(NULL);
2527 if (c == NULL)
2528 goto fail;
2529 SETLOCAL(f->f_nlocals + i, c);
2530 i++;
2531 }
2532 }
2533 if (f->f_nfreevars) {
2534 int i;
2535 for (i = 0; i < f->f_nfreevars; ++i) {
2536 PyObject *o = PyTuple_GET_ITEM(closure, i);
2537 Py_INCREF(o);
2538 freevars[f->f_ncells + i] = o;
2539 }
2540 }
2541
Tim Peters5ca576e2001-06-18 22:08:13 +00002542 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002543 /* Don't need to keep the reference to f_back, it will be set
2544 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002545 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002546 f->f_back = NULL;
2547
2548 /* Create a new generator that owns the ready to run frame
2549 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002550 return gen_new(f);
2551 }
2552
2553 retval = eval_frame(f);
2554
2555 fail: /* Jump here from prelude on failure */
2556
Tim Petersb13680b2001-11-27 23:29:29 +00002557 /* decref'ing the frame can cause __del__ methods to get invoked,
2558 which can call back into Python. While we're done with the
2559 current Python frame (f), the associated C stack is still in use,
2560 so recursion_depth must be boosted for the duration.
2561 */
2562 assert(tstate != NULL);
2563 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002564 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002565 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002566 return retval;
2567}
2568
2569
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002571set_exc_info(PyThreadState *tstate,
2572 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573{
2574 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002575 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002576
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 frame = tstate->frame;
2578 if (frame->f_exc_type == NULL) {
2579 /* This frame didn't catch an exception before */
2580 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002581 if (tstate->exc_type == NULL) {
2582 Py_INCREF(Py_None);
2583 tstate->exc_type = Py_None;
2584 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002585 tmp_type = frame->f_exc_type;
2586 tmp_value = frame->f_exc_value;
2587 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002588 Py_XINCREF(tstate->exc_type);
2589 Py_XINCREF(tstate->exc_value);
2590 Py_XINCREF(tstate->exc_traceback);
2591 frame->f_exc_type = tstate->exc_type;
2592 frame->f_exc_value = tstate->exc_value;
2593 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002594 Py_XDECREF(tmp_type);
2595 Py_XDECREF(tmp_value);
2596 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597 }
2598 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002599 tmp_type = tstate->exc_type;
2600 tmp_value = tstate->exc_value;
2601 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002602 Py_XINCREF(type);
2603 Py_XINCREF(value);
2604 Py_XINCREF(tb);
2605 tstate->exc_type = type;
2606 tstate->exc_value = value;
2607 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002608 Py_XDECREF(tmp_type);
2609 Py_XDECREF(tmp_value);
2610 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 /* For b/w compatibility */
2612 PySys_SetObject("exc_type", type);
2613 PySys_SetObject("exc_value", value);
2614 PySys_SetObject("exc_traceback", tb);
2615}
2616
2617static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002618reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002619{
2620 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002621 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002622 frame = tstate->frame;
2623 if (frame->f_exc_type != NULL) {
2624 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002625 tmp_type = tstate->exc_type;
2626 tmp_value = tstate->exc_value;
2627 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002628 Py_XINCREF(frame->f_exc_type);
2629 Py_XINCREF(frame->f_exc_value);
2630 Py_XINCREF(frame->f_exc_traceback);
2631 tstate->exc_type = frame->f_exc_type;
2632 tstate->exc_value = frame->f_exc_value;
2633 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002634 Py_XDECREF(tmp_type);
2635 Py_XDECREF(tmp_value);
2636 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002637 /* For b/w compatibility */
2638 PySys_SetObject("exc_type", frame->f_exc_type);
2639 PySys_SetObject("exc_value", frame->f_exc_value);
2640 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2641 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002642 tmp_type = frame->f_exc_type;
2643 tmp_value = frame->f_exc_value;
2644 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002645 frame->f_exc_type = NULL;
2646 frame->f_exc_value = NULL;
2647 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002648 Py_XDECREF(tmp_type);
2649 Py_XDECREF(tmp_value);
2650 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002651}
2652
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002653/* Logic for the raise statement (too complicated for inlining).
2654 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002655static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002656do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002657{
Guido van Rossumd295f121998-04-09 21:39:57 +00002658 if (type == NULL) {
2659 /* Reraise */
2660 PyThreadState *tstate = PyThreadState_Get();
2661 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2662 value = tstate->exc_value;
2663 tb = tstate->exc_traceback;
2664 Py_XINCREF(type);
2665 Py_XINCREF(value);
2666 Py_XINCREF(tb);
2667 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002668
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002669 /* We support the following forms of raise:
2670 raise <class>, <classinstance>
2671 raise <class>, <argument tuple>
2672 raise <class>, None
2673 raise <class>, <argument>
2674 raise <classinstance>, None
2675 raise <string>, <object>
2676 raise <string>, None
2677
2678 An omitted second argument is the same as None.
2679
2680 In addition, raise <tuple>, <anything> is the same as
2681 raising the tuple's first item (and it better have one!);
2682 this rule is applied recursively.
2683
2684 Finally, an optional third argument can be supplied, which
2685 gives the traceback to be substituted (useful when
2686 re-raising an exception after examining it). */
2687
2688 /* First, check the traceback argument, replacing None with
2689 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 if (tb == Py_None) {
2691 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002692 tb = NULL;
2693 }
2694 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002696 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002697 goto raise_error;
2698 }
2699
2700 /* Next, replace a missing value with None */
2701 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002702 value = Py_None;
2703 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002704 }
2705
2706 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002707 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2708 PyObject *tmp = type;
2709 type = PyTuple_GET_ITEM(type, 0);
2710 Py_INCREF(type);
2711 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002712 }
2713
Tim Petersafb2c802002-04-18 18:06:20 +00002714 if (PyString_CheckExact(type))
2715 /* Raising builtin string is deprecated but still allowed --
2716 * do nothing. Raising an instance of a new-style str
2717 * subclass is right out. */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002718 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002719
2720 else if (PyClass_Check(type))
2721 PyErr_NormalizeException(&type, &value, &tb);
2722
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002724 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002725 if (value != Py_None) {
2726 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002727 "instance exception may not have a separate value");
2728 goto raise_error;
2729 }
2730 else {
2731 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2735 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 }
2737 }
2738 else {
2739 /* Not something you can raise. You get an exception
2740 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002741 PyErr_Format(PyExc_TypeError,
2742 "exceptions must be strings, classes, or "
2743 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002744 goto raise_error;
2745 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002747 if (tb == NULL)
2748 return WHY_EXCEPTION;
2749 else
2750 return WHY_RERAISE;
2751 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 Py_XDECREF(value);
2753 Py_XDECREF(type);
2754 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002755 return WHY_EXCEPTION;
2756}
2757
Tim Petersd6d010b2001-06-21 02:49:55 +00002758/* Iterate v argcnt times and store the results on the stack (via decreasing
2759 sp). Return 1 for success, 0 if error. */
2760
Barry Warsawe42b18f1997-08-25 22:13:04 +00002761static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002762unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002763{
Tim Petersd6d010b2001-06-21 02:49:55 +00002764 int i = 0;
2765 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002766 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002767
Tim Petersd6d010b2001-06-21 02:49:55 +00002768 assert(v != NULL);
2769
2770 it = PyObject_GetIter(v);
2771 if (it == NULL)
2772 goto Error;
2773
2774 for (; i < argcnt; i++) {
2775 w = PyIter_Next(it);
2776 if (w == NULL) {
2777 /* Iterator done, via error or exhaustion. */
2778 if (!PyErr_Occurred()) {
2779 PyErr_Format(PyExc_ValueError,
2780 "need more than %d value%s to unpack",
2781 i, i == 1 ? "" : "s");
2782 }
2783 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002784 }
2785 *--sp = w;
2786 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002787
2788 /* We better have exhausted the iterator now. */
2789 w = PyIter_Next(it);
2790 if (w == NULL) {
2791 if (PyErr_Occurred())
2792 goto Error;
2793 Py_DECREF(it);
2794 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002795 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002796 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002797 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002798 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002799Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002800 for (; i > 0; i--, sp++)
2801 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002802 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002803 return 0;
2804}
2805
2806
Guido van Rossum96a42c81992-01-12 02:29:51 +00002807#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002808static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002809prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 if (PyObject_Print(v, stdout, 0) != 0)
2813 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002815 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002817#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002818
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002819static void
Fred Drake5755ce62001-06-27 19:19:46 +00002820call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002821{
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002823 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002825 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002826 value = Py_None;
2827 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002828 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002830 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002832 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002833 }
Fred Drake5755ce62001-06-27 19:19:46 +00002834 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002835 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002836 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002837 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002838 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002839 Py_XDECREF(type);
2840 Py_XDECREF(value);
2841 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002842 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002843}
2844
Fred Drake4ec5d562001-10-04 19:26:43 +00002845static void
2846call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2847 int what)
2848{
2849 PyObject *type, *value, *traceback;
2850 int err;
2851 PyErr_Fetch(&type, &value, &traceback);
2852 err = call_trace(func, obj, frame, what, NULL);
2853 if (err == 0)
2854 PyErr_Restore(type, value, traceback);
2855 else {
2856 Py_XDECREF(type);
2857 Py_XDECREF(value);
2858 Py_XDECREF(traceback);
2859 }
2860}
2861
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002862static int
Fred Drake5755ce62001-06-27 19:19:46 +00002863call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2864 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002865{
Fred Drake5755ce62001-06-27 19:19:46 +00002866 register PyThreadState *tstate = frame->f_tstate;
2867 int result;
2868 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002869 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002870 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002871 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002872 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002873 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2874 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002875 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002876 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002877}
2878
Fred Drake5755ce62001-06-27 19:19:46 +00002879void
2880PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002881{
Fred Drake5755ce62001-06-27 19:19:46 +00002882 PyThreadState *tstate = PyThreadState_Get();
2883 PyObject *temp = tstate->c_profileobj;
2884 Py_XINCREF(arg);
2885 tstate->c_profilefunc = NULL;
2886 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002887 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002888 Py_XDECREF(temp);
2889 tstate->c_profilefunc = func;
2890 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002891 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002892}
2893
2894void
2895PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2896{
2897 PyThreadState *tstate = PyThreadState_Get();
2898 PyObject *temp = tstate->c_traceobj;
2899 Py_XINCREF(arg);
2900 tstate->c_tracefunc = NULL;
2901 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002902 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002903 Py_XDECREF(temp);
2904 tstate->c_tracefunc = func;
2905 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002906 tstate->use_tracing = ((func != NULL)
2907 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002908}
2909
Guido van Rossumb209a111997-04-29 18:18:01 +00002910PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002912{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002913 PyThreadState *tstate = PyThreadState_Get();
2914 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002915 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002916 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002917 else
2918 return current_frame->f_builtins;
2919}
2920
Guido van Rossumb209a111997-04-29 18:18:01 +00002921PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002922PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002923{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002924 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002925 if (current_frame == NULL)
2926 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002927 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002928 return current_frame->f_locals;
2929}
2930
Guido van Rossumb209a111997-04-29 18:18:01 +00002931PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002932PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002933{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002934 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002935 if (current_frame == NULL)
2936 return NULL;
2937 else
2938 return current_frame->f_globals;
2939}
2940
Guido van Rossumb209a111997-04-29 18:18:01 +00002941PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002942PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002943{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002944 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002945 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002946}
2947
Guido van Rossum6135a871995-01-09 17:53:26 +00002948int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002949PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002950{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002951 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002952 return current_frame == NULL ? 0 : current_frame->f_restricted;
2953}
2954
Guido van Rossumbe270261997-05-22 22:26:18 +00002955int
Tim Peters5ba58662001-07-16 02:29:45 +00002956PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002957{
2958 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002959 int result = 0;
2960
2961 if (current_frame != NULL) {
2962 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002963 const int compilerflags = codeflags & PyCF_MASK;
2964 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002965 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002966 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002967 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002968#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002969 if (codeflags & CO_GENERATOR_ALLOWED) {
2970 result = 1;
2971 cf->cf_flags |= CO_GENERATOR_ALLOWED;
2972 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002973#endif
Tim Peters5ba58662001-07-16 02:29:45 +00002974 }
2975 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002976}
2977
2978int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002979Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980{
Guido van Rossumb209a111997-04-29 18:18:01 +00002981 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002982 if (f == NULL)
2983 return 0;
2984 if (!PyFile_SoftSpace(f, 0))
2985 return 0;
2986 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002987}
2988
Guido van Rossum3f5da241990-12-20 15:06:42 +00002989
Guido van Rossum681d79a1995-07-18 14:51:37 +00002990/* External interface to call any callable object.
2991 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002992
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002993#undef PyEval_CallObject
2994/* for backward compatibility: export this interface */
2995
Guido van Rossumb209a111997-04-29 18:18:01 +00002996PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002997PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002998{
Guido van Rossumb209a111997-04-29 18:18:01 +00002999 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003000}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003001#define PyEval_CallObject(func,arg) \
3002 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003003
Guido van Rossumb209a111997-04-29 18:18:01 +00003004PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003005PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003006{
Jeremy Hylton52820442001-01-03 23:52:36 +00003007 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003008
3009 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003010 arg = PyTuple_New(0);
3011 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003012 PyErr_SetString(PyExc_TypeError,
3013 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003014 return NULL;
3015 }
3016 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003017 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018
Guido van Rossumb209a111997-04-29 18:18:01 +00003019 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003020 PyErr_SetString(PyExc_TypeError,
3021 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003022 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003023 return NULL;
3024 }
3025
Tim Peters6d6c1a32001-08-02 04:15:00 +00003026 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003027 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003028 return result;
3029}
3030
Tim Peters6d6c1a32001-08-02 04:15:00 +00003031char *
3032PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003033{
3034 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003035 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003036 else if (PyFunction_Check(func))
3037 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3038 else if (PyCFunction_Check(func))
3039 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3040 else if (PyClass_Check(func))
3041 return PyString_AsString(((PyClassObject*)func)->cl_name);
3042 else if (PyInstance_Check(func)) {
3043 return PyString_AsString(
3044 ((PyInstanceObject*)func)->in_class->cl_name);
3045 } else {
3046 return func->ob_type->tp_name;
3047 }
3048}
3049
Tim Peters6d6c1a32001-08-02 04:15:00 +00003050char *
3051PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003052{
3053 if (PyMethod_Check(func))
3054 return "()";
3055 else if (PyFunction_Check(func))
3056 return "()";
3057 else if (PyCFunction_Check(func))
3058 return "()";
3059 else if (PyClass_Check(func))
3060 return " constructor";
3061 else if (PyInstance_Check(func)) {
3062 return " instance";
3063 } else {
3064 return " object";
3065 }
3066}
3067
Jeremy Hylton52820442001-01-03 23:52:36 +00003068#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3069
3070/* The two fast_xxx() functions optimize calls for which no argument
3071 tuple is necessary; the objects are passed directly from the stack.
3072 fast_cfunction() is called for METH_OLDARGS functions.
3073 fast_function() is for functions with no special argument handling.
3074*/
3075
3076static PyObject *
3077fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3078{
3079 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3080 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003081 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003082
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003083 switch (flags) {
3084 case METH_OLDARGS:
3085 if (na == 0)
3086 return (*meth)(self, NULL);
3087 else if (na == 1) {
3088 PyObject *arg = EXT_POP(*pp_stack);
3089 PyObject *result = (*meth)(self, arg);
3090 Py_DECREF(arg);
3091 return result;
3092 } else {
3093 PyObject *args = load_args(pp_stack, na);
3094 PyObject *result = (*meth)(self, args);
3095 Py_DECREF(args);
3096 return result;
3097 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003098 case METH_NOARGS:
3099 if (na == 0)
3100 return (*meth)(self, NULL);
3101 PyErr_Format(PyExc_TypeError,
3102 "%.200s() takes no arguments (%d given)",
3103 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3104 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003105 case METH_O:
3106 if (na == 1) {
3107 PyObject *arg = EXT_POP(*pp_stack);
3108 PyObject *result = (*meth)(self, arg);
3109 Py_DECREF(arg);
3110 return result;
3111 }
3112 PyErr_Format(PyExc_TypeError,
3113 "%.200s() takes exactly one argument (%d given)",
3114 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3115 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003116 default:
3117 fprintf(stderr, "%.200s() flags = %d\n",
3118 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3119 PyErr_BadInternalCall();
3120 return NULL;
3121 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003122}
3123
3124static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003125fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003126{
3127 PyObject *co = PyFunction_GET_CODE(func);
3128 PyObject *globals = PyFunction_GET_GLOBALS(func);
3129 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003130 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003131 PyObject **d = NULL;
3132 int nd = 0;
3133
3134 if (argdefs != NULL) {
3135 d = &PyTuple_GET_ITEM(argdefs, 0);
3136 nd = ((PyTupleObject *)argdefs)->ob_size;
3137 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003138 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003139 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003140 (*pp_stack)-2*nk, nk, d, nd,
3141 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003142}
3143
3144static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003145update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3146 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003147{
3148 PyObject *kwdict = NULL;
3149 if (orig_kwdict == NULL)
3150 kwdict = PyDict_New();
3151 else {
3152 kwdict = PyDict_Copy(orig_kwdict);
3153 Py_DECREF(orig_kwdict);
3154 }
3155 if (kwdict == NULL)
3156 return NULL;
3157 while (--nk >= 0) {
3158 int err;
3159 PyObject *value = EXT_POP(*pp_stack);
3160 PyObject *key = EXT_POP(*pp_stack);
3161 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003162 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003163 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003164 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003165 PyEval_GetFuncName(func),
3166 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003167 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003168 Py_DECREF(key);
3169 Py_DECREF(value);
3170 Py_DECREF(kwdict);
3171 return NULL;
3172 }
3173 err = PyDict_SetItem(kwdict, key, value);
3174 Py_DECREF(key);
3175 Py_DECREF(value);
3176 if (err) {
3177 Py_DECREF(kwdict);
3178 return NULL;
3179 }
3180 }
3181 return kwdict;
3182}
3183
3184static PyObject *
3185update_star_args(int nstack, int nstar, PyObject *stararg,
3186 PyObject ***pp_stack)
3187{
3188 PyObject *callargs, *w;
3189
3190 callargs = PyTuple_New(nstack + nstar);
3191 if (callargs == NULL) {
3192 return NULL;
3193 }
3194 if (nstar) {
3195 int i;
3196 for (i = 0; i < nstar; i++) {
3197 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3198 Py_INCREF(a);
3199 PyTuple_SET_ITEM(callargs, nstack + i, a);
3200 }
3201 }
3202 while (--nstack >= 0) {
3203 w = EXT_POP(*pp_stack);
3204 PyTuple_SET_ITEM(callargs, nstack, w);
3205 }
3206 return callargs;
3207}
3208
3209static PyObject *
3210load_args(PyObject ***pp_stack, int na)
3211{
3212 PyObject *args = PyTuple_New(na);
3213 PyObject *w;
3214
3215 if (args == NULL)
3216 return NULL;
3217 while (--na >= 0) {
3218 w = EXT_POP(*pp_stack);
3219 PyTuple_SET_ITEM(args, na, w);
3220 }
3221 return args;
3222}
3223
3224static PyObject *
3225do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3226{
3227 PyObject *callargs = NULL;
3228 PyObject *kwdict = NULL;
3229 PyObject *result = NULL;
3230
3231 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003232 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003233 if (kwdict == NULL)
3234 goto call_fail;
3235 }
3236 callargs = load_args(pp_stack, na);
3237 if (callargs == NULL)
3238 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003239 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003240 call_fail:
3241 Py_XDECREF(callargs);
3242 Py_XDECREF(kwdict);
3243 return result;
3244}
3245
3246static PyObject *
3247ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3248{
3249 int nstar = 0;
3250 PyObject *callargs = NULL;
3251 PyObject *stararg = NULL;
3252 PyObject *kwdict = NULL;
3253 PyObject *result = NULL;
3254
3255 if (flags & CALL_FLAG_KW) {
3256 kwdict = EXT_POP(*pp_stack);
3257 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003258 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003259 "%s%s argument after ** "
3260 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003261 PyEval_GetFuncName(func),
3262 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003263 goto ext_call_fail;
3264 }
3265 }
3266 if (flags & CALL_FLAG_VAR) {
3267 stararg = EXT_POP(*pp_stack);
3268 if (!PyTuple_Check(stararg)) {
3269 PyObject *t = NULL;
3270 t = PySequence_Tuple(stararg);
3271 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003272 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3273 PyErr_Format(PyExc_TypeError,
3274 "%s%s argument after * "
3275 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003276 PyEval_GetFuncName(func),
3277 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003278 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003279 goto ext_call_fail;
3280 }
3281 Py_DECREF(stararg);
3282 stararg = t;
3283 }
3284 nstar = PyTuple_GET_SIZE(stararg);
3285 }
3286 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003287 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003288 if (kwdict == NULL)
3289 goto ext_call_fail;
3290 }
3291 callargs = update_star_args(na, nstar, stararg, pp_stack);
3292 if (callargs == NULL)
3293 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003294 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003295 ext_call_fail:
3296 Py_XDECREF(callargs);
3297 Py_XDECREF(kwdict);
3298 Py_XDECREF(stararg);
3299 return result;
3300}
3301
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003302#define SLICE_ERROR_MSG \
3303 "standard sequence type does not support step size other than one"
3304
Tim Peterscb479e72001-12-16 19:11:44 +00003305/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3306 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3307 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3308*/
Tim Petersb5196382001-12-16 19:44:20 +00003309/* Note: If v is NULL, return success without storing into *pi. This
3310 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3311 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003312*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003313int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003314_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315{
Tim Petersb5196382001-12-16 19:44:20 +00003316 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003317 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003318 if (PyInt_Check(v)) {
3319 x = PyInt_AsLong(v);
3320 } else if (PyLong_Check(v)) {
3321 x = PyLong_AsLong(v);
3322 if (x==-1 && PyErr_Occurred()) {
3323 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003324 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003325
Guido van Rossumac7be682001-01-17 15:42:30 +00003326 if (!PyErr_ExceptionMatches(
3327 PyExc_OverflowError)) {
3328 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003329 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003330 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003331 }
3332
Guido van Rossumac7be682001-01-17 15:42:30 +00003333 /* Clear the OverflowError */
3334 PyErr_Clear();
3335
3336 /* It's an overflow error, so we need to
3337 check the sign of the long integer,
3338 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003339 the error. */
3340
3341 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003342 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003343 if (long_zero == NULL)
3344 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003345
3346 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003347 cmp = PyObject_RichCompareBool(v, long_zero,
3348 Py_GT);
3349 Py_DECREF(long_zero);
3350 if (cmp < 0)
3351 return 0;
3352 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003353 x = INT_MAX;
3354 else
3355 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003356 }
3357 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003358 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003359 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003360 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003362 /* Truncate -- very long indices are truncated anyway */
3363 if (x > INT_MAX)
3364 x = INT_MAX;
3365 else if (x < -INT_MAX)
3366 x = 0;
3367 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003369 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370}
3371
Guido van Rossum50d756e2001-08-18 17:43:36 +00003372#undef ISINT
3373#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3374
Guido van Rossumb209a111997-04-29 18:18:01 +00003375static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003376apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003378 PyTypeObject *tp = u->ob_type;
3379 PySequenceMethods *sq = tp->tp_as_sequence;
3380
3381 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3382 int ilow = 0, ihigh = INT_MAX;
3383 if (!_PyEval_SliceIndex(v, &ilow))
3384 return NULL;
3385 if (!_PyEval_SliceIndex(w, &ihigh))
3386 return NULL;
3387 return PySequence_GetSlice(u, ilow, ihigh);
3388 }
3389 else {
3390 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003391 if (slice != NULL) {
3392 PyObject *res = PyObject_GetItem(u, slice);
3393 Py_DECREF(slice);
3394 return res;
3395 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003396 else
3397 return NULL;
3398 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003400
3401static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003402assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3403 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003404{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003405 PyTypeObject *tp = u->ob_type;
3406 PySequenceMethods *sq = tp->tp_as_sequence;
3407
3408 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3409 int ilow = 0, ihigh = INT_MAX;
3410 if (!_PyEval_SliceIndex(v, &ilow))
3411 return -1;
3412 if (!_PyEval_SliceIndex(w, &ihigh))
3413 return -1;
3414 if (x == NULL)
3415 return PySequence_DelSlice(u, ilow, ihigh);
3416 else
3417 return PySequence_SetSlice(u, ilow, ihigh, x);
3418 }
3419 else {
3420 PyObject *slice = PySlice_New(v, w, NULL);
3421 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003422 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003423 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003424 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003425 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003426 res = PyObject_DelItem(u, slice);
3427 Py_DECREF(slice);
3428 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003429 }
3430 else
3431 return -1;
3432 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433}
3434
Guido van Rossumb209a111997-04-29 18:18:01 +00003435static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003436cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437{
Guido van Rossumac7be682001-01-17 15:42:30 +00003438 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003440 case PyCmp_IS:
3441 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003442 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003443 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003444 res = !res;
3445 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003446 case PyCmp_IN:
3447 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003448 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003449 if (res < 0)
3450 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003451 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003452 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003454 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003455 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 break;
3457 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003458 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003460 v = res ? Py_True : Py_False;
3461 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003462 return v;
3463}
3464
Thomas Wouters52152252000-08-17 22:55:00 +00003465static PyObject *
3466import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003467{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003468 PyObject *x;
3469
3470 x = PyObject_GetAttr(v, name);
3471 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003472 PyErr_Format(PyExc_ImportError,
3473 "cannot import name %.230s",
3474 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003475 }
Thomas Wouters52152252000-08-17 22:55:00 +00003476 return x;
3477}
Guido van Rossumac7be682001-01-17 15:42:30 +00003478
Thomas Wouters52152252000-08-17 22:55:00 +00003479static int
3480import_all_from(PyObject *locals, PyObject *v)
3481{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003482 PyObject *all = PyObject_GetAttrString(v, "__all__");
3483 PyObject *dict, *name, *value;
3484 int skip_leading_underscores = 0;
3485 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003486
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003487 if (all == NULL) {
3488 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3489 return -1; /* Unexpected error */
3490 PyErr_Clear();
3491 dict = PyObject_GetAttrString(v, "__dict__");
3492 if (dict == NULL) {
3493 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3494 return -1;
3495 PyErr_SetString(PyExc_ImportError,
3496 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003497 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003498 }
3499 all = PyMapping_Keys(dict);
3500 Py_DECREF(dict);
3501 if (all == NULL)
3502 return -1;
3503 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003504 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003505
3506 for (pos = 0, err = 0; ; pos++) {
3507 name = PySequence_GetItem(all, pos);
3508 if (name == NULL) {
3509 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3510 err = -1;
3511 else
3512 PyErr_Clear();
3513 break;
3514 }
3515 if (skip_leading_underscores &&
3516 PyString_Check(name) &&
3517 PyString_AS_STRING(name)[0] == '_')
3518 {
3519 Py_DECREF(name);
3520 continue;
3521 }
3522 value = PyObject_GetAttr(v, name);
3523 if (value == NULL)
3524 err = -1;
3525 else
3526 err = PyDict_SetItem(locals, name, value);
3527 Py_DECREF(name);
3528 Py_XDECREF(value);
3529 if (err != 0)
3530 break;
3531 }
3532 Py_DECREF(all);
3533 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003534}
3535
Guido van Rossumb209a111997-04-29 18:18:01 +00003536static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003537build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003538{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003539 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003540
3541 if (PyDict_Check(methods))
3542 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003543 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003544 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003545 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3546 base = PyTuple_GET_ITEM(bases, 0);
3547 metaclass = PyObject_GetAttrString(base, "__class__");
3548 if (metaclass == NULL) {
3549 PyErr_Clear();
3550 metaclass = (PyObject *)base->ob_type;
3551 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003552 }
3553 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003554 else {
3555 PyObject *g = PyEval_GetGlobals();
3556 if (g != NULL && PyDict_Check(g))
3557 metaclass = PyDict_GetItemString(g, "__metaclass__");
3558 if (metaclass == NULL)
3559 metaclass = (PyObject *) &PyClass_Type;
3560 Py_INCREF(metaclass);
3561 }
3562 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3563 Py_DECREF(metaclass);
3564 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003565}
3566
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003567static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003568exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3569 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003570{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003571 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003572 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003573 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003574
Guido van Rossumb209a111997-04-29 18:18:01 +00003575 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3576 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003577 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003578 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003579 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003580 locals = PyTuple_GetItem(prog, 2);
3581 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003583 if (globals == Py_None) {
3584 globals = PyEval_GetGlobals();
3585 if (locals == Py_None) {
3586 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003587 plain = 1;
3588 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003590 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003591 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003592 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003593 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003594 !PyCode_Check(prog) &&
3595 !PyFile_Check(prog)) {
3596 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003597 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003598 return -1;
3599 }
Fred Drake661ea262000-10-24 19:57:45 +00003600 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003601 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003602 "exec: arg 2 must be a dictionary or None");
3603 return -1;
3604 }
3605 if (!PyDict_Check(locals)) {
3606 PyErr_SetString(PyExc_TypeError,
3607 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003608 return -1;
3609 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003610 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003611 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003612 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003613 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3614 PyErr_SetString(PyExc_TypeError,
3615 "code object passed to exec may not contain free variables");
3616 return -1;
3617 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003618 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003619 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003620 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003621 FILE *fp = PyFile_AsFile(prog);
3622 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003623 PyCompilerFlags cf;
3624 cf.cf_flags = 0;
3625 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003626 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3627 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003628 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003629 v = PyRun_File(fp, name, Py_file_input, globals,
3630 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003631 }
3632 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003633 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003634 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003635 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003636 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003637 cf.cf_flags = 0;
3638 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003639 v = PyRun_StringFlags(str, Py_file_input, globals,
3640 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003641 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003642 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003643 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003644 if (plain)
3645 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003646 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003647 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003648 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003649 return 0;
3650}
Guido van Rossum24c13741995-02-14 09:42:43 +00003651
Guido van Rossumac7be682001-01-17 15:42:30 +00003652static void
Paul Prescode68140d2000-08-30 20:25:01 +00003653format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3654{
3655 char *obj_str;
3656
3657 if (!obj)
3658 return;
3659
3660 obj_str = PyString_AsString(obj);
3661 if (!obj_str)
3662 return;
3663
3664 PyErr_Format(exc, format_str, obj_str);
3665}
Guido van Rossum950361c1997-01-24 13:49:28 +00003666
3667#ifdef DYNAMIC_EXECUTION_PROFILE
3668
Skip Montanarof118cb12001-10-15 20:51:38 +00003669static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003670getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003671{
3672 int i;
3673 PyObject *l = PyList_New(256);
3674 if (l == NULL) return NULL;
3675 for (i = 0; i < 256; i++) {
3676 PyObject *x = PyInt_FromLong(a[i]);
3677 if (x == NULL) {
3678 Py_DECREF(l);
3679 return NULL;
3680 }
3681 PyList_SetItem(l, i, x);
3682 }
3683 for (i = 0; i < 256; i++)
3684 a[i] = 0;
3685 return l;
3686}
3687
3688PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003689_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003690{
3691#ifndef DXPAIRS
3692 return getarray(dxp);
3693#else
3694 int i;
3695 PyObject *l = PyList_New(257);
3696 if (l == NULL) return NULL;
3697 for (i = 0; i < 257; i++) {
3698 PyObject *x = getarray(dxpairs[i]);
3699 if (x == NULL) {
3700 Py_DECREF(l);
3701 return NULL;
3702 }
3703 PyList_SetItem(l, i, x);
3704 }
3705 return l;
3706#endif
3707}
3708
3709#endif