blob: a93ceea1284b2a11bea7fe4c286bd2394189bb8a [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 *loop_subscript(PyObject *, PyObject *);
55static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
56static int assign_slice(PyObject *, PyObject *,
57 PyObject *, PyObject *);
58static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000059static PyObject *import_from(PyObject *, PyObject *);
60static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static PyObject *build_class(PyObject *, PyObject *, PyObject *);
62static int exec_statement(PyFrameObject *,
63 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
65static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000066static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Paul Prescode68140d2000-08-30 20:25:01 +000068#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000069 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000070#define GLOBAL_NAME_ERROR_MSG \
71 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000072#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000073 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000074#define UNBOUNDFREE_ERROR_MSG \
75 "free variable '%.200s' referenced before assignment" \
76 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Guido van Rossum950361c1997-01-24 13:49:28 +000078/* Dynamic execution profile */
79#ifdef DYNAMIC_EXECUTION_PROFILE
80#ifdef DXPAIRS
81static long dxpairs[257][256];
82#define dxp dxpairs[256]
83#else
84static long dxp[256];
85#endif
86#endif
87
Tim Peters5ca576e2001-06-18 22:08:13 +000088staticforward PyTypeObject gentype;
89
90typedef struct {
91 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000092 /* The gi_ prefix is intended to remind of generator-iterator. */
93
94 PyFrameObject *gi_frame;
95
Tim Peterse77f2e22001-06-26 22:24:51 +000096 /* True if generator is being executed. */
97 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000098} genobject;
99
100static PyObject *
101gen_new(PyFrameObject *f)
102{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000103 genobject *gen = PyObject_GC_New(genobject, &gentype);
Tim Peters5ca576e2001-06-18 22:08:13 +0000104 if (gen == NULL) {
105 Py_DECREF(f);
106 return NULL;
107 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000108 gen->gi_frame = f;
109 gen->gi_running = 0;
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000110 _PyObject_GC_TRACK(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000111 return (PyObject *)gen;
112}
113
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000114static int
115gen_traverse(genobject *gen, visitproc visit, void *arg)
116{
117 return visit((PyObject *)gen->gi_frame, arg);
118}
119
Tim Peters5ca576e2001-06-18 22:08:13 +0000120static void
121gen_dealloc(genobject *gen)
122{
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000123 _PyObject_GC_UNTRACK(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000124 Py_DECREF(gen->gi_frame);
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000125 PyObject_GC_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000126}
127
128static PyObject *
129gen_iternext(genobject *gen)
130{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000131 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000132 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000133 PyObject *result;
134
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000135 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000136 PyErr_SetString(PyExc_ValueError,
137 "generator already executing");
138 return NULL;
139 }
Tim Peters8c963692001-06-23 05:26:56 +0000140 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000141 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000142
143 /* Generators always return to their most recent caller, not
144 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000145 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000146 assert(f->f_back == NULL);
147 f->f_back = tstate->frame;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000151 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000152
153 /* Don't keep the reference to f_back any longer than necessary. It
154 * may keep a chain of frames alive or it could create a reference
155 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000156 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000157 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000158
Tim Petersad1a18b2001-06-23 06:19:16 +0000159 /* If the generator just returned (as opposed to yielding), signal
160 * that the generator is exhausted. */
161 if (result == Py_None && f->f_stacktop == NULL) {
162 Py_DECREF(result);
163 result = NULL;
164 }
165
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000167}
168
169static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000170gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000171{
172 PyObject *result;
173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000175
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000176 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000177 PyErr_SetObject(PyExc_StopIteration, Py_None);
178 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000179 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000180
181 return result;
182}
183
184static PyObject *
185gen_getiter(PyObject *gen)
186{
187 Py_INCREF(gen);
188 return gen;
189}
190
191static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000192 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000193 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 {NULL, NULL} /* Sentinel */
195};
196
Guido van Rossum6f799372001-09-20 20:46:19 +0000197static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000198 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
199 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
200 {NULL} /* Sentinel */
201};
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
203statichere PyTypeObject gentype = {
204 PyObject_HEAD_INIT(&PyType_Type)
205 0, /* ob_size */
206 "generator", /* tp_name */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000207 sizeof(genobject), /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000208 0, /* tp_itemsize */
209 /* methods */
210 (destructor)gen_dealloc, /* tp_dealloc */
211 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000213 0, /* tp_setattr */
214 0, /* tp_compare */
215 0, /* tp_repr */
216 0, /* tp_as_number */
217 0, /* tp_as_sequence */
218 0, /* tp_as_mapping */
219 0, /* tp_hash */
220 0, /* tp_call */
221 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000223 0, /* tp_setattro */
224 0, /* tp_as_buffer */
Neil Schemenauer08de92a2002-03-18 20:45:09 +0000225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000226 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000227 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000228 0, /* tp_clear */
229 0, /* tp_richcompare */
230 0, /* tp_weaklistoffset */
231 (getiterfunc)gen_getiter, /* tp_iter */
232 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000233 gen_methods, /* tp_methods */
234 gen_memberlist, /* tp_members */
235 0, /* tp_getset */
236 0, /* tp_base */
237 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000238};
239
240
Guido van Rossume59214e1994-08-30 08:01:59 +0000241#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000242
Guido van Rossum2571cc81999-04-07 16:07:23 +0000243#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000245#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000246#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248extern int _PyThread_Started; /* Flag for Py_Exit */
249
Guido van Rossum65d5b571998-12-21 19:32:43 +0000250static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252
253void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000257 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000259 interpreter_lock = PyThread_allocate_lock();
260 PyThread_acquire_lock(interpreter_lock, 1);
261 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000262}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000263
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000264void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268}
269
270void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274}
275
276void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000278{
279 if (tstate == NULL)
280 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000282 if (PyThreadState_Swap(tstate) != NULL)
283 Py_FatalError(
284 "PyEval_AcquireThread: non-NULL old thread state");
285}
286
287void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000288PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289{
290 if (tstate == NULL)
291 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
292 if (PyThreadState_Swap(NULL) != tstate)
293 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000294 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000295}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000296
297/* This function is called from PyOS_AfterFork to ensure that newly
298 created child processes don't hold locks referring to threads which
299 are not running in the child process. (This could also be done using
300 pthread_atfork mechanism, at least for the pthreads implementation.) */
301
302void
303PyEval_ReInitThreads(void)
304{
305 if (!interpreter_lock)
306 return;
307 /*XXX Can't use PyThread_free_lock here because it does too
308 much error-checking. Doing this cleanly would require
309 adding a new function to each thread_*.h. Instead, just
310 create a new lock and waste a little bit of memory */
311 interpreter_lock = PyThread_allocate_lock();
312 PyThread_acquire_lock(interpreter_lock, 1);
313 main_thread = PyThread_get_thread_ident();
314}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315#endif
316
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317/* Functions save_thread and restore_thread are always defined so
318 dynamically loaded modules needn't be compiled separately for use
319 with and without threads: */
320
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000321PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000324 PyThreadState *tstate = PyThreadState_Swap(NULL);
325 if (tstate == NULL)
326 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000327#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000328 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000329 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000331 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332}
333
334void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000335PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000337 if (tstate == NULL)
338 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000339#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000341 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000342 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 }
345#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000346 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347}
348
349
Guido van Rossuma9672091994-09-14 13:31:22 +0000350/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
351 signal handlers or Mac I/O completion routines) can schedule calls
352 to a function to be called synchronously.
353 The synchronous function is called with one void* argument.
354 It should return 0 for success or -1 for failure -- failure should
355 be accompanied by an exception.
356
357 If registry succeeds, the registry function returns 0; if it fails
358 (e.g. due to too many pending calls) it returns -1 (without setting
359 an exception condition).
360
361 Note that because registry may occur from within signal handlers,
362 or other asynchronous events, calling malloc() is unsafe!
363
364#ifdef WITH_THREAD
365 Any thread can schedule pending calls, but only the main thread
366 will execute them.
367#endif
368
369 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
370 There are two possible race conditions:
371 (1) nested asynchronous registry calls;
372 (2) registry calls made while pending calls are being processed.
373 While (1) is very unlikely, (2) is a real possibility.
374 The current code is safe against (2), but not against (1).
375 The safety against (2) is derived from the fact that only one
376 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000377
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378 XXX Darn! With the advent of thread state, we should have an array
379 of pending calls per thread in the thread state! Later...
380*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000381
Guido van Rossuma9672091994-09-14 13:31:22 +0000382#define NPENDINGCALLS 32
383static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000384 int (*func)(void *);
385 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000386} pendingcalls[NPENDINGCALLS];
387static volatile int pendingfirst = 0;
388static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390
391int
Thomas Wouters334fb892000-07-25 12:56:38 +0000392Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000393{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000394 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 int i, j;
396 /* XXX Begin critical section */
397 /* XXX If you want this to be safe against nested
398 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000399 if (busy)
400 return -1;
401 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendinglast;
403 j = (i + 1) % NPENDINGCALLS;
404 if (j == pendingfirst)
405 return -1; /* Queue full */
406 pendingcalls[i].func = func;
407 pendingcalls[i].arg = arg;
408 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000409 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000410 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 /* XXX End critical section */
412 return 0;
413}
414
Guido van Rossum180d7b41994-09-29 09:45:57 +0000415int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000417{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000418 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000420 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000421 return 0;
422#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000423 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 return 0;
425 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 for (;;) {
428 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000429 int (*func)(void *);
430 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000431 i = pendingfirst;
432 if (i == pendinglast)
433 break; /* Queue empty */
434 func = pendingcalls[i].func;
435 arg = pendingcalls[i].arg;
436 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000437 if (func(arg) < 0) {
438 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000439 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000440 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000441 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 return 0;
445}
446
447
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000448/* The interpreter's recursion limit */
449
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000450static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000451
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000452int
453Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000454{
455 return recursion_limit;
456}
457
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000458void
459Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000460{
461 recursion_limit = new_limit;
462}
463
Guido van Rossum374a9221991-04-04 10:40:29 +0000464/* Status code for main loop (reason for stack unwind) */
465
466enum why_code {
467 WHY_NOT, /* No error */
468 WHY_EXCEPTION, /* Exception occurred */
469 WHY_RERAISE, /* Exception re-raised by 'finally' */
470 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000471 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000472 WHY_CONTINUE, /* 'continue' statement */
Tim Peters6e6a63f2001-10-18 20:49:35 +0000473 WHY_YIELD /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000474};
475
Tim Petersdbd9ba62000-07-09 03:09:57 +0000476static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000477static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000478
Guido van Rossum374a9221991-04-04 10:40:29 +0000479
Guido van Rossumb209a111997-04-29 18:18:01 +0000480PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000481PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 (PyObject **)NULL, 0,
486 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000487 (PyObject **)NULL, 0,
488 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489}
490
491
492/* Interpreter main loop */
493
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000495eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000496{
Guido van Rossum950361c1997-01-24 13:49:28 +0000497#ifdef DXPAIRS
498 int lastopcode = 0;
499#endif
Tim Petersb6d14da2001-12-19 04:11:07 +0000500 PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000501 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000502 register int opcode=0; /* Current opcode */
503 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000504 register enum why_code why; /* Reason for block stack unwind */
505 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000506 register PyObject *x; /* Result object -- NULL if error */
507 register PyObject *v; /* Temporary objects popped off stack */
508 register PyObject *w;
509 register PyObject *u;
510 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000511 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000512 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000513 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000514 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000515 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000518 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000519#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000520#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000522 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000523#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000524
525/* Code access macros */
526
527#define GETCONST(i) Getconst(f, i)
528#define GETNAME(i) Getname(f, i)
529#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000530#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000531#define NEXTOP() (*next_instr++)
532#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000533#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000534#define JUMPBY(x) (next_instr += (x))
535
536/* Stack manipulation macros */
537
538#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
539#define EMPTY() (STACK_LEVEL() == 0)
540#define TOP() (stack_pointer[-1])
541#define BASIC_PUSH(v) (*stack_pointer++ = (v))
542#define BASIC_POP() (*--stack_pointer)
543
Guido van Rossum96a42c81992-01-12 02:29:51 +0000544#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000545#define PUSH(v) { (void)(BASIC_PUSH(v), \
546 lltrace && prtrace(TOP(), "push")); \
547 assert(STACK_LEVEL() <= f->f_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000548#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000549#else
550#define PUSH(v) BASIC_PUSH(v)
551#define POP() BASIC_POP()
552#endif
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000557
558/* The SETLOCAL() macro must not DECREF the local variable in-place and
559 then store the new value; it must copy the old value to a temporary
560 value, then store the new value, and then DECREF the temporary value.
561 This is because it is possible that during the DECREF the frame is
562 accessed by other code (e.g. a __del__ method or gc.collect()) and the
563 variable would be pointing to already-freed memory. */
564#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
565 GETLOCAL(i) = value; \
566 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000567
Guido van Rossuma027efa1997-05-05 20:56:21 +0000568/* Start of code */
569
Tim Peters5ca576e2001-06-18 22:08:13 +0000570 if (f == NULL)
571 return NULL;
572
Guido van Rossum8861b741996-07-30 16:49:37 +0000573#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000575 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000576 return NULL;
577 }
578#endif
579
Tim Peters5ca576e2001-06-18 22:08:13 +0000580 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000581 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000582 --tstate->recursion_depth;
583 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000584 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000585 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000586 return NULL;
587 }
588
Tim Peters5ca576e2001-06-18 22:08:13 +0000589 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000590 co = f->f_code;
591 fastlocals = f->f_localsplus;
592 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000593 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000594 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000595 stack_pointer = f->f_stacktop;
596 assert(stack_pointer != NULL);
Tim Petersb6d14da2001-12-19 04:11:07 +0000597 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Tim Peters5ca576e2001-06-18 22:08:13 +0000598
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000599 if (tstate->use_tracing) {
600 if (tstate->c_tracefunc != NULL) {
601 /* tstate->c_tracefunc, if defined, is a
602 function that will be called on *every* entry
603 to a code block. Its return value, if not
604 None, is a function that will be called at
605 the start of each executed line of code.
606 (Actually, the function must return itself
607 in order to continue tracing.) The trace
608 functions are called with three arguments:
609 a pointer to the current frame, a string
610 indicating why the function is called, and
611 an argument which depends on the situation.
612 The global trace function is also called
613 whenever an exception is detected. */
614 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
615 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000616 /* Trace function raised an error */
617 return NULL;
618 }
619 }
620 if (tstate->c_profilefunc != NULL) {
621 /* Similar for c_profilefunc, except it needn't
622 return itself and isn't called for "line" events */
623 if (call_trace(tstate->c_profilefunc,
624 tstate->c_profileobj,
625 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000626 /* Profile function raised an error */
627 return NULL;
628 }
629 }
630 }
631
Tim Peters5ca576e2001-06-18 22:08:13 +0000632#ifdef LLTRACE
633 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
634#endif
635#if defined(Py_DEBUG) || defined(LLTRACE)
636 filename = PyString_AsString(co->co_filename);
637#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000638
Guido van Rossum374a9221991-04-04 10:40:29 +0000639 why = WHY_NOT;
640 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000641 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000642 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000643
Guido van Rossum374a9221991-04-04 10:40:29 +0000644 for (;;) {
Tim Petersb6d14da2001-12-19 04:11:07 +0000645 assert(stack_pointer >= f->f_valuestack); /* else underflow */
646 assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 /* Do periodic things. Doing this every time through
648 the loop would add too much overhead, so we do it
649 only every Nth instruction. We also do it if
650 ``things_to_do'' is set, i.e. when an asynchronous
651 event needs attention (e.g. a signal handler or
652 async I/O handler); see Py_AddPendingCall() and
653 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000654
Guido van Rossuma027efa1997-05-05 20:56:21 +0000655 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000656 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000657 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000658 if (Py_MakePendingCalls() < 0) {
659 why = WHY_EXCEPTION;
660 goto on_error;
661 }
662 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000663#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000664 /* If we have true signals, the signal handler
665 will call Py_AddPendingCall() so we don't
666 have to call sigcheck(). On the Mac and
667 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000668 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 goto on_error;
671 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000672#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673
Guido van Rossume59214e1994-08-30 08:01:59 +0000674#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 if (interpreter_lock) {
676 /* Give another thread a chance */
677
Guido van Rossum25ce5661997-08-02 03:10:38 +0000678 if (PyThreadState_Swap(NULL) != tstate)
679 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000680 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681
682 /* Other threads may run now */
683
Guido van Rossum65d5b571998-12-21 19:32:43 +0000684 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000685 if (PyThreadState_Swap(tstate) != NULL)
686 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000687 }
688#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000690
Neil Schemenauer63543862002-02-17 19:10:14 +0000691 fast_next_opcode:
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000693
Guido van Rossum408027e1996-12-30 16:17:54 +0000694#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000695 f->f_lasti = INSTR_OFFSET();
696#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000697
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 opcode = NEXTOP();
699 if (HAS_ARG(opcode))
700 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000701 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000702#ifdef DYNAMIC_EXECUTION_PROFILE
703#ifdef DXPAIRS
704 dxpairs[lastopcode][opcode]++;
705 lastopcode = opcode;
706#endif
707 dxp[opcode]++;
708#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000709
Guido van Rossum96a42c81992-01-12 02:29:51 +0000710#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000712
Guido van Rossum96a42c81992-01-12 02:29:51 +0000713 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 if (HAS_ARG(opcode)) {
715 printf("%d: %d, %d\n",
716 (int) (INSTR_OFFSET() - 3),
717 opcode, oparg);
718 }
719 else {
720 printf("%d: %d\n",
721 (int) (INSTR_OFFSET() - 1), opcode);
722 }
723 }
724#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000725 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000726
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000728
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 /* BEWARE!
730 It is essential that any operation that fails sets either
731 x to NULL, err to nonzero, or why to anything but WHY_NOT,
732 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000733
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000735
Neil Schemenauer63543862002-02-17 19:10:14 +0000736 case SET_LINENO:
737#ifdef LLTRACE
738 if (lltrace)
739 printf("--- %s:%d \n", filename, oparg);
740#endif
741 f->f_lineno = oparg;
742 if (tstate->c_tracefunc == NULL || tstate->tracing)
743 goto fast_next_opcode;
744 /* Trace each line of code reached */
745 f->f_lasti = INSTR_OFFSET();
746 /* Inline call_trace() for performance: */
747 tstate->tracing++;
748 tstate->use_tracing = 0;
749 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
750 PyTrace_LINE, Py_None);
751 tstate->use_tracing = (tstate->c_tracefunc
752 || tstate->c_profilefunc);
753 tstate->tracing--;
754 break;
755
756 case LOAD_FAST:
757 x = GETLOCAL(oparg);
758 if (x != NULL) {
759 Py_INCREF(x);
760 PUSH(x);
761 goto fast_next_opcode;
762 }
763 format_exc_check_arg(PyExc_UnboundLocalError,
764 UNBOUNDLOCAL_ERROR_MSG,
765 PyTuple_GetItem(co->co_varnames, oparg));
766 break;
767
768 case LOAD_CONST:
769 x = GETCONST(oparg);
770 Py_INCREF(x);
771 PUSH(x);
772 goto fast_next_opcode;
773
774 case STORE_FAST:
775 v = POP();
776 SETLOCAL(oparg, v);
777 goto fast_next_opcode;
778
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 case POP_TOP:
780 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000781 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000782 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000783
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 case ROT_TWO:
785 v = POP();
786 w = POP();
787 PUSH(v);
788 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000789 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000790
Guido van Rossum374a9221991-04-04 10:40:29 +0000791 case ROT_THREE:
792 v = POP();
793 w = POP();
794 x = POP();
795 PUSH(v);
796 PUSH(x);
797 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000798 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000799
Thomas Wouters434d0822000-08-24 20:11:32 +0000800 case ROT_FOUR:
801 u = POP();
802 v = POP();
803 w = POP();
804 x = POP();
805 PUSH(u);
806 PUSH(x);
807 PUSH(w);
808 PUSH(v);
809 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000810
Guido van Rossum374a9221991-04-04 10:40:29 +0000811 case DUP_TOP:
812 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000813 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000815 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000816
Thomas Wouters434d0822000-08-24 20:11:32 +0000817 case DUP_TOPX:
818 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000819 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000820 x = TOP();
821 Py_INCREF(x);
822 PUSH(x);
823 continue;
824 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000825 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000826 Py_INCREF(x);
827 w = TOP();
828 Py_INCREF(w);
829 PUSH(x);
830 PUSH(w);
831 PUSH(x);
832 continue;
833 case 3:
834 x = POP();
835 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000836 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000837 Py_INCREF(w);
838 v = TOP();
839 Py_INCREF(v);
840 PUSH(w);
841 PUSH(x);
842 PUSH(v);
843 PUSH(w);
844 PUSH(x);
845 continue;
846 case 4:
847 x = POP();
848 Py_INCREF(x);
849 w = POP();
850 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000851 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000852 Py_INCREF(v);
853 u = TOP();
854 Py_INCREF(u);
855 PUSH(v);
856 PUSH(w);
857 PUSH(x);
858 PUSH(u);
859 PUSH(v);
860 PUSH(w);
861 PUSH(x);
862 continue;
863 case 5:
864 x = POP();
865 Py_INCREF(x);
866 w = POP();
867 Py_INCREF(w);
868 v = POP();
869 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000870 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000871 Py_INCREF(u);
872 t = TOP();
873 Py_INCREF(t);
874 PUSH(u);
875 PUSH(v);
876 PUSH(w);
877 PUSH(x);
878 PUSH(t);
879 PUSH(u);
880 PUSH(v);
881 PUSH(w);
882 PUSH(x);
883 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000884 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000885 Py_FatalError("invalid argument to DUP_TOPX"
886 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000887 }
Tim Peters35ba6892000-10-11 07:04:49 +0000888 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000889
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 case UNARY_POSITIVE:
891 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000892 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000893 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000895 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000897
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 case UNARY_NEGATIVE:
899 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000903 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000905
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 case UNARY_NOT:
907 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000908 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000909 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000910 if (err == 0) {
911 Py_INCREF(Py_True);
912 PUSH(Py_True);
913 continue;
914 }
915 else if (err > 0) {
916 Py_INCREF(Py_False);
917 PUSH(Py_False);
918 err = 0;
919 continue;
920 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000922
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 case UNARY_CONVERT:
924 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000925 x = PyObject_Repr(v);
926 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000928 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000930
Guido van Rossum7928cd71991-10-24 14:59:31 +0000931 case UNARY_INVERT:
932 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000933 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000934 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000935 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000936 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000937 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000938
Guido van Rossum50564e81996-01-12 01:13:16 +0000939 case BINARY_POWER:
940 w = POP();
941 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000942 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000943 Py_DECREF(v);
944 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000945 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000946 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000947 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000948
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 case BINARY_MULTIPLY:
950 w = POP();
951 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000952 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000953 Py_DECREF(v);
954 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000956 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000958
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +0000960 if (!_Py_QnewFlag) {
961 w = POP();
962 v = POP();
963 x = PyNumber_Divide(v, w);
964 Py_DECREF(v);
965 Py_DECREF(w);
966 PUSH(x);
967 if (x != NULL) continue;
968 break;
969 }
970 /* -Qnew is in effect: fall through to
971 BINARY_TRUE_DIVIDE */
972 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 w = POP();
974 v = POP();
Tim Peters3caca232001-12-06 06:23:26 +0000975 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000976 Py_DECREF(v);
977 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000979 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000981
Guido van Rossum4668b002001-08-08 05:00:18 +0000982 case BINARY_FLOOR_DIVIDE:
983 w = POP();
984 v = POP();
985 x = PyNumber_FloorDivide(v, w);
986 Py_DECREF(v);
987 Py_DECREF(w);
988 PUSH(x);
989 if (x != NULL) continue;
990 break;
991
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 case BINARY_MODULO:
993 w = POP();
994 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000995 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000996 Py_DECREF(v);
997 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000999 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001000 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001001
Guido van Rossum374a9221991-04-04 10:40:29 +00001002 case BINARY_ADD:
1003 w = POP();
1004 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001005 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 /* INLINE: int + int */
1007 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001008 a = PyInt_AS_LONG(v);
1009 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001010 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001011 if ((i^a) < 0 && (i^b) < 0)
1012 goto slow_add;
1013 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001014 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001015 else {
1016 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001017 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001018 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001019 Py_DECREF(v);
1020 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001022 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001023 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001024
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 case BINARY_SUBTRACT:
1026 w = POP();
1027 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001028 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001029 /* INLINE: int - int */
1030 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001031 a = PyInt_AS_LONG(v);
1032 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001033 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001034 if ((i^a) < 0 && (i^~b) < 0)
1035 goto slow_sub;
1036 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001037 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001038 else {
1039 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001040 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001041 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 Py_DECREF(v);
1043 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001045 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001047
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 case BINARY_SUBSCR:
1049 w = POP();
1050 v = POP();
Tim Petersb1c46982001-10-05 20:41:38 +00001051 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001052 /* INLINE: list[int] */
1053 long i = PyInt_AsLong(w);
1054 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001055 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001056 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001057 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001058 PyErr_SetString(PyExc_IndexError,
1059 "list index out of range");
1060 x = NULL;
1061 }
1062 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001063 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001064 Py_INCREF(x);
1065 }
1066 }
1067 else
1068 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001069 Py_DECREF(v);
1070 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001072 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001073 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001074
Guido van Rossum7928cd71991-10-24 14:59:31 +00001075 case BINARY_LSHIFT:
1076 w = POP();
1077 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001078 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001079 Py_DECREF(v);
1080 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001081 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001082 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001083 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001084
Guido van Rossum7928cd71991-10-24 14:59:31 +00001085 case BINARY_RSHIFT:
1086 w = POP();
1087 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001088 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001089 Py_DECREF(v);
1090 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001091 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001092 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001093 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001094
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 case BINARY_AND:
1096 w = POP();
1097 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001098 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001099 Py_DECREF(v);
1100 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001101 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001102 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001103 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001104
Guido van Rossum7928cd71991-10-24 14:59:31 +00001105 case BINARY_XOR:
1106 w = POP();
1107 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001108 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001109 Py_DECREF(v);
1110 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001111 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001112 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001113 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001114
Guido van Rossum7928cd71991-10-24 14:59:31 +00001115 case BINARY_OR:
1116 w = POP();
1117 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001118 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001119 Py_DECREF(v);
1120 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001121 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001122 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001123 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001124
1125 case INPLACE_POWER:
1126 w = POP();
1127 v = POP();
1128 x = PyNumber_InPlacePower(v, w, Py_None);
1129 Py_DECREF(v);
1130 Py_DECREF(w);
1131 PUSH(x);
1132 if (x != NULL) continue;
1133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 case INPLACE_MULTIPLY:
1136 w = POP();
1137 v = POP();
1138 x = PyNumber_InPlaceMultiply(v, w);
1139 Py_DECREF(v);
1140 Py_DECREF(w);
1141 PUSH(x);
1142 if (x != NULL) continue;
1143 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001144
Thomas Wouters434d0822000-08-24 20:11:32 +00001145 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001146 if (!_Py_QnewFlag) {
1147 w = POP();
1148 v = POP();
1149 x = PyNumber_InPlaceDivide(v, w);
1150 Py_DECREF(v);
1151 Py_DECREF(w);
1152 PUSH(x);
1153 if (x != NULL) continue;
1154 break;
1155 }
1156 /* -Qnew is in effect: fall through to
1157 INPLACE_TRUE_DIVIDE */
1158 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001159 w = POP();
1160 v = POP();
Tim Peters54b11912001-12-25 18:49:11 +00001161 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001162 Py_DECREF(v);
1163 Py_DECREF(w);
1164 PUSH(x);
1165 if (x != NULL) continue;
1166 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001167
Guido van Rossum4668b002001-08-08 05:00:18 +00001168 case INPLACE_FLOOR_DIVIDE:
1169 w = POP();
1170 v = POP();
1171 x = PyNumber_InPlaceFloorDivide(v, w);
1172 Py_DECREF(v);
1173 Py_DECREF(w);
1174 PUSH(x);
1175 if (x != NULL) continue;
1176 break;
1177
Thomas Wouters434d0822000-08-24 20:11:32 +00001178 case INPLACE_MODULO:
1179 w = POP();
1180 v = POP();
1181 x = PyNumber_InPlaceRemainder(v, w);
1182 Py_DECREF(v);
1183 Py_DECREF(w);
1184 PUSH(x);
1185 if (x != NULL) continue;
1186 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001187
Thomas Wouters434d0822000-08-24 20:11:32 +00001188 case INPLACE_ADD:
1189 w = POP();
1190 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001191 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001192 /* INLINE: int + int */
1193 register long a, b, i;
1194 a = PyInt_AS_LONG(v);
1195 b = PyInt_AS_LONG(w);
1196 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001197 if ((i^a) < 0 && (i^b) < 0)
1198 goto slow_iadd;
1199 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001200 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001201 else {
1202 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001203 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001204 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001205 Py_DECREF(v);
1206 Py_DECREF(w);
1207 PUSH(x);
1208 if (x != NULL) continue;
1209 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001210
Thomas Wouters434d0822000-08-24 20:11:32 +00001211 case INPLACE_SUBTRACT:
1212 w = POP();
1213 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001214 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 /* INLINE: int - int */
1216 register long a, b, i;
1217 a = PyInt_AS_LONG(v);
1218 b = PyInt_AS_LONG(w);
1219 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001220 if ((i^a) < 0 && (i^~b) < 0)
1221 goto slow_isub;
1222 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001223 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001224 else {
1225 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001226 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001227 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001228 Py_DECREF(v);
1229 Py_DECREF(w);
1230 PUSH(x);
1231 if (x != NULL) continue;
1232 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001233
Thomas Wouters434d0822000-08-24 20:11:32 +00001234 case INPLACE_LSHIFT:
1235 w = POP();
1236 v = POP();
1237 x = PyNumber_InPlaceLshift(v, w);
1238 Py_DECREF(v);
1239 Py_DECREF(w);
1240 PUSH(x);
1241 if (x != NULL) continue;
1242 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001243
Thomas Wouters434d0822000-08-24 20:11:32 +00001244 case INPLACE_RSHIFT:
1245 w = POP();
1246 v = POP();
1247 x = PyNumber_InPlaceRshift(v, w);
1248 Py_DECREF(v);
1249 Py_DECREF(w);
1250 PUSH(x);
1251 if (x != NULL) continue;
1252 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001253
Thomas Wouters434d0822000-08-24 20:11:32 +00001254 case INPLACE_AND:
1255 w = POP();
1256 v = POP();
1257 x = PyNumber_InPlaceAnd(v, w);
1258 Py_DECREF(v);
1259 Py_DECREF(w);
1260 PUSH(x);
1261 if (x != NULL) continue;
1262 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001263
Thomas Wouters434d0822000-08-24 20:11:32 +00001264 case INPLACE_XOR:
1265 w = POP();
1266 v = POP();
1267 x = PyNumber_InPlaceXor(v, w);
1268 Py_DECREF(v);
1269 Py_DECREF(w);
1270 PUSH(x);
1271 if (x != NULL) continue;
1272 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001273
Thomas Wouters434d0822000-08-24 20:11:32 +00001274 case INPLACE_OR:
1275 w = POP();
1276 v = POP();
1277 x = PyNumber_InPlaceOr(v, w);
1278 Py_DECREF(v);
1279 Py_DECREF(w);
1280 PUSH(x);
1281 if (x != NULL) continue;
1282 break;
1283
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 case SLICE+0:
1285 case SLICE+1:
1286 case SLICE+2:
1287 case SLICE+3:
1288 if ((opcode-SLICE) & 2)
1289 w = POP();
1290 else
1291 w = NULL;
1292 if ((opcode-SLICE) & 1)
1293 v = POP();
1294 else
1295 v = NULL;
1296 u = POP();
1297 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001298 Py_DECREF(u);
1299 Py_XDECREF(v);
1300 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001302 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001304
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 case STORE_SLICE+0:
1306 case STORE_SLICE+1:
1307 case STORE_SLICE+2:
1308 case STORE_SLICE+3:
1309 if ((opcode-STORE_SLICE) & 2)
1310 w = POP();
1311 else
1312 w = NULL;
1313 if ((opcode-STORE_SLICE) & 1)
1314 v = POP();
1315 else
1316 v = NULL;
1317 u = POP();
1318 t = POP();
1319 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 Py_DECREF(t);
1321 Py_DECREF(u);
1322 Py_XDECREF(v);
1323 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001324 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001326
Guido van Rossum374a9221991-04-04 10:40:29 +00001327 case DELETE_SLICE+0:
1328 case DELETE_SLICE+1:
1329 case DELETE_SLICE+2:
1330 case DELETE_SLICE+3:
1331 if ((opcode-DELETE_SLICE) & 2)
1332 w = POP();
1333 else
1334 w = NULL;
1335 if ((opcode-DELETE_SLICE) & 1)
1336 v = POP();
1337 else
1338 v = NULL;
1339 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001340 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 Py_DECREF(u);
1343 Py_XDECREF(v);
1344 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001345 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001346 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001347
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 case STORE_SUBSCR:
1349 w = POP();
1350 v = POP();
1351 u = POP();
1352 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001353 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001354 Py_DECREF(u);
1355 Py_DECREF(v);
1356 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001357 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001359
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 case DELETE_SUBSCR:
1361 w = POP();
1362 v = POP();
1363 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001364 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001365 Py_DECREF(v);
1366 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001367 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001369
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 case PRINT_EXPR:
1371 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001372 w = PySys_GetObject("displayhook");
1373 if (w == NULL) {
1374 PyErr_SetString(PyExc_RuntimeError,
1375 "lost sys.displayhook");
1376 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001377 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001378 }
1379 if (err == 0) {
1380 x = Py_BuildValue("(O)", v);
1381 if (x == NULL)
1382 err = -1;
1383 }
1384 if (err == 0) {
1385 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001386 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001387 if (w == NULL)
1388 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001390 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001391 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001393
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001394 case PRINT_ITEM_TO:
1395 w = stream = POP();
1396 /* fall through to PRINT_ITEM */
1397
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 case PRINT_ITEM:
1399 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001400 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001401 w = PySys_GetObject("stdout");
1402 if (w == NULL) {
1403 PyErr_SetString(PyExc_RuntimeError,
1404 "lost sys.stdout");
1405 err = -1;
1406 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001407 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001408 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001409 err = PyFile_WriteString(" ", w);
1410 if (err == 0)
1411 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001412 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001413 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001414 if (PyString_Check(v)) {
1415 char *s = PyString_AS_STRING(v);
1416 int len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001417 if (len == 0 ||
1418 !isspace(Py_CHARMASK(s[len-1])) ||
1419 s[len-1] == ' ')
1420 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001421 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001422#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001423 else if (PyUnicode_Check(v)) {
1424 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1425 int len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001426 if (len == 0 ||
1427 !Py_UNICODE_ISSPACE(s[len-1]) ||
1428 s[len-1] == ' ')
1429 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001430 }
Tim Peters8e5fd532002-03-24 19:25:00 +00001431 else
1432 PyFile_SoftSpace(w, 1);
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001433#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001436 Py_XDECREF(stream);
1437 stream = NULL;
1438 if (err == 0)
1439 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001441
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001442 case PRINT_NEWLINE_TO:
1443 w = stream = POP();
1444 /* fall through to PRINT_NEWLINE */
1445
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001447 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001448 w = PySys_GetObject("stdout");
1449 if (w == NULL)
1450 PyErr_SetString(PyExc_RuntimeError,
1451 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001452 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001453 if (w != NULL) {
1454 err = PyFile_WriteString("\n", w);
1455 if (err == 0)
1456 PyFile_SoftSpace(w, 0);
1457 }
1458 Py_XDECREF(stream);
1459 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001461
Thomas Wouters434d0822000-08-24 20:11:32 +00001462
1463#ifdef CASE_TOO_BIG
1464 default: switch (opcode) {
1465#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 case BREAK_LOOP:
1467 why = WHY_BREAK;
1468 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001469
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001470 case CONTINUE_LOOP:
1471 retval = PyInt_FromLong(oparg);
1472 why = WHY_CONTINUE;
1473 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001474
Guido van Rossumf10570b1995-07-07 22:53:21 +00001475 case RAISE_VARARGS:
1476 u = v = w = NULL;
1477 switch (oparg) {
1478 case 3:
1479 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480 /* Fallthrough */
1481 case 2:
1482 v = POP(); /* value */
1483 /* Fallthrough */
1484 case 1:
1485 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001486 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001487 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001488 break;
1489 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001491 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001492 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001493 break;
1494 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001496
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001498 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001499 PyErr_SetString(PyExc_SystemError,
1500 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001501 break;
1502 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001506
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 case RETURN_VALUE:
1508 retval = POP();
1509 why = WHY_RETURN;
1510 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001511
Tim Peters5ca576e2001-06-18 22:08:13 +00001512 case YIELD_VALUE:
1513 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001514 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001515 f->f_lasti = INSTR_OFFSET();
1516 why = WHY_YIELD;
1517 break;
1518
1519
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001520 case EXEC_STMT:
1521 w = POP();
1522 v = POP();
1523 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001524 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 Py_DECREF(u);
1526 Py_DECREF(v);
1527 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 case POP_BLOCK:
1531 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 while (STACK_LEVEL() > b->b_level) {
1534 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001535 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 }
1537 }
1538 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001539
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 case END_FINALLY:
1541 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 if (PyInt_Check(v)) {
1543 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001544 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001545 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001546 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 retval = POP();
1548 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001550 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001551 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001554 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 else if (v != Py_None) {
1557 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 "'finally' pops bad exception");
1559 why = WHY_EXCEPTION;
1560 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001561 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001563
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001565 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001567 w = POP();
1568 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001570 Py_DECREF(u);
1571 Py_DECREF(v);
1572 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001574
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 case STORE_NAME:
1576 w = GETNAMEV(oparg);
1577 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001578 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001579 PyErr_Format(PyExc_SystemError,
1580 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001581 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001582 break;
1583 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001584 err = PyDict_SetItem(x, w, v);
1585 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001587
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001589 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001590 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001591 PyErr_Format(PyExc_SystemError,
1592 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001593 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001594 break;
1595 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001597 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001598 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001600
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001601 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001602 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001603 if (PyTuple_Check(v)) {
1604 if (PyTuple_Size(v) != oparg) {
1605 PyErr_SetString(PyExc_ValueError,
1606 "unpack tuple of wrong size");
1607 why = WHY_EXCEPTION;
1608 }
1609 else {
1610 for (; --oparg >= 0; ) {
1611 w = PyTuple_GET_ITEM(v, oparg);
1612 Py_INCREF(w);
1613 PUSH(w);
1614 }
1615 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001617 else if (PyList_Check(v)) {
1618 if (PyList_Size(v) != oparg) {
1619 PyErr_SetString(PyExc_ValueError,
1620 "unpack list of wrong size");
1621 why = WHY_EXCEPTION;
1622 }
1623 else {
1624 for (; --oparg >= 0; ) {
1625 w = PyList_GET_ITEM(v, oparg);
1626 Py_INCREF(w);
1627 PUSH(w);
1628 }
1629 }
1630 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001631 else if (unpack_iterable(v, oparg,
1632 stack_pointer + oparg))
1633 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001634 else {
1635 if (PyErr_ExceptionMatches(PyExc_TypeError))
1636 PyErr_SetString(PyExc_TypeError,
1637 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001638 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001639 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001640 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001642
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001644 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 v = POP();
1646 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1648 Py_DECREF(v);
1649 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001651
Guido van Rossum374a9221991-04-04 10:40:29 +00001652 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001653 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001655 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1656 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001659
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001660 case STORE_GLOBAL:
1661 w = GETNAMEV(oparg);
1662 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 err = PyDict_SetItem(f->f_globals, w, v);
1664 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001665 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001666
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001667 case DELETE_GLOBAL:
1668 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001670 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001671 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001672 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001673
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001675 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001676 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001677 PyErr_Format(PyExc_SystemError,
1678 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001679 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001680 break;
1681 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001682 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001686 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001688 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001689 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001690 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 break;
1692 }
1693 }
1694 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 PUSH(x);
1697 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001698
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001700 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001701 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001703 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001705 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001706 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001707 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 break;
1709 }
1710 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001711 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 PUSH(x);
1713 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001714
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001715 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001716 x = GETLOCAL(oparg);
1717 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001718 format_exc_check_arg(
1719 PyExc_UnboundLocalError,
1720 UNBOUNDLOCAL_ERROR_MSG,
1721 PyTuple_GetItem(co->co_varnames, oparg)
1722 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001723 break;
1724 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001725 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001726 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001727
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001728 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001729 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001730 Py_INCREF(x);
1731 PUSH(x);
1732 break;
1733
1734 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001735 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001736 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001737 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001738 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001739 v = PyTuple_GetItem(co->co_cellvars,
1740 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001741 format_exc_check_arg(
1742 PyExc_UnboundLocalError,
1743 UNBOUNDLOCAL_ERROR_MSG,
1744 v);
1745 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001746 v = PyTuple_GetItem(
1747 co->co_freevars,
1748 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001749 format_exc_check_arg(
1750 PyExc_NameError,
1751 UNBOUNDFREE_ERROR_MSG,
1752 v);
1753 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001754 err = -1;
1755 break;
1756 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001757 PUSH(w);
1758 break;
1759
1760 case STORE_DEREF:
1761 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001762 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001763 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001764 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001765 continue;
1766
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001768 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 if (x != NULL) {
1770 for (; --oparg >= 0;) {
1771 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 }
1774 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001775 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 }
1777 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001778
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001780 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 if (x != NULL) {
1782 for (; --oparg >= 0;) {
1783 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001784 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 }
1786 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001787 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 }
1789 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001790
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001792 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001794 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001796
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001798 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 x = PyObject_GetAttr(v, w);
1801 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001803 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case COMPARE_OP:
1807 w = POP();
1808 v = POP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001809 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001810 /* INLINE: cmp(int, int) */
1811 register long a, b;
1812 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001813 a = PyInt_AS_LONG(v);
1814 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001815 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001816 case PyCmp_LT: res = a < b; break;
1817 case PyCmp_LE: res = a <= b; break;
1818 case PyCmp_EQ: res = a == b; break;
1819 case PyCmp_NE: res = a != b; break;
1820 case PyCmp_GT: res = a > b; break;
1821 case PyCmp_GE: res = a >= b; break;
1822 case PyCmp_IS: res = v == w; break;
1823 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001824 default: goto slow_compare;
1825 }
1826 x = res ? Py_True : Py_False;
1827 Py_INCREF(x);
1828 }
1829 else {
1830 slow_compare:
1831 x = cmp_outcome(oparg, v, w);
1832 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001833 Py_DECREF(v);
1834 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001836 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001838
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001840 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001842 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001844 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001845 break;
1846 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001847 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001848 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001849 w,
1850 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001851 f->f_locals == NULL ?
1852 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001853 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001854 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001855 if (w == NULL) {
1856 x = NULL;
1857 break;
1858 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 x = PyEval_CallObject(x, w);
1860 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001861 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001862 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001864
Thomas Wouters52152252000-08-17 22:55:00 +00001865 case IMPORT_STAR:
1866 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001867 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001868 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001869 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001870 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001871 break;
1872 }
Thomas Wouters52152252000-08-17 22:55:00 +00001873 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001875 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001876 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001878
Thomas Wouters52152252000-08-17 22:55:00 +00001879 case IMPORT_FROM:
1880 w = GETNAMEV(oparg);
1881 v = TOP();
1882 x = import_from(v, w);
1883 PUSH(x);
1884 if (x != NULL) continue;
1885 break;
1886
Guido van Rossum374a9221991-04-04 10:40:29 +00001887 case JUMP_FORWARD:
1888 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001889 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001890
Guido van Rossum374a9221991-04-04 10:40:29 +00001891 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001892 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001893 if (err > 0)
1894 err = 0;
1895 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001897 else
1898 break;
1899 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001900
Guido van Rossum374a9221991-04-04 10:40:29 +00001901 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001902 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001903 if (err > 0) {
1904 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001905 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001906 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001907 else if (err == 0)
1908 ;
1909 else
1910 break;
1911 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001912
Guido van Rossum374a9221991-04-04 10:40:29 +00001913 case JUMP_ABSOLUTE:
1914 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001915 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001916
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001917 case GET_ITER:
1918 /* before: [obj]; after [getiter(obj)] */
1919 v = POP();
1920 x = PyObject_GetIter(v);
1921 Py_DECREF(v);
1922 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001923 PUSH(x);
1924 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001925 }
1926 break;
1927
1928 case FOR_ITER:
1929 /* before: [iter]; after: [iter, iter()] *or* [] */
1930 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001931 x = PyIter_Next(v);
1932 if (x != NULL) {
1933 PUSH(x);
1934 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001935 }
Tim Petersf4848da2001-05-05 00:14:56 +00001936 if (!PyErr_Occurred()) {
1937 /* iterator ended normally */
1938 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001939 Py_DECREF(v);
1940 JUMPBY(oparg);
1941 continue;
1942 }
1943 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001944
Guido van Rossum374a9221991-04-04 10:40:29 +00001945 case FOR_LOOP:
1946 /* for v in s: ...
1947 On entry: stack contains s, i.
1948 On exit: stack contains s, i+1, s[i];
1949 but if loop exhausted:
1950 s, i are popped, and we jump */
1951 w = POP(); /* Loop index */
1952 v = POP(); /* Sequence object */
1953 u = loop_subscript(v, w);
1954 if (u != NULL) {
1955 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001956 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001957 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001958 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001959 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001960 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001961 }
1962 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001963 Py_DECREF(v);
1964 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001965 /* A NULL can mean "s exhausted"
1966 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001967 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001968 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001969 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001970 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001971 continue;
1972 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001973 }
1974 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001975
Guido van Rossum374a9221991-04-04 10:40:29 +00001976 case SETUP_LOOP:
1977 case SETUP_EXCEPT:
1978 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001979 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001980 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001981 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001982
Guido van Rossumf10570b1995-07-07 22:53:21 +00001983 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001984 {
1985 int na = oparg & 0xff;
1986 int nk = (oparg>>8) & 0xff;
1987 int n = na + 2 * nk;
1988 PyObject **pfunc = stack_pointer - n - 1;
1989 PyObject *func = *pfunc;
1990 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1991
1992 /* Always dispatch PyCFunction first, because
1993 these are presumed to be the most frequent
1994 callable object.
1995 */
1996 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001997 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001998 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001999 x = do_call(func, &stack_pointer,
2000 na, nk);
2001 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00002002 PyObject *callargs;
2003 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002004 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00002005 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002006 } else
2007 x = fast_cfunction(func,
2008 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00002009 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00002010 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 && PyMethod_GET_SELF(func) != NULL) {
2012 /* optimize access to bound methods */
2013 PyObject *self = PyMethod_GET_SELF(func);
2014 Py_INCREF(self);
2015 func = PyMethod_GET_FUNCTION(func);
2016 Py_INCREF(func);
2017 Py_DECREF(*pfunc);
2018 *pfunc = self;
2019 na++;
2020 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002021 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002022 Py_INCREF(func);
2023 if (PyFunction_Check(func)) {
2024 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002025 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002026 } else {
2027 x = do_call(func, &stack_pointer,
2028 na, nk);
2029 }
2030 Py_DECREF(func);
2031 }
2032
2033 while (stack_pointer > pfunc) {
2034 w = POP();
2035 Py_DECREF(w);
2036 }
2037 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002038 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002039 continue;
2040 break;
2041 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002042
Jeremy Hylton76901512000-03-28 23:49:17 +00002043 case CALL_FUNCTION_VAR:
2044 case CALL_FUNCTION_KW:
2045 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002046 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002047 int na = oparg & 0xff;
2048 int nk = (oparg>>8) & 0xff;
2049 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002050 int n = na + 2 * nk;
2051 PyObject **pfunc, *func;
2052 if (flags & CALL_FLAG_VAR)
2053 n++;
2054 if (flags & CALL_FLAG_KW)
2055 n++;
2056 pfunc = stack_pointer - n - 1;
2057 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002058 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002059
Guido van Rossumac7be682001-01-17 15:42:30 +00002060 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002061 && PyMethod_GET_SELF(func) != NULL) {
2062 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002063 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002064 func = PyMethod_GET_FUNCTION(func);
2065 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002066 Py_DECREF(*pfunc);
2067 *pfunc = self;
2068 na++;
2069 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002070 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002071 Py_INCREF(func);
2072 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002073 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002074
Jeremy Hylton76901512000-03-28 23:49:17 +00002075 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002076 w = POP();
2077 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002078 }
2079 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002080 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002081 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002082 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002083 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002084
Guido van Rossum681d79a1995-07-18 14:51:37 +00002085 case MAKE_FUNCTION:
2086 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 x = PyFunction_New(v, f->f_globals);
2088 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002089 /* XXX Maybe this should be a separate opcode? */
2090 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002091 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002092 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002093 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002094 x = NULL;
2095 break;
2096 }
2097 while (--oparg >= 0) {
2098 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002100 }
2101 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002103 }
2104 PUSH(x);
2105 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002106
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002107 case MAKE_CLOSURE:
2108 {
2109 int nfree;
2110 v = POP(); /* code object */
2111 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002112 nfree = PyCode_GetNumFree((PyCodeObject *)v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002113 Py_DECREF(v);
2114 /* XXX Maybe this should be a separate opcode? */
2115 if (x != NULL && nfree > 0) {
2116 v = PyTuple_New(nfree);
2117 if (v == NULL) {
2118 Py_DECREF(x);
2119 x = NULL;
2120 break;
2121 }
2122 while (--nfree >= 0) {
2123 w = POP();
2124 PyTuple_SET_ITEM(v, nfree, w);
2125 }
2126 err = PyFunction_SetClosure(x, v);
2127 Py_DECREF(v);
2128 }
2129 if (x != NULL && oparg > 0) {
2130 v = PyTuple_New(oparg);
2131 if (v == NULL) {
2132 Py_DECREF(x);
2133 x = NULL;
2134 break;
2135 }
2136 while (--oparg >= 0) {
2137 w = POP();
2138 PyTuple_SET_ITEM(v, oparg, w);
2139 }
2140 err = PyFunction_SetDefaults(x, v);
2141 Py_DECREF(v);
2142 }
2143 PUSH(x);
2144 break;
2145 }
2146
Guido van Rossum8861b741996-07-30 16:49:37 +00002147 case BUILD_SLICE:
2148 if (oparg == 3)
2149 w = POP();
2150 else
2151 w = NULL;
2152 v = POP();
2153 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002154 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002155 Py_DECREF(u);
2156 Py_DECREF(v);
2157 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002158 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002159 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002160 break;
2161
Fred Drakeef8ace32000-08-24 00:32:09 +00002162 case EXTENDED_ARG:
2163 opcode = NEXTOP();
2164 oparg = oparg<<16 | NEXTARG();
2165 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002166
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 default:
2168 fprintf(stderr,
2169 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002170 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 why = WHY_EXCEPTION;
2173 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002174
2175#ifdef CASE_TOO_BIG
2176 }
2177#endif
2178
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 } /* switch */
2180
2181 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002182
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002184
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002186 if (err == 0 && x != NULL) {
2187#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002188 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002190 fprintf(stderr,
2191 "XXX undetected error\n");
2192 else
2193#endif
2194 continue; /* Normal, fast path */
2195 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002198 err = 0;
2199 }
2200
Guido van Rossum374a9221991-04-04 10:40:29 +00002201 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002202
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002204 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002205 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002206 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 why = WHY_EXCEPTION;
2208 }
2209 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002210#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002212 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002213 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002214 fprintf(stderr,
2215 "XXX undetected error (why=%d)\n",
2216 why);
2217 why = WHY_EXCEPTION;
2218 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002219 }
2220#endif
2221
2222 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002223
Guido van Rossum374a9221991-04-04 10:40:29 +00002224 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002225 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002226 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002227 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002229
Fred Drake8f51f542001-10-04 14:48:42 +00002230 if (tstate->c_tracefunc != NULL)
2231 call_exc_trace(tstate->c_tracefunc,
2232 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002233 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002234
Guido van Rossum374a9221991-04-04 10:40:29 +00002235 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002236
Guido van Rossum374a9221991-04-04 10:40:29 +00002237 if (why == WHY_RERAISE)
2238 why = WHY_EXCEPTION;
2239
2240 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002241
Tim Peters5ca576e2001-06-18 22:08:13 +00002242 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002243 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002244
2245 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2246 /* For a continue inside a try block,
2247 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002248 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2249 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002250 why = WHY_NOT;
2251 JUMPTO(PyInt_AS_LONG(retval));
2252 Py_DECREF(retval);
2253 break;
2254 }
2255
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 while (STACK_LEVEL() > b->b_level) {
2257 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002258 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002259 }
2260 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2261 why = WHY_NOT;
2262 JUMPTO(b->b_handler);
2263 break;
2264 }
2265 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002266 (b->b_type == SETUP_EXCEPT &&
2267 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002268 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002269 PyObject *exc, *val, *tb;
2270 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002271 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002272 val = Py_None;
2273 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002274 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002275 /* Make the raw exception data
2276 available to the handler,
2277 so a program can emulate the
2278 Python main loop. Don't do
2279 this for 'finally'. */
2280 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002281 PyErr_NormalizeException(
2282 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002283 set_exc_info(tstate,
2284 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002285 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002286 if (tb == NULL) {
2287 Py_INCREF(Py_None);
2288 PUSH(Py_None);
2289 } else
2290 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002291 PUSH(val);
2292 PUSH(exc);
2293 }
2294 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002295 if (why == WHY_RETURN ||
2296 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002297 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002298 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002299 PUSH(v);
2300 }
2301 why = WHY_NOT;
2302 JUMPTO(b->b_handler);
2303 break;
2304 }
2305 } /* unwind stack */
2306
2307 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002308
Guido van Rossum374a9221991-04-04 10:40:29 +00002309 if (why != WHY_NOT)
2310 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002311
Guido van Rossum374a9221991-04-04 10:40:29 +00002312 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002313
Guido van Rossum35974fb2001-12-06 21:28:18 +00002314 if (why != WHY_YIELD) {
2315 /* Pop remaining stack entries -- but when yielding */
2316 while (!EMPTY()) {
2317 v = POP();
2318 Py_XDECREF(v);
2319 }
2320 }
2321
Tim Peters5ca576e2001-06-18 22:08:13 +00002322 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002323 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002324
Fred Drake9e3ad782001-07-03 23:39:52 +00002325 if (tstate->use_tracing) {
2326 if (tstate->c_tracefunc
2327 && (why == WHY_RETURN || why == WHY_YIELD)) {
2328 if (call_trace(tstate->c_tracefunc,
2329 tstate->c_traceobj, f,
2330 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002332 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002333 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002334 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002335 }
Fred Drake8f51f542001-10-04 14:48:42 +00002336 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002337 if (why == WHY_EXCEPTION)
2338 call_trace_protected(tstate->c_profilefunc,
2339 tstate->c_profileobj, f,
2340 PyTrace_RETURN);
2341 else if (call_trace(tstate->c_profilefunc,
2342 tstate->c_profileobj, f,
2343 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002344 Py_XDECREF(retval);
2345 retval = NULL;
2346 why = WHY_EXCEPTION;
2347 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002348 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002349 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002350
Guido van Rossuma027efa1997-05-05 20:56:21 +00002351 reset_exc_info(tstate);
2352
Tim Peters5ca576e2001-06-18 22:08:13 +00002353 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002354 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002355 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002356
Guido van Rossum96a42c81992-01-12 02:29:51 +00002357 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002358}
2359
Tim Peters6d6c1a32001-08-02 04:15:00 +00002360PyObject *
2361PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002362 PyObject **args, int argcount, PyObject **kws, int kwcount,
2363 PyObject **defs, int defcount, PyObject *closure)
2364{
2365 register PyFrameObject *f;
2366 register PyObject *retval = NULL;
2367 register PyObject **fastlocals, **freevars;
2368 PyThreadState *tstate = PyThreadState_GET();
2369 PyObject *x, *u;
2370
2371 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002372 PyErr_SetString(PyExc_SystemError,
2373 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002374 return NULL;
2375 }
2376
2377 f = PyFrame_New(tstate, /*back*/
2378 co, /*code*/
2379 globals, locals);
2380 if (f == NULL)
2381 return NULL;
2382
2383 fastlocals = f->f_localsplus;
2384 freevars = f->f_localsplus + f->f_nlocals;
2385
2386 if (co->co_argcount > 0 ||
2387 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2388 int i;
2389 int n = argcount;
2390 PyObject *kwdict = NULL;
2391 if (co->co_flags & CO_VARKEYWORDS) {
2392 kwdict = PyDict_New();
2393 if (kwdict == NULL)
2394 goto fail;
2395 i = co->co_argcount;
2396 if (co->co_flags & CO_VARARGS)
2397 i++;
2398 SETLOCAL(i, kwdict);
2399 }
2400 if (argcount > co->co_argcount) {
2401 if (!(co->co_flags & CO_VARARGS)) {
2402 PyErr_Format(PyExc_TypeError,
2403 "%.200s() takes %s %d "
2404 "%sargument%s (%d given)",
2405 PyString_AsString(co->co_name),
2406 defcount ? "at most" : "exactly",
2407 co->co_argcount,
2408 kwcount ? "non-keyword " : "",
2409 co->co_argcount == 1 ? "" : "s",
2410 argcount);
2411 goto fail;
2412 }
2413 n = co->co_argcount;
2414 }
2415 for (i = 0; i < n; i++) {
2416 x = args[i];
2417 Py_INCREF(x);
2418 SETLOCAL(i, x);
2419 }
2420 if (co->co_flags & CO_VARARGS) {
2421 u = PyTuple_New(argcount - n);
2422 if (u == NULL)
2423 goto fail;
2424 SETLOCAL(co->co_argcount, u);
2425 for (i = n; i < argcount; i++) {
2426 x = args[i];
2427 Py_INCREF(x);
2428 PyTuple_SET_ITEM(u, i-n, x);
2429 }
2430 }
2431 for (i = 0; i < kwcount; i++) {
2432 PyObject *keyword = kws[2*i];
2433 PyObject *value = kws[2*i + 1];
2434 int j;
2435 if (keyword == NULL || !PyString_Check(keyword)) {
2436 PyErr_Format(PyExc_TypeError,
2437 "%.200s() keywords must be strings",
2438 PyString_AsString(co->co_name));
2439 goto fail;
2440 }
2441 /* XXX slow -- speed up using dictionary? */
2442 for (j = 0; j < co->co_argcount; j++) {
2443 PyObject *nm = PyTuple_GET_ITEM(
2444 co->co_varnames, j);
2445 int cmp = PyObject_RichCompareBool(
2446 keyword, nm, Py_EQ);
2447 if (cmp > 0)
2448 break;
2449 else if (cmp < 0)
2450 goto fail;
2451 }
2452 /* Check errors from Compare */
2453 if (PyErr_Occurred())
2454 goto fail;
2455 if (j >= co->co_argcount) {
2456 if (kwdict == NULL) {
2457 PyErr_Format(PyExc_TypeError,
2458 "%.200s() got an unexpected "
2459 "keyword argument '%.400s'",
2460 PyString_AsString(co->co_name),
2461 PyString_AsString(keyword));
2462 goto fail;
2463 }
2464 PyDict_SetItem(kwdict, keyword, value);
2465 }
2466 else {
2467 if (GETLOCAL(j) != NULL) {
2468 PyErr_Format(PyExc_TypeError,
2469 "%.200s() got multiple "
2470 "values for keyword "
2471 "argument '%.400s'",
2472 PyString_AsString(co->co_name),
2473 PyString_AsString(keyword));
2474 goto fail;
2475 }
2476 Py_INCREF(value);
2477 SETLOCAL(j, value);
2478 }
2479 }
2480 if (argcount < co->co_argcount) {
2481 int m = co->co_argcount - defcount;
2482 for (i = argcount; i < m; i++) {
2483 if (GETLOCAL(i) == NULL) {
2484 PyErr_Format(PyExc_TypeError,
2485 "%.200s() takes %s %d "
2486 "%sargument%s (%d given)",
2487 PyString_AsString(co->co_name),
2488 ((co->co_flags & CO_VARARGS) ||
2489 defcount) ? "at least"
2490 : "exactly",
2491 m, kwcount ? "non-keyword " : "",
2492 m == 1 ? "" : "s", i);
2493 goto fail;
2494 }
2495 }
2496 if (n > m)
2497 i = n - m;
2498 else
2499 i = 0;
2500 for (; i < defcount; i++) {
2501 if (GETLOCAL(m+i) == NULL) {
2502 PyObject *def = defs[i];
2503 Py_INCREF(def);
2504 SETLOCAL(m+i, def);
2505 }
2506 }
2507 }
2508 }
2509 else {
2510 if (argcount > 0 || kwcount > 0) {
2511 PyErr_Format(PyExc_TypeError,
2512 "%.200s() takes no arguments (%d given)",
2513 PyString_AsString(co->co_name),
2514 argcount + kwcount);
2515 goto fail;
2516 }
2517 }
2518 /* Allocate and initialize storage for cell vars, and copy free
2519 vars into frame. This isn't too efficient right now. */
2520 if (f->f_ncells) {
2521 int i = 0, j = 0, nargs, found;
2522 char *cellname, *argname;
2523 PyObject *c;
2524
2525 nargs = co->co_argcount;
2526 if (co->co_flags & CO_VARARGS)
2527 nargs++;
2528 if (co->co_flags & CO_VARKEYWORDS)
2529 nargs++;
2530
2531 /* Check for cells that shadow args */
2532 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2533 cellname = PyString_AS_STRING(
2534 PyTuple_GET_ITEM(co->co_cellvars, i));
2535 found = 0;
2536 while (j < nargs) {
2537 argname = PyString_AS_STRING(
2538 PyTuple_GET_ITEM(co->co_varnames, j));
2539 if (strcmp(cellname, argname) == 0) {
2540 c = PyCell_New(GETLOCAL(j));
2541 if (c == NULL)
2542 goto fail;
2543 GETLOCAL(f->f_nlocals + i) = c;
2544 found = 1;
2545 break;
2546 }
2547 j++;
2548 }
2549 if (found == 0) {
2550 c = PyCell_New(NULL);
2551 if (c == NULL)
2552 goto fail;
2553 SETLOCAL(f->f_nlocals + i, c);
2554 }
2555 }
2556 /* Initialize any that are left */
2557 while (i < f->f_ncells) {
2558 c = PyCell_New(NULL);
2559 if (c == NULL)
2560 goto fail;
2561 SETLOCAL(f->f_nlocals + i, c);
2562 i++;
2563 }
2564 }
2565 if (f->f_nfreevars) {
2566 int i;
2567 for (i = 0; i < f->f_nfreevars; ++i) {
2568 PyObject *o = PyTuple_GET_ITEM(closure, i);
2569 Py_INCREF(o);
2570 freevars[f->f_ncells + i] = o;
2571 }
2572 }
2573
Tim Peters5ca576e2001-06-18 22:08:13 +00002574 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002575 /* Don't need to keep the reference to f_back, it will be set
2576 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002577 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002578 f->f_back = NULL;
2579
2580 /* Create a new generator that owns the ready to run frame
2581 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002582 return gen_new(f);
2583 }
2584
2585 retval = eval_frame(f);
2586
2587 fail: /* Jump here from prelude on failure */
2588
Tim Petersb13680b2001-11-27 23:29:29 +00002589 /* decref'ing the frame can cause __del__ methods to get invoked,
2590 which can call back into Python. While we're done with the
2591 current Python frame (f), the associated C stack is still in use,
2592 so recursion_depth must be boosted for the duration.
2593 */
2594 assert(tstate != NULL);
2595 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002596 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002597 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002598 return retval;
2599}
2600
2601
Guido van Rossuma027efa1997-05-05 20:56:21 +00002602static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002603set_exc_info(PyThreadState *tstate,
2604 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605{
2606 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002607 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002608
Guido van Rossuma027efa1997-05-05 20:56:21 +00002609 frame = tstate->frame;
2610 if (frame->f_exc_type == NULL) {
2611 /* This frame didn't catch an exception before */
2612 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002613 if (tstate->exc_type == NULL) {
2614 Py_INCREF(Py_None);
2615 tstate->exc_type = Py_None;
2616 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002617 tmp_type = frame->f_exc_type;
2618 tmp_value = frame->f_exc_value;
2619 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002620 Py_XINCREF(tstate->exc_type);
2621 Py_XINCREF(tstate->exc_value);
2622 Py_XINCREF(tstate->exc_traceback);
2623 frame->f_exc_type = tstate->exc_type;
2624 frame->f_exc_value = tstate->exc_value;
2625 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002626 Py_XDECREF(tmp_type);
2627 Py_XDECREF(tmp_value);
2628 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002629 }
2630 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 tmp_type = tstate->exc_type;
2632 tmp_value = tstate->exc_value;
2633 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 Py_XINCREF(type);
2635 Py_XINCREF(value);
2636 Py_XINCREF(tb);
2637 tstate->exc_type = type;
2638 tstate->exc_value = value;
2639 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002640 Py_XDECREF(tmp_type);
2641 Py_XDECREF(tmp_value);
2642 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002643 /* For b/w compatibility */
2644 PySys_SetObject("exc_type", type);
2645 PySys_SetObject("exc_value", value);
2646 PySys_SetObject("exc_traceback", tb);
2647}
2648
2649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002650reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002651{
2652 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002653 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002654 frame = tstate->frame;
2655 if (frame->f_exc_type != NULL) {
2656 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002657 tmp_type = tstate->exc_type;
2658 tmp_value = tstate->exc_value;
2659 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002660 Py_XINCREF(frame->f_exc_type);
2661 Py_XINCREF(frame->f_exc_value);
2662 Py_XINCREF(frame->f_exc_traceback);
2663 tstate->exc_type = frame->f_exc_type;
2664 tstate->exc_value = frame->f_exc_value;
2665 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002666 Py_XDECREF(tmp_type);
2667 Py_XDECREF(tmp_value);
2668 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002669 /* For b/w compatibility */
2670 PySys_SetObject("exc_type", frame->f_exc_type);
2671 PySys_SetObject("exc_value", frame->f_exc_value);
2672 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2673 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002674 tmp_type = frame->f_exc_type;
2675 tmp_value = frame->f_exc_value;
2676 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002677 frame->f_exc_type = NULL;
2678 frame->f_exc_value = NULL;
2679 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002680 Py_XDECREF(tmp_type);
2681 Py_XDECREF(tmp_value);
2682 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002683}
2684
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002685/* Logic for the raise statement (too complicated for inlining).
2686 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002687static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002688do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002689{
Guido van Rossumd295f121998-04-09 21:39:57 +00002690 if (type == NULL) {
2691 /* Reraise */
2692 PyThreadState *tstate = PyThreadState_Get();
2693 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2694 value = tstate->exc_value;
2695 tb = tstate->exc_traceback;
2696 Py_XINCREF(type);
2697 Py_XINCREF(value);
2698 Py_XINCREF(tb);
2699 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002700
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002701 /* We support the following forms of raise:
2702 raise <class>, <classinstance>
2703 raise <class>, <argument tuple>
2704 raise <class>, None
2705 raise <class>, <argument>
2706 raise <classinstance>, None
2707 raise <string>, <object>
2708 raise <string>, None
2709
2710 An omitted second argument is the same as None.
2711
2712 In addition, raise <tuple>, <anything> is the same as
2713 raising the tuple's first item (and it better have one!);
2714 this rule is applied recursively.
2715
2716 Finally, an optional third argument can be supplied, which
2717 gives the traceback to be substituted (useful when
2718 re-raising an exception after examining it). */
2719
2720 /* First, check the traceback argument, replacing None with
2721 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002722 if (tb == Py_None) {
2723 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002724 tb = NULL;
2725 }
2726 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002728 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002729 goto raise_error;
2730 }
2731
2732 /* Next, replace a missing value with None */
2733 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 value = Py_None;
2735 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 }
2737
2738 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2740 PyObject *tmp = type;
2741 type = PyTuple_GET_ITEM(type, 0);
2742 Py_INCREF(type);
2743 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002744 }
2745
Barry Warsaw4249f541997-08-22 21:26:19 +00002746 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002747 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002748
2749 else if (PyClass_Check(type))
2750 PyErr_NormalizeException(&type, &value, &tb);
2751
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002753 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 if (value != Py_None) {
2755 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002756 "instance exception may not have a separate value");
2757 goto raise_error;
2758 }
2759 else {
2760 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002761 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002762 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2764 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002765 }
2766 }
2767 else {
2768 /* Not something you can raise. You get an exception
2769 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002770 PyErr_Format(PyExc_TypeError,
2771 "exceptions must be strings, classes, or "
2772 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002773 goto raise_error;
2774 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002776 if (tb == NULL)
2777 return WHY_EXCEPTION;
2778 else
2779 return WHY_RERAISE;
2780 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 Py_XDECREF(value);
2782 Py_XDECREF(type);
2783 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002784 return WHY_EXCEPTION;
2785}
2786
Tim Petersd6d010b2001-06-21 02:49:55 +00002787/* Iterate v argcnt times and store the results on the stack (via decreasing
2788 sp). Return 1 for success, 0 if error. */
2789
Barry Warsawe42b18f1997-08-25 22:13:04 +00002790static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002791unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002792{
Tim Petersd6d010b2001-06-21 02:49:55 +00002793 int i = 0;
2794 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002795 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002796
Tim Petersd6d010b2001-06-21 02:49:55 +00002797 assert(v != NULL);
2798
2799 it = PyObject_GetIter(v);
2800 if (it == NULL)
2801 goto Error;
2802
2803 for (; i < argcnt; i++) {
2804 w = PyIter_Next(it);
2805 if (w == NULL) {
2806 /* Iterator done, via error or exhaustion. */
2807 if (!PyErr_Occurred()) {
2808 PyErr_Format(PyExc_ValueError,
2809 "need more than %d value%s to unpack",
2810 i, i == 1 ? "" : "s");
2811 }
2812 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002813 }
2814 *--sp = w;
2815 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002816
2817 /* We better have exhausted the iterator now. */
2818 w = PyIter_Next(it);
2819 if (w == NULL) {
2820 if (PyErr_Occurred())
2821 goto Error;
2822 Py_DECREF(it);
2823 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002824 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00002825 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00002826 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002827 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002828Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002829 for (; i > 0; i--, sp++)
2830 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002831 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002832 return 0;
2833}
2834
2835
Guido van Rossum96a42c81992-01-12 02:29:51 +00002836#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002837static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002840 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002841 if (PyObject_Print(v, stdout, 0) != 0)
2842 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002843 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002844 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002846#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002848static void
Fred Drake5755ce62001-06-27 19:19:46 +00002849call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002850{
Guido van Rossumb209a111997-04-29 18:18:01 +00002851 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002852 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002853 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002854 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002855 value = Py_None;
2856 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002857 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002858 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002859 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002860 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002861 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002862 }
Fred Drake5755ce62001-06-27 19:19:46 +00002863 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002864 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002865 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002866 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002867 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002868 Py_XDECREF(type);
2869 Py_XDECREF(value);
2870 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002871 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002872}
2873
Fred Drake4ec5d562001-10-04 19:26:43 +00002874static void
2875call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2876 int what)
2877{
2878 PyObject *type, *value, *traceback;
2879 int err;
2880 PyErr_Fetch(&type, &value, &traceback);
2881 err = call_trace(func, obj, frame, what, NULL);
2882 if (err == 0)
2883 PyErr_Restore(type, value, traceback);
2884 else {
2885 Py_XDECREF(type);
2886 Py_XDECREF(value);
2887 Py_XDECREF(traceback);
2888 }
2889}
2890
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002891static int
Fred Drake5755ce62001-06-27 19:19:46 +00002892call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2893 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002894{
Fred Drake5755ce62001-06-27 19:19:46 +00002895 register PyThreadState *tstate = frame->f_tstate;
2896 int result;
2897 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002898 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002899 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002900 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002901 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002902 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2903 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002904 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002905 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002906}
2907
Fred Drake5755ce62001-06-27 19:19:46 +00002908void
2909PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002910{
Fred Drake5755ce62001-06-27 19:19:46 +00002911 PyThreadState *tstate = PyThreadState_Get();
2912 PyObject *temp = tstate->c_profileobj;
2913 Py_XINCREF(arg);
2914 tstate->c_profilefunc = NULL;
2915 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002916 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002917 Py_XDECREF(temp);
2918 tstate->c_profilefunc = func;
2919 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002920 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002921}
2922
2923void
2924PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2925{
2926 PyThreadState *tstate = PyThreadState_Get();
2927 PyObject *temp = tstate->c_traceobj;
2928 Py_XINCREF(arg);
2929 tstate->c_tracefunc = NULL;
2930 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002931 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002932 Py_XDECREF(temp);
2933 tstate->c_tracefunc = func;
2934 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002935 tstate->use_tracing = ((func != NULL)
2936 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002937}
2938
Guido van Rossumb209a111997-04-29 18:18:01 +00002939PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002940PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002941{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002942 PyThreadState *tstate = PyThreadState_Get();
2943 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002944 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002945 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002946 else
2947 return current_frame->f_builtins;
2948}
2949
Guido van Rossumb209a111997-04-29 18:18:01 +00002950PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002951PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002952{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002953 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002954 if (current_frame == NULL)
2955 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002956 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002957 return current_frame->f_locals;
2958}
2959
Guido van Rossumb209a111997-04-29 18:18:01 +00002960PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002961PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002962{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002963 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002964 if (current_frame == NULL)
2965 return NULL;
2966 else
2967 return current_frame->f_globals;
2968}
2969
Guido van Rossumb209a111997-04-29 18:18:01 +00002970PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002971PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002972{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002973 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002974 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002975}
2976
Guido van Rossum6135a871995-01-09 17:53:26 +00002977int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002978PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002979{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002980 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002981 return current_frame == NULL ? 0 : current_frame->f_restricted;
2982}
2983
Guido van Rossumbe270261997-05-22 22:26:18 +00002984int
Tim Peters5ba58662001-07-16 02:29:45 +00002985PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002986{
2987 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002988 int result = 0;
2989
2990 if (current_frame != NULL) {
2991 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002992 const int compilerflags = codeflags & PyCF_MASK;
2993 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002994 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002995 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002996 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00002997#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002998 if (codeflags & CO_GENERATOR_ALLOWED) {
2999 result = 1;
3000 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3001 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003002#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003003 }
3004 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003005}
3006
3007int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003008Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009{
Guido van Rossumb209a111997-04-29 18:18:01 +00003010 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003011 if (f == NULL)
3012 return 0;
3013 if (!PyFile_SoftSpace(f, 0))
3014 return 0;
3015 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016}
3017
Guido van Rossum3f5da241990-12-20 15:06:42 +00003018
Guido van Rossum681d79a1995-07-18 14:51:37 +00003019/* External interface to call any callable object.
3020 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003021
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003022#undef PyEval_CallObject
3023/* for backward compatibility: export this interface */
3024
Guido van Rossumb209a111997-04-29 18:18:01 +00003025PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003026PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003027{
Guido van Rossumb209a111997-04-29 18:18:01 +00003028 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003030#define PyEval_CallObject(func,arg) \
3031 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003032
Guido van Rossumb209a111997-04-29 18:18:01 +00003033PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003034PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003035{
Jeremy Hylton52820442001-01-03 23:52:36 +00003036 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003037
3038 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00003039 arg = PyTuple_New(0);
3040 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003041 PyErr_SetString(PyExc_TypeError,
3042 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003043 return NULL;
3044 }
3045 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003046 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047
Guido van Rossumb209a111997-04-29 18:18:01 +00003048 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003049 PyErr_SetString(PyExc_TypeError,
3050 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003051 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003052 return NULL;
3053 }
3054
Tim Peters6d6c1a32001-08-02 04:15:00 +00003055 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003056 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003057 return result;
3058}
3059
Tim Peters6d6c1a32001-08-02 04:15:00 +00003060char *
3061PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003062{
3063 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003064 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003065 else if (PyFunction_Check(func))
3066 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3067 else if (PyCFunction_Check(func))
3068 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3069 else if (PyClass_Check(func))
3070 return PyString_AsString(((PyClassObject*)func)->cl_name);
3071 else if (PyInstance_Check(func)) {
3072 return PyString_AsString(
3073 ((PyInstanceObject*)func)->in_class->cl_name);
3074 } else {
3075 return func->ob_type->tp_name;
3076 }
3077}
3078
Tim Peters6d6c1a32001-08-02 04:15:00 +00003079char *
3080PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003081{
3082 if (PyMethod_Check(func))
3083 return "()";
3084 else if (PyFunction_Check(func))
3085 return "()";
3086 else if (PyCFunction_Check(func))
3087 return "()";
3088 else if (PyClass_Check(func))
3089 return " constructor";
3090 else if (PyInstance_Check(func)) {
3091 return " instance";
3092 } else {
3093 return " object";
3094 }
3095}
3096
Jeremy Hylton52820442001-01-03 23:52:36 +00003097#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3098
3099/* The two fast_xxx() functions optimize calls for which no argument
3100 tuple is necessary; the objects are passed directly from the stack.
3101 fast_cfunction() is called for METH_OLDARGS functions.
3102 fast_function() is for functions with no special argument handling.
3103*/
3104
3105static PyObject *
3106fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3107{
3108 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3109 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003110 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003111
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003112 switch (flags) {
3113 case METH_OLDARGS:
3114 if (na == 0)
3115 return (*meth)(self, NULL);
3116 else if (na == 1) {
3117 PyObject *arg = EXT_POP(*pp_stack);
3118 PyObject *result = (*meth)(self, arg);
3119 Py_DECREF(arg);
3120 return result;
3121 } else {
3122 PyObject *args = load_args(pp_stack, na);
3123 PyObject *result = (*meth)(self, args);
3124 Py_DECREF(args);
3125 return result;
3126 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003127 case METH_NOARGS:
3128 if (na == 0)
3129 return (*meth)(self, NULL);
3130 PyErr_Format(PyExc_TypeError,
3131 "%.200s() takes no arguments (%d given)",
3132 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3133 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003134 case METH_O:
3135 if (na == 1) {
3136 PyObject *arg = EXT_POP(*pp_stack);
3137 PyObject *result = (*meth)(self, arg);
3138 Py_DECREF(arg);
3139 return result;
3140 }
3141 PyErr_Format(PyExc_TypeError,
3142 "%.200s() takes exactly one argument (%d given)",
3143 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3144 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003145 default:
3146 fprintf(stderr, "%.200s() flags = %d\n",
3147 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3148 PyErr_BadInternalCall();
3149 return NULL;
3150 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003151}
3152
3153static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003154fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003155{
3156 PyObject *co = PyFunction_GET_CODE(func);
3157 PyObject *globals = PyFunction_GET_GLOBALS(func);
3158 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003159 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003160 PyObject **d = NULL;
3161 int nd = 0;
3162
3163 if (argdefs != NULL) {
3164 d = &PyTuple_GET_ITEM(argdefs, 0);
3165 nd = ((PyTupleObject *)argdefs)->ob_size;
3166 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003167 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003168 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003169 (*pp_stack)-2*nk, nk, d, nd,
3170 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003171}
3172
3173static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003174update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3175 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003176{
3177 PyObject *kwdict = NULL;
3178 if (orig_kwdict == NULL)
3179 kwdict = PyDict_New();
3180 else {
3181 kwdict = PyDict_Copy(orig_kwdict);
3182 Py_DECREF(orig_kwdict);
3183 }
3184 if (kwdict == NULL)
3185 return NULL;
3186 while (--nk >= 0) {
3187 int err;
3188 PyObject *value = EXT_POP(*pp_stack);
3189 PyObject *key = EXT_POP(*pp_stack);
3190 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003191 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003192 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003193 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003194 PyEval_GetFuncName(func),
3195 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003196 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003197 Py_DECREF(key);
3198 Py_DECREF(value);
3199 Py_DECREF(kwdict);
3200 return NULL;
3201 }
3202 err = PyDict_SetItem(kwdict, key, value);
3203 Py_DECREF(key);
3204 Py_DECREF(value);
3205 if (err) {
3206 Py_DECREF(kwdict);
3207 return NULL;
3208 }
3209 }
3210 return kwdict;
3211}
3212
3213static PyObject *
3214update_star_args(int nstack, int nstar, PyObject *stararg,
3215 PyObject ***pp_stack)
3216{
3217 PyObject *callargs, *w;
3218
3219 callargs = PyTuple_New(nstack + nstar);
3220 if (callargs == NULL) {
3221 return NULL;
3222 }
3223 if (nstar) {
3224 int i;
3225 for (i = 0; i < nstar; i++) {
3226 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3227 Py_INCREF(a);
3228 PyTuple_SET_ITEM(callargs, nstack + i, a);
3229 }
3230 }
3231 while (--nstack >= 0) {
3232 w = EXT_POP(*pp_stack);
3233 PyTuple_SET_ITEM(callargs, nstack, w);
3234 }
3235 return callargs;
3236}
3237
3238static PyObject *
3239load_args(PyObject ***pp_stack, int na)
3240{
3241 PyObject *args = PyTuple_New(na);
3242 PyObject *w;
3243
3244 if (args == NULL)
3245 return NULL;
3246 while (--na >= 0) {
3247 w = EXT_POP(*pp_stack);
3248 PyTuple_SET_ITEM(args, na, w);
3249 }
3250 return args;
3251}
3252
3253static PyObject *
3254do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3255{
3256 PyObject *callargs = NULL;
3257 PyObject *kwdict = NULL;
3258 PyObject *result = NULL;
3259
3260 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003261 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003262 if (kwdict == NULL)
3263 goto call_fail;
3264 }
3265 callargs = load_args(pp_stack, na);
3266 if (callargs == NULL)
3267 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003268 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003269 call_fail:
3270 Py_XDECREF(callargs);
3271 Py_XDECREF(kwdict);
3272 return result;
3273}
3274
3275static PyObject *
3276ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3277{
3278 int nstar = 0;
3279 PyObject *callargs = NULL;
3280 PyObject *stararg = NULL;
3281 PyObject *kwdict = NULL;
3282 PyObject *result = NULL;
3283
3284 if (flags & CALL_FLAG_KW) {
3285 kwdict = EXT_POP(*pp_stack);
3286 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003287 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003288 "%s%s argument after ** "
3289 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003290 PyEval_GetFuncName(func),
3291 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003292 goto ext_call_fail;
3293 }
3294 }
3295 if (flags & CALL_FLAG_VAR) {
3296 stararg = EXT_POP(*pp_stack);
3297 if (!PyTuple_Check(stararg)) {
3298 PyObject *t = NULL;
3299 t = PySequence_Tuple(stararg);
3300 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003301 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3302 PyErr_Format(PyExc_TypeError,
3303 "%s%s argument after * "
3304 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003305 PyEval_GetFuncName(func),
3306 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003307 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003308 goto ext_call_fail;
3309 }
3310 Py_DECREF(stararg);
3311 stararg = t;
3312 }
3313 nstar = PyTuple_GET_SIZE(stararg);
3314 }
3315 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003316 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003317 if (kwdict == NULL)
3318 goto ext_call_fail;
3319 }
3320 callargs = update_star_args(na, nstar, stararg, pp_stack);
3321 if (callargs == NULL)
3322 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003323 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003324 ext_call_fail:
3325 Py_XDECREF(callargs);
3326 Py_XDECREF(kwdict);
3327 Py_XDECREF(stararg);
3328 return result;
3329}
3330
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003331#define SLICE_ERROR_MSG \
3332 "standard sequence type does not support step size other than one"
3333
Guido van Rossumb209a111997-04-29 18:18:01 +00003334static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003335loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336{
Guido van Rossumb209a111997-04-29 18:18:01 +00003337 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003338 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003339 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003340 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341 return NULL;
3342 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003343 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003344 v = (*sq->sq_item)(v, i);
3345 if (v)
3346 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003347 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003348 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003349 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350}
3351
Tim Peterscb479e72001-12-16 19:11:44 +00003352/* Extract a slice index from a PyInt or PyLong, and store in *pi.
3353 Silently reduce values larger than INT_MAX to INT_MAX, and silently
3354 boost values less than -INT_MAX to 0. Return 0 on error, 1 on success.
3355*/
Tim Petersb5196382001-12-16 19:44:20 +00003356/* Note: If v is NULL, return success without storing into *pi. This
3357 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3358 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003359*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003360int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003361_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362{
Tim Petersb5196382001-12-16 19:44:20 +00003363 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003364 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003365 if (PyInt_Check(v)) {
3366 x = PyInt_AsLong(v);
3367 } else if (PyLong_Check(v)) {
3368 x = PyLong_AsLong(v);
3369 if (x==-1 && PyErr_Occurred()) {
3370 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003371 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003372
Guido van Rossumac7be682001-01-17 15:42:30 +00003373 if (!PyErr_ExceptionMatches(
3374 PyExc_OverflowError)) {
3375 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003376 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003377 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003378 }
3379
Guido van Rossumac7be682001-01-17 15:42:30 +00003380 /* Clear the OverflowError */
3381 PyErr_Clear();
3382
3383 /* It's an overflow error, so we need to
3384 check the sign of the long integer,
3385 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003386 the error. */
3387
3388 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003389 long_zero = PyLong_FromLong(0L);
Tim Peterscb479e72001-12-16 19:11:44 +00003390 if (long_zero == NULL)
3391 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003392
3393 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003394 cmp = PyObject_RichCompareBool(v, long_zero,
3395 Py_GT);
3396 Py_DECREF(long_zero);
3397 if (cmp < 0)
3398 return 0;
3399 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003400 x = INT_MAX;
3401 else
3402 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003403 }
3404 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003405 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003406 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003407 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003409 /* Truncate -- very long indices are truncated anyway */
3410 if (x > INT_MAX)
3411 x = INT_MAX;
3412 else if (x < -INT_MAX)
3413 x = 0;
3414 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003416 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417}
3418
Guido van Rossum50d756e2001-08-18 17:43:36 +00003419#undef ISINT
3420#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3421
Guido van Rossumb209a111997-04-29 18:18:01 +00003422static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003423apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003425 PyTypeObject *tp = u->ob_type;
3426 PySequenceMethods *sq = tp->tp_as_sequence;
3427
3428 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3429 int ilow = 0, ihigh = INT_MAX;
3430 if (!_PyEval_SliceIndex(v, &ilow))
3431 return NULL;
3432 if (!_PyEval_SliceIndex(w, &ihigh))
3433 return NULL;
3434 return PySequence_GetSlice(u, ilow, ihigh);
3435 }
3436 else {
3437 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003438 if (slice != NULL) {
3439 PyObject *res = PyObject_GetItem(u, slice);
3440 Py_DECREF(slice);
3441 return res;
3442 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003443 else
3444 return NULL;
3445 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003447
3448static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003449assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3450 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003452 PyTypeObject *tp = u->ob_type;
3453 PySequenceMethods *sq = tp->tp_as_sequence;
3454
3455 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3456 int ilow = 0, ihigh = INT_MAX;
3457 if (!_PyEval_SliceIndex(v, &ilow))
3458 return -1;
3459 if (!_PyEval_SliceIndex(w, &ihigh))
3460 return -1;
3461 if (x == NULL)
3462 return PySequence_DelSlice(u, ilow, ihigh);
3463 else
3464 return PySequence_SetSlice(u, ilow, ihigh, x);
3465 }
3466 else {
3467 PyObject *slice = PySlice_New(v, w, NULL);
3468 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003469 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003470 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003471 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003472 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003473 res = PyObject_DelItem(u, slice);
3474 Py_DECREF(slice);
3475 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003476 }
3477 else
3478 return -1;
3479 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003480}
3481
Guido van Rossumb209a111997-04-29 18:18:01 +00003482static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003483cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484{
Guido van Rossumac7be682001-01-17 15:42:30 +00003485 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003487 case PyCmp_IS:
3488 case PyCmp_IS_NOT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003489 res = (v == w);
Martin v. Löwis7198a522002-01-01 19:59:11 +00003490 if (op == (int) PyCmp_IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003491 res = !res;
3492 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003493 case PyCmp_IN:
3494 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003495 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003496 if (res < 0)
3497 return NULL;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003498 if (op == (int) PyCmp_NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003499 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003500 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003501 case PyCmp_EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003502 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503 break;
3504 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003505 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003507 v = res ? Py_True : Py_False;
3508 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509 return v;
3510}
3511
Thomas Wouters52152252000-08-17 22:55:00 +00003512static PyObject *
3513import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003514{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003515 PyObject *x;
3516
3517 x = PyObject_GetAttr(v, name);
3518 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003519 PyErr_Format(PyExc_ImportError,
3520 "cannot import name %.230s",
3521 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003522 }
Thomas Wouters52152252000-08-17 22:55:00 +00003523 return x;
3524}
Guido van Rossumac7be682001-01-17 15:42:30 +00003525
Thomas Wouters52152252000-08-17 22:55:00 +00003526static int
3527import_all_from(PyObject *locals, PyObject *v)
3528{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003529 PyObject *all = PyObject_GetAttrString(v, "__all__");
3530 PyObject *dict, *name, *value;
3531 int skip_leading_underscores = 0;
3532 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003533
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003534 if (all == NULL) {
3535 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3536 return -1; /* Unexpected error */
3537 PyErr_Clear();
3538 dict = PyObject_GetAttrString(v, "__dict__");
3539 if (dict == NULL) {
3540 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3541 return -1;
3542 PyErr_SetString(PyExc_ImportError,
3543 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003544 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003545 }
3546 all = PyMapping_Keys(dict);
3547 Py_DECREF(dict);
3548 if (all == NULL)
3549 return -1;
3550 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003551 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003552
3553 for (pos = 0, err = 0; ; pos++) {
3554 name = PySequence_GetItem(all, pos);
3555 if (name == NULL) {
3556 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3557 err = -1;
3558 else
3559 PyErr_Clear();
3560 break;
3561 }
3562 if (skip_leading_underscores &&
3563 PyString_Check(name) &&
3564 PyString_AS_STRING(name)[0] == '_')
3565 {
3566 Py_DECREF(name);
3567 continue;
3568 }
3569 value = PyObject_GetAttr(v, name);
3570 if (value == NULL)
3571 err = -1;
3572 else
3573 err = PyDict_SetItem(locals, name, value);
3574 Py_DECREF(name);
3575 Py_XDECREF(value);
3576 if (err != 0)
3577 break;
3578 }
3579 Py_DECREF(all);
3580 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003581}
3582
Guido van Rossumb209a111997-04-29 18:18:01 +00003583static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003584build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003585{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003586 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003587
3588 if (PyDict_Check(methods))
3589 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003590 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00003591 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00003592 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3593 base = PyTuple_GET_ITEM(bases, 0);
3594 metaclass = PyObject_GetAttrString(base, "__class__");
3595 if (metaclass == NULL) {
3596 PyErr_Clear();
3597 metaclass = (PyObject *)base->ob_type;
3598 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003599 }
3600 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003601 else {
3602 PyObject *g = PyEval_GetGlobals();
3603 if (g != NULL && PyDict_Check(g))
3604 metaclass = PyDict_GetItemString(g, "__metaclass__");
3605 if (metaclass == NULL)
3606 metaclass = (PyObject *) &PyClass_Type;
3607 Py_INCREF(metaclass);
3608 }
3609 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3610 Py_DECREF(metaclass);
3611 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003612}
3613
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003614static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003615exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3616 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003617{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003618 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003619 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003620 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003621
Guido van Rossumb209a111997-04-29 18:18:01 +00003622 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3623 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003624 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003625 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003626 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003627 locals = PyTuple_GetItem(prog, 2);
3628 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003629 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003630 if (globals == Py_None) {
3631 globals = PyEval_GetGlobals();
3632 if (locals == Py_None) {
3633 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003634 plain = 1;
3635 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003636 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003637 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003638 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003639 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003640 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003641 !PyCode_Check(prog) &&
3642 !PyFile_Check(prog)) {
3643 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003644 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003645 return -1;
3646 }
Fred Drake661ea262000-10-24 19:57:45 +00003647 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003648 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003649 "exec: arg 2 must be a dictionary or None");
3650 return -1;
3651 }
3652 if (!PyDict_Check(locals)) {
3653 PyErr_SetString(PyExc_TypeError,
3654 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003655 return -1;
3656 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003657 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003658 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003659 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00003660 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
3661 PyErr_SetString(PyExc_TypeError,
3662 "code object passed to exec may not contain free variables");
3663 return -1;
3664 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003665 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003666 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003667 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003668 FILE *fp = PyFile_AsFile(prog);
3669 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003670 PyCompilerFlags cf;
3671 cf.cf_flags = 0;
3672 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003673 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3674 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003675 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003676 v = PyRun_File(fp, name, Py_file_input, globals,
3677 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003678 }
3679 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003680 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003681 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003682 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003683 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003684 cf.cf_flags = 0;
3685 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003686 v = PyRun_StringFlags(str, Py_file_input, globals,
3687 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003688 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003689 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003690 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003691 if (plain)
3692 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003693 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003694 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003695 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003696 return 0;
3697}
Guido van Rossum24c13741995-02-14 09:42:43 +00003698
Guido van Rossumac7be682001-01-17 15:42:30 +00003699static void
Paul Prescode68140d2000-08-30 20:25:01 +00003700format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3701{
3702 char *obj_str;
3703
3704 if (!obj)
3705 return;
3706
3707 obj_str = PyString_AsString(obj);
3708 if (!obj_str)
3709 return;
3710
3711 PyErr_Format(exc, format_str, obj_str);
3712}
Guido van Rossum950361c1997-01-24 13:49:28 +00003713
3714#ifdef DYNAMIC_EXECUTION_PROFILE
3715
Skip Montanarof118cb12001-10-15 20:51:38 +00003716static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003717getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003718{
3719 int i;
3720 PyObject *l = PyList_New(256);
3721 if (l == NULL) return NULL;
3722 for (i = 0; i < 256; i++) {
3723 PyObject *x = PyInt_FromLong(a[i]);
3724 if (x == NULL) {
3725 Py_DECREF(l);
3726 return NULL;
3727 }
3728 PyList_SetItem(l, i, x);
3729 }
3730 for (i = 0; i < 256; i++)
3731 a[i] = 0;
3732 return l;
3733}
3734
3735PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003736_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003737{
3738#ifndef DXPAIRS
3739 return getarray(dxp);
3740#else
3741 int i;
3742 PyObject *l = PyList_New(257);
3743 if (l == NULL) return NULL;
3744 for (i = 0; i < 257; i++) {
3745 PyObject *x = getarray(dxpairs[i]);
3746 if (x == NULL) {
3747 Py_DECREF(l);
3748 return NULL;
3749 }
3750 PyList_SetItem(l, i, x);
3751 }
3752 return l;
3753#endif
3754}
3755
3756#endif