blob: e614e17fc16eb5c8879b7a386802a3f7fe33e414 [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:
Fred Drake5755ce62001-06-27 19:19:46 +00005 XXX how to pass arguments to profile and trace functions?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
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 */
Guido van Rossum374a9221991-04-04 10:40:29 +000035
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static PyObject *eval_code2(PyCodeObject *,
37 PyObject *, PyObject *,
38 PyObject **, int,
39 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000040 PyObject **, int,
41 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000042
Tim Peters5ca576e2001-06-18 22:08:13 +000043static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton512a2372001-04-11 13:52:29 +000044static char *get_func_name(PyObject *);
45static char *get_func_desc(PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000046static PyObject *call_object(PyObject *, PyObject *, PyObject *);
47static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
48static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
49static PyObject *call_method(PyObject *, PyObject *, PyObject *);
50static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
51static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
52static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
53static PyObject *do_call(PyObject *, PyObject ***, int, int);
54static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000055static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000056static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000057static PyObject *load_args(PyObject ***, int);
58#define CALL_FLAG_VAR 1
59#define CALL_FLAG_KW 2
60
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000063#endif
Fred Drake5755ce62001-06-27 19:19:46 +000064static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
65 int, PyObject *);
66static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000067static PyObject *loop_subscript(PyObject *, PyObject *);
68static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
69static int assign_slice(PyObject *, PyObject *,
70 PyObject *, PyObject *);
71static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000072static PyObject *import_from(PyObject *, PyObject *);
73static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static PyObject *build_class(PyObject *, PyObject *, PyObject *);
75static int exec_statement(PyFrameObject *,
76 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000077static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
78static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000079static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000080
Paul Prescode68140d2000-08-30 20:25:01 +000081#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000082 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083#define GLOBAL_NAME_ERROR_MSG \
84 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000085#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000086 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000087#define UNBOUNDFREE_ERROR_MSG \
88 "free variable '%.200s' referenced before assignment" \
89 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000090
Guido van Rossum950361c1997-01-24 13:49:28 +000091/* Dynamic execution profile */
92#ifdef DYNAMIC_EXECUTION_PROFILE
93#ifdef DXPAIRS
94static long dxpairs[257][256];
95#define dxp dxpairs[256]
96#else
97static long dxp[256];
98#endif
99#endif
100
Fred Drake904aa7b2001-06-08 04:33:09 +0000101
Tim Peters5ca576e2001-06-18 22:08:13 +0000102staticforward PyTypeObject gentype;
103
104typedef struct {
105 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000106 /* The gi_ prefix is intended to remind of generator-iterator. */
107
108 PyFrameObject *gi_frame;
109
Tim Peterse77f2e22001-06-26 22:24:51 +0000110 /* True if generator is being executed. */
111 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +0000112} genobject;
113
114static PyObject *
115gen_new(PyFrameObject *f)
116{
117 genobject *gen = PyObject_New(genobject, &gentype);
118 if (gen == NULL) {
119 Py_DECREF(f);
120 return NULL;
121 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000122 gen->gi_frame = f;
123 gen->gi_running = 0;
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000124 PyObject_GC_Init(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000125 return (PyObject *)gen;
126}
127
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000128static int
129gen_traverse(genobject *gen, visitproc visit, void *arg)
130{
131 return visit((PyObject *)gen->gi_frame, arg);
132}
133
Tim Peters5ca576e2001-06-18 22:08:13 +0000134static void
135gen_dealloc(genobject *gen)
136{
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000137 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000138 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000139 PyObject_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000140}
141
142static PyObject *
143gen_iternext(genobject *gen)
144{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000145 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000146 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000147 PyObject *result;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 PyErr_SetString(PyExc_ValueError,
151 "generator already executing");
152 return NULL;
153 }
Tim Peters8c963692001-06-23 05:26:56 +0000154 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000155 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000156
157 /* Generators always return to their most recent caller, not
158 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000159 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000160 assert(f->f_back == NULL);
161 f->f_back = tstate->frame;
162
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000163 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000164 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000165 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166
167 /* Don't keep the reference to f_back any longer than necessary. It
168 * may keep a chain of frames alive or it could create a reference
169 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000170 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000171 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000172
Tim Petersad1a18b2001-06-23 06:19:16 +0000173 /* If the generator just returned (as opposed to yielding), signal
174 * that the generator is exhausted. */
175 if (result == Py_None && f->f_stacktop == NULL) {
176 Py_DECREF(result);
177 result = NULL;
178 }
179
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000180 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000181}
182
183static PyObject *
184gen_next(genobject *gen, PyObject *args)
185{
186 PyObject *result;
187
188 if (!PyArg_ParseTuple(args, ":next"))
189 return NULL;
190
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000191 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000192
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000193 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 PyErr_SetObject(PyExc_StopIteration, Py_None);
195 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000196 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000197
198 return result;
199}
200
201static PyObject *
202gen_getiter(PyObject *gen)
203{
204 Py_INCREF(gen);
205 return gen;
206}
207
208static struct PyMethodDef gen_methods[] = {
209 {"next", (PyCFunction)gen_next, METH_VARARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000210 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000211 {NULL, NULL} /* Sentinel */
212};
213
214static PyObject *
215gen_getattr(genobject *gen, char *name)
216{
Tim Peterse77f2e22001-06-26 22:24:51 +0000217 PyObject *result;
218
219 if (strcmp(name, "gi_frame") == 0) {
220 result = (PyObject *)gen->gi_frame;
221 assert(result != NULL);
222 Py_INCREF(result);
223 }
224 else if (strcmp(name, "gi_running") == 0)
225 result = (PyObject *)PyInt_FromLong((long)gen->gi_running);
226 else if (strcmp(name, "__members__") == 0)
227 result = Py_BuildValue("[ss]", "gi_frame", "gi_running");
228 else
229 result = Py_FindMethod(gen_methods, (PyObject *)gen, name);
230 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000231}
232
233statichere PyTypeObject gentype = {
234 PyObject_HEAD_INIT(&PyType_Type)
235 0, /* ob_size */
236 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000237 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000238 0, /* tp_itemsize */
239 /* methods */
240 (destructor)gen_dealloc, /* tp_dealloc */
241 0, /* tp_print */
242 (getattrfunc)gen_getattr, /* tp_getattr */
243 0, /* tp_setattr */
244 0, /* tp_compare */
245 0, /* tp_repr */
246 0, /* tp_as_number */
247 0, /* tp_as_sequence */
248 0, /* tp_as_mapping */
249 0, /* tp_hash */
250 0, /* tp_call */
251 0, /* tp_str */
252 0, /* tp_getattro */
253 0, /* tp_setattro */
254 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000255 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000256 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000257 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000258 0, /* tp_clear */
259 0, /* tp_richcompare */
260 0, /* tp_weaklistoffset */
261 (getiterfunc)gen_getiter, /* tp_iter */
262 (iternextfunc)gen_iternext, /* tp_iternext */
263};
264
265
Guido van Rossume59214e1994-08-30 08:01:59 +0000266#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000267
Guido van Rossum2571cc81999-04-07 16:07:23 +0000268#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000269#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000270#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000271#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000272
Guido van Rossuma027efa1997-05-05 20:56:21 +0000273extern int _PyThread_Started; /* Flag for Py_Exit */
274
Guido van Rossum65d5b571998-12-21 19:32:43 +0000275static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000276static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000277
278void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000280{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000281 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000282 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000283 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000284 interpreter_lock = PyThread_allocate_lock();
285 PyThread_acquire_lock(interpreter_lock, 1);
286 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000287}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000288
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000289void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000290PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000291{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000292 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000293}
294
295void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000296PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000297{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000298 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000299}
300
301void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000302PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000303{
304 if (tstate == NULL)
305 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000306 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000307 if (PyThreadState_Swap(tstate) != NULL)
308 Py_FatalError(
309 "PyEval_AcquireThread: non-NULL old thread state");
310}
311
312void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000313PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000314{
315 if (tstate == NULL)
316 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
317 if (PyThreadState_Swap(NULL) != tstate)
318 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000319 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000320}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000321
322/* This function is called from PyOS_AfterFork to ensure that newly
323 created child processes don't hold locks referring to threads which
324 are not running in the child process. (This could also be done using
325 pthread_atfork mechanism, at least for the pthreads implementation.) */
326
327void
328PyEval_ReInitThreads(void)
329{
330 if (!interpreter_lock)
331 return;
332 /*XXX Can't use PyThread_free_lock here because it does too
333 much error-checking. Doing this cleanly would require
334 adding a new function to each thread_*.h. Instead, just
335 create a new lock and waste a little bit of memory */
336 interpreter_lock = PyThread_allocate_lock();
337 PyThread_acquire_lock(interpreter_lock, 1);
338 main_thread = PyThread_get_thread_ident();
339}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340#endif
341
Guido van Rossumff4949e1992-08-05 19:58:53 +0000342/* Functions save_thread and restore_thread are always defined so
343 dynamically loaded modules needn't be compiled separately for use
344 with and without threads: */
345
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000346PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000347PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000348{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000349 PyThreadState *tstate = PyThreadState_Swap(NULL);
350 if (tstate == NULL)
351 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000352#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000353 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000354 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000355#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000356 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000357}
358
359void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000360PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000361{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000362 if (tstate == NULL)
363 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000364#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000365 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000366 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000367 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000368 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000369 }
370#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000371 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000372}
373
374
Guido van Rossuma9672091994-09-14 13:31:22 +0000375/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
376 signal handlers or Mac I/O completion routines) can schedule calls
377 to a function to be called synchronously.
378 The synchronous function is called with one void* argument.
379 It should return 0 for success or -1 for failure -- failure should
380 be accompanied by an exception.
381
382 If registry succeeds, the registry function returns 0; if it fails
383 (e.g. due to too many pending calls) it returns -1 (without setting
384 an exception condition).
385
386 Note that because registry may occur from within signal handlers,
387 or other asynchronous events, calling malloc() is unsafe!
388
389#ifdef WITH_THREAD
390 Any thread can schedule pending calls, but only the main thread
391 will execute them.
392#endif
393
394 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
395 There are two possible race conditions:
396 (1) nested asynchronous registry calls;
397 (2) registry calls made while pending calls are being processed.
398 While (1) is very unlikely, (2) is a real possibility.
399 The current code is safe against (2), but not against (1).
400 The safety against (2) is derived from the fact that only one
401 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000402
Guido van Rossuma027efa1997-05-05 20:56:21 +0000403 XXX Darn! With the advent of thread state, we should have an array
404 of pending calls per thread in the thread state! Later...
405*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000406
Guido van Rossuma9672091994-09-14 13:31:22 +0000407#define NPENDINGCALLS 32
408static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000409 int (*func)(void *);
410 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411} pendingcalls[NPENDINGCALLS];
412static volatile int pendingfirst = 0;
413static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000415
416int
Thomas Wouters334fb892000-07-25 12:56:38 +0000417Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000418{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000419 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 int i, j;
421 /* XXX Begin critical section */
422 /* XXX If you want this to be safe against nested
423 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000424 if (busy)
425 return -1;
426 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427 i = pendinglast;
428 j = (i + 1) % NPENDINGCALLS;
429 if (j == pendingfirst)
430 return -1; /* Queue full */
431 pendingcalls[i].func = func;
432 pendingcalls[i].arg = arg;
433 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000434 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000435 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000436 /* XXX End critical section */
437 return 0;
438}
439
Guido van Rossum180d7b41994-09-29 09:45:57 +0000440int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000441Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000442{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000445 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000446 return 0;
447#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000448 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000449 return 0;
450 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000451 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000452 for (;;) {
453 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000454 int (*func)(void *);
455 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000456 i = pendingfirst;
457 if (i == pendinglast)
458 break; /* Queue empty */
459 func = pendingcalls[i].func;
460 arg = pendingcalls[i].arg;
461 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000462 if (func(arg) < 0) {
463 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000464 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000465 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000466 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000467 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000468 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000469 return 0;
470}
471
472
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000473/* The interpreter's recursion limit */
474
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000475static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000476
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000477int
478Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000479{
480 return recursion_limit;
481}
482
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000483void
484Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000485{
486 recursion_limit = new_limit;
487}
488
Guido van Rossum374a9221991-04-04 10:40:29 +0000489/* Status code for main loop (reason for stack unwind) */
490
491enum why_code {
492 WHY_NOT, /* No error */
493 WHY_EXCEPTION, /* Exception occurred */
494 WHY_RERAISE, /* Exception re-raised by 'finally' */
495 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000496 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000497 WHY_CONTINUE, /* 'continue' statement */
498 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000499};
500
Tim Petersdbd9ba62000-07-09 03:09:57 +0000501static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000502static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000503
Guido van Rossum374a9221991-04-04 10:40:29 +0000504
Guido van Rossumb209a111997-04-29 18:18:01 +0000505PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000506PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000507{
508 return eval_code2(co,
509 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000510 (PyObject **)NULL, 0,
511 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000512 (PyObject **)NULL, 0,
513 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000514}
515
516
517/* Interpreter main loop */
518
Tim Peters5ca576e2001-06-18 22:08:13 +0000519PyObject *
520eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000521{
Guido van Rossum950361c1997-01-24 13:49:28 +0000522#ifdef DXPAIRS
523 int lastopcode = 0;
524#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000525 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000526 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000527 register int opcode=0; /* Current opcode */
528 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000529 register enum why_code why; /* Reason for block stack unwind */
530 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000531 register PyObject *x; /* Result object -- NULL if error */
532 register PyObject *v; /* Temporary objects popped off stack */
533 register PyObject *w;
534 register PyObject *u;
535 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000536 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000537 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000538 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000539 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000540 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000541 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000542#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000543 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000544#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000545#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000546 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000547 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000548#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000549
550/* Code access macros */
551
552#define GETCONST(i) Getconst(f, i)
553#define GETNAME(i) Getname(f, i)
554#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000555#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000556#define NEXTOP() (*next_instr++)
557#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000558#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000559#define JUMPBY(x) (next_instr += (x))
560
561/* Stack manipulation macros */
562
563#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
564#define EMPTY() (STACK_LEVEL() == 0)
565#define TOP() (stack_pointer[-1])
566#define BASIC_PUSH(v) (*stack_pointer++ = (v))
567#define BASIC_POP() (*--stack_pointer)
568
Guido van Rossum96a42c81992-01-12 02:29:51 +0000569#ifdef LLTRACE
570#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
571#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000572#else
573#define PUSH(v) BASIC_PUSH(v)
574#define POP() BASIC_POP()
575#endif
576
Guido van Rossum681d79a1995-07-18 14:51:37 +0000577/* Local variable macros */
578
579#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000580#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000581 GETLOCAL(i) = value; } while (0)
582
Guido van Rossuma027efa1997-05-05 20:56:21 +0000583/* Start of code */
584
Tim Peters5ca576e2001-06-18 22:08:13 +0000585 if (f == NULL)
586 return NULL;
587
Guido van Rossum8861b741996-07-30 16:49:37 +0000588#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000589 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000590 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000591 return NULL;
592 }
593#endif
594
Tim Peters5ca576e2001-06-18 22:08:13 +0000595 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000596 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000597 --tstate->recursion_depth;
598 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000599 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000601 return NULL;
602 }
603
Tim Peters5ca576e2001-06-18 22:08:13 +0000604 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000605 co = f->f_code;
606 fastlocals = f->f_localsplus;
607 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000608 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000609 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000610 stack_pointer = f->f_stacktop;
611 assert(stack_pointer != NULL);
612 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000613
614#ifdef LLTRACE
615 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
616#endif
617#if defined(Py_DEBUG) || defined(LLTRACE)
618 filename = PyString_AsString(co->co_filename);
619#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000620
Guido van Rossum374a9221991-04-04 10:40:29 +0000621 why = WHY_NOT;
622 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000623 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000624 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000625
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000627 /* Do periodic things. Doing this every time through
628 the loop would add too much overhead, so we do it
629 only every Nth instruction. We also do it if
630 ``things_to_do'' is set, i.e. when an asynchronous
631 event needs attention (e.g. a signal handler or
632 async I/O handler); see Py_AddPendingCall() and
633 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000634
Guido van Rossuma027efa1997-05-05 20:56:21 +0000635 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000636 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000637 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000638 if (Py_MakePendingCalls() < 0) {
639 why = WHY_EXCEPTION;
640 goto on_error;
641 }
642 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000643#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000644 /* If we have true signals, the signal handler
645 will call Py_AddPendingCall() so we don't
646 have to call sigcheck(). On the Mac and
647 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000648 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 goto on_error;
651 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000652#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000653
Guido van Rossume59214e1994-08-30 08:01:59 +0000654#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000655 if (interpreter_lock) {
656 /* Give another thread a chance */
657
Guido van Rossum25ce5661997-08-02 03:10:38 +0000658 if (PyThreadState_Swap(NULL) != tstate)
659 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000660 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000661
662 /* Other threads may run now */
663
Guido van Rossum65d5b571998-12-21 19:32:43 +0000664 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000665 if (PyThreadState_Swap(tstate) != NULL)
666 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 }
668#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000672
Guido van Rossum408027e1996-12-30 16:17:54 +0000673#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000674 f->f_lasti = INSTR_OFFSET();
675#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000676
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 opcode = NEXTOP();
678 if (HAS_ARG(opcode))
679 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000680 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000681#ifdef DYNAMIC_EXECUTION_PROFILE
682#ifdef DXPAIRS
683 dxpairs[lastopcode][opcode]++;
684 lastopcode = opcode;
685#endif
686 dxp[opcode]++;
687#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000688
Guido van Rossum96a42c81992-01-12 02:29:51 +0000689#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000691
Guido van Rossum96a42c81992-01-12 02:29:51 +0000692 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000693 if (HAS_ARG(opcode)) {
694 printf("%d: %d, %d\n",
695 (int) (INSTR_OFFSET() - 3),
696 opcode, oparg);
697 }
698 else {
699 printf("%d: %d\n",
700 (int) (INSTR_OFFSET() - 1), opcode);
701 }
702 }
703#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000705
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000707
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 /* BEWARE!
709 It is essential that any operation that fails sets either
710 x to NULL, err to nonzero, or why to anything but WHY_NOT,
711 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000712
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000714
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 case POP_TOP:
716 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000717 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000718 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000719
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 case ROT_TWO:
721 v = POP();
722 w = POP();
723 PUSH(v);
724 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000725 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000726
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 case ROT_THREE:
728 v = POP();
729 w = POP();
730 x = POP();
731 PUSH(v);
732 PUSH(x);
733 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000734 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000735
Thomas Wouters434d0822000-08-24 20:11:32 +0000736 case ROT_FOUR:
737 u = POP();
738 v = POP();
739 w = POP();
740 x = POP();
741 PUSH(u);
742 PUSH(x);
743 PUSH(w);
744 PUSH(v);
745 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000746
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 case DUP_TOP:
748 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000749 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000751 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000752
Thomas Wouters434d0822000-08-24 20:11:32 +0000753 case DUP_TOPX:
754 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000755 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000756 x = TOP();
757 Py_INCREF(x);
758 PUSH(x);
759 continue;
760 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000761 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000762 Py_INCREF(x);
763 w = TOP();
764 Py_INCREF(w);
765 PUSH(x);
766 PUSH(w);
767 PUSH(x);
768 continue;
769 case 3:
770 x = POP();
771 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000772 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000773 Py_INCREF(w);
774 v = TOP();
775 Py_INCREF(v);
776 PUSH(w);
777 PUSH(x);
778 PUSH(v);
779 PUSH(w);
780 PUSH(x);
781 continue;
782 case 4:
783 x = POP();
784 Py_INCREF(x);
785 w = POP();
786 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000787 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000788 Py_INCREF(v);
789 u = TOP();
790 Py_INCREF(u);
791 PUSH(v);
792 PUSH(w);
793 PUSH(x);
794 PUSH(u);
795 PUSH(v);
796 PUSH(w);
797 PUSH(x);
798 continue;
799 case 5:
800 x = POP();
801 Py_INCREF(x);
802 w = POP();
803 Py_INCREF(w);
804 v = POP();
805 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000806 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000807 Py_INCREF(u);
808 t = TOP();
809 Py_INCREF(t);
810 PUSH(u);
811 PUSH(v);
812 PUSH(w);
813 PUSH(x);
814 PUSH(t);
815 PUSH(u);
816 PUSH(v);
817 PUSH(w);
818 PUSH(x);
819 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000820 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000821 Py_FatalError("invalid argument to DUP_TOPX"
822 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000823 }
Tim Peters35ba6892000-10-11 07:04:49 +0000824 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000825
Guido van Rossum374a9221991-04-04 10:40:29 +0000826 case UNARY_POSITIVE:
827 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000828 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000829 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000830 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000831 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000833
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 case UNARY_NEGATIVE:
835 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000836 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000839 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000841
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 case UNARY_NOT:
843 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000844 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000845 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 if (err == 0) {
847 Py_INCREF(Py_True);
848 PUSH(Py_True);
849 continue;
850 }
851 else if (err > 0) {
852 Py_INCREF(Py_False);
853 PUSH(Py_False);
854 err = 0;
855 continue;
856 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000858
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 case UNARY_CONVERT:
860 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000861 x = PyObject_Repr(v);
862 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000863 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000864 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000866
Guido van Rossum7928cd71991-10-24 14:59:31 +0000867 case UNARY_INVERT:
868 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000869 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000870 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000871 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000872 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000873 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000874
Guido van Rossum50564e81996-01-12 01:13:16 +0000875 case BINARY_POWER:
876 w = POP();
877 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000878 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000879 Py_DECREF(v);
880 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000881 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000882 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000883 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000884
Guido van Rossum374a9221991-04-04 10:40:29 +0000885 case BINARY_MULTIPLY:
886 w = POP();
887 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000888 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000889 Py_DECREF(v);
890 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000894
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 case BINARY_DIVIDE:
896 w = POP();
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
900 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000904
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 case BINARY_MODULO:
906 w = POP();
907 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000908 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000909 Py_DECREF(v);
910 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000912 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000914
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 case BINARY_ADD:
916 w = POP();
917 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000918 if (PyInt_Check(v) && PyInt_Check(w)) {
919 /* INLINE: int + int */
920 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000921 a = PyInt_AS_LONG(v);
922 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000923 i = a + b;
924 if ((i^a) < 0 && (i^b) < 0) {
925 PyErr_SetString(PyExc_OverflowError,
926 "integer addition");
927 x = NULL;
928 }
929 else
930 x = PyInt_FromLong(i);
931 }
932 else
933 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000934 Py_DECREF(v);
935 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000936 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000937 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000939
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 case BINARY_SUBTRACT:
941 w = POP();
942 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000943 if (PyInt_Check(v) && PyInt_Check(w)) {
944 /* INLINE: int - int */
945 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000946 a = PyInt_AS_LONG(v);
947 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000948 i = a - b;
949 if ((i^a) < 0 && (i^~b) < 0) {
950 PyErr_SetString(PyExc_OverflowError,
951 "integer subtraction");
952 x = NULL;
953 }
954 else
955 x = PyInt_FromLong(i);
956 }
957 else
958 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(v);
960 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000962 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000964
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 case BINARY_SUBSCR:
966 w = POP();
967 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000968 if (PyList_Check(v) && PyInt_Check(w)) {
969 /* INLINE: list[int] */
970 long i = PyInt_AsLong(w);
971 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000972 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000973 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000974 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 PyErr_SetString(PyExc_IndexError,
976 "list index out of range");
977 x = NULL;
978 }
979 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000980 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000981 Py_INCREF(x);
982 }
983 }
984 else
985 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 Py_DECREF(v);
987 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000989 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000991
Guido van Rossum7928cd71991-10-24 14:59:31 +0000992 case BINARY_LSHIFT:
993 w = POP();
994 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000995 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000996 Py_DECREF(v);
997 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000998 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000999 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001001
Guido van Rossum7928cd71991-10-24 14:59:31 +00001002 case BINARY_RSHIFT:
1003 w = POP();
1004 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001005 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001006 Py_DECREF(v);
1007 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001009 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001010 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001011
Guido van Rossum7928cd71991-10-24 14:59:31 +00001012 case BINARY_AND:
1013 w = POP();
1014 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001015 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001016 Py_DECREF(v);
1017 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001018 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001019 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001020 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001021
Guido van Rossum7928cd71991-10-24 14:59:31 +00001022 case BINARY_XOR:
1023 w = POP();
1024 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001025 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001026 Py_DECREF(v);
1027 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001028 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001029 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001030 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001031
Guido van Rossum7928cd71991-10-24 14:59:31 +00001032 case BINARY_OR:
1033 w = POP();
1034 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001035 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001036 Py_DECREF(v);
1037 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001038 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001039 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001040 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001041
1042 case INPLACE_POWER:
1043 w = POP();
1044 v = POP();
1045 x = PyNumber_InPlacePower(v, w, Py_None);
1046 Py_DECREF(v);
1047 Py_DECREF(w);
1048 PUSH(x);
1049 if (x != NULL) continue;
1050 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001051
Thomas Wouters434d0822000-08-24 20:11:32 +00001052 case INPLACE_MULTIPLY:
1053 w = POP();
1054 v = POP();
1055 x = PyNumber_InPlaceMultiply(v, w);
1056 Py_DECREF(v);
1057 Py_DECREF(w);
1058 PUSH(x);
1059 if (x != NULL) continue;
1060 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001061
Thomas Wouters434d0822000-08-24 20:11:32 +00001062 case INPLACE_DIVIDE:
1063 w = POP();
1064 v = POP();
1065 x = PyNumber_InPlaceDivide(v, w);
1066 Py_DECREF(v);
1067 Py_DECREF(w);
1068 PUSH(x);
1069 if (x != NULL) continue;
1070 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001071
Thomas Wouters434d0822000-08-24 20:11:32 +00001072 case INPLACE_MODULO:
1073 w = POP();
1074 v = POP();
1075 x = PyNumber_InPlaceRemainder(v, w);
1076 Py_DECREF(v);
1077 Py_DECREF(w);
1078 PUSH(x);
1079 if (x != NULL) continue;
1080 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001081
Thomas Wouters434d0822000-08-24 20:11:32 +00001082 case INPLACE_ADD:
1083 w = POP();
1084 v = POP();
1085 if (PyInt_Check(v) && PyInt_Check(w)) {
1086 /* INLINE: int + int */
1087 register long a, b, i;
1088 a = PyInt_AS_LONG(v);
1089 b = PyInt_AS_LONG(w);
1090 i = a + b;
1091 if ((i^a) < 0 && (i^b) < 0) {
1092 PyErr_SetString(PyExc_OverflowError,
1093 "integer addition");
1094 x = NULL;
1095 }
1096 else
1097 x = PyInt_FromLong(i);
1098 }
1099 else
1100 x = PyNumber_InPlaceAdd(v, w);
1101 Py_DECREF(v);
1102 Py_DECREF(w);
1103 PUSH(x);
1104 if (x != NULL) continue;
1105 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001106
Thomas Wouters434d0822000-08-24 20:11:32 +00001107 case INPLACE_SUBTRACT:
1108 w = POP();
1109 v = POP();
1110 if (PyInt_Check(v) && PyInt_Check(w)) {
1111 /* INLINE: int - int */
1112 register long a, b, i;
1113 a = PyInt_AS_LONG(v);
1114 b = PyInt_AS_LONG(w);
1115 i = a - b;
1116 if ((i^a) < 0 && (i^~b) < 0) {
1117 PyErr_SetString(PyExc_OverflowError,
1118 "integer subtraction");
1119 x = NULL;
1120 }
1121 else
1122 x = PyInt_FromLong(i);
1123 }
1124 else
1125 x = PyNumber_InPlaceSubtract(v, w);
1126 Py_DECREF(v);
1127 Py_DECREF(w);
1128 PUSH(x);
1129 if (x != NULL) continue;
1130 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001131
Thomas Wouters434d0822000-08-24 20:11:32 +00001132 case INPLACE_LSHIFT:
1133 w = POP();
1134 v = POP();
1135 x = PyNumber_InPlaceLshift(v, w);
1136 Py_DECREF(v);
1137 Py_DECREF(w);
1138 PUSH(x);
1139 if (x != NULL) continue;
1140 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001141
Thomas Wouters434d0822000-08-24 20:11:32 +00001142 case INPLACE_RSHIFT:
1143 w = POP();
1144 v = POP();
1145 x = PyNumber_InPlaceRshift(v, w);
1146 Py_DECREF(v);
1147 Py_DECREF(w);
1148 PUSH(x);
1149 if (x != NULL) continue;
1150 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001151
Thomas Wouters434d0822000-08-24 20:11:32 +00001152 case INPLACE_AND:
1153 w = POP();
1154 v = POP();
1155 x = PyNumber_InPlaceAnd(v, w);
1156 Py_DECREF(v);
1157 Py_DECREF(w);
1158 PUSH(x);
1159 if (x != NULL) continue;
1160 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001161
Thomas Wouters434d0822000-08-24 20:11:32 +00001162 case INPLACE_XOR:
1163 w = POP();
1164 v = POP();
1165 x = PyNumber_InPlaceXor(v, w);
1166 Py_DECREF(v);
1167 Py_DECREF(w);
1168 PUSH(x);
1169 if (x != NULL) continue;
1170 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001171
Thomas Wouters434d0822000-08-24 20:11:32 +00001172 case INPLACE_OR:
1173 w = POP();
1174 v = POP();
1175 x = PyNumber_InPlaceOr(v, w);
1176 Py_DECREF(v);
1177 Py_DECREF(w);
1178 PUSH(x);
1179 if (x != NULL) continue;
1180 break;
1181
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 case SLICE+0:
1183 case SLICE+1:
1184 case SLICE+2:
1185 case SLICE+3:
1186 if ((opcode-SLICE) & 2)
1187 w = POP();
1188 else
1189 w = NULL;
1190 if ((opcode-SLICE) & 1)
1191 v = POP();
1192 else
1193 v = NULL;
1194 u = POP();
1195 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 Py_DECREF(u);
1197 Py_XDECREF(v);
1198 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001200 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001202
Guido van Rossum374a9221991-04-04 10:40:29 +00001203 case STORE_SLICE+0:
1204 case STORE_SLICE+1:
1205 case STORE_SLICE+2:
1206 case STORE_SLICE+3:
1207 if ((opcode-STORE_SLICE) & 2)
1208 w = POP();
1209 else
1210 w = NULL;
1211 if ((opcode-STORE_SLICE) & 1)
1212 v = POP();
1213 else
1214 v = NULL;
1215 u = POP();
1216 t = POP();
1217 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001218 Py_DECREF(t);
1219 Py_DECREF(u);
1220 Py_XDECREF(v);
1221 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001222 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001224
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 case DELETE_SLICE+0:
1226 case DELETE_SLICE+1:
1227 case DELETE_SLICE+2:
1228 case DELETE_SLICE+3:
1229 if ((opcode-DELETE_SLICE) & 2)
1230 w = POP();
1231 else
1232 w = NULL;
1233 if ((opcode-DELETE_SLICE) & 1)
1234 v = POP();
1235 else
1236 v = NULL;
1237 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001238 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001240 Py_DECREF(u);
1241 Py_XDECREF(v);
1242 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001243 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001245
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 case STORE_SUBSCR:
1247 w = POP();
1248 v = POP();
1249 u = POP();
1250 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001251 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001252 Py_DECREF(u);
1253 Py_DECREF(v);
1254 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001255 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001257
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 case DELETE_SUBSCR:
1259 w = POP();
1260 v = POP();
1261 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001262 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_DECREF(v);
1264 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001265 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001267
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 case PRINT_EXPR:
1269 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001270 w = PySys_GetObject("displayhook");
1271 if (w == NULL) {
1272 PyErr_SetString(PyExc_RuntimeError,
1273 "lost sys.displayhook");
1274 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001275 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001276 }
1277 if (err == 0) {
1278 x = Py_BuildValue("(O)", v);
1279 if (x == NULL)
1280 err = -1;
1281 }
1282 if (err == 0) {
1283 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001284 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001285 if (w == NULL)
1286 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001289 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001291
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001292 case PRINT_ITEM_TO:
1293 w = stream = POP();
1294 /* fall through to PRINT_ITEM */
1295
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 case PRINT_ITEM:
1297 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001298 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001299 w = PySys_GetObject("stdout");
1300 if (w == NULL) {
1301 PyErr_SetString(PyExc_RuntimeError,
1302 "lost sys.stdout");
1303 err = -1;
1304 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001305 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001306 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001307 err = PyFile_WriteString(" ", w);
1308 if (err == 0)
1309 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001311 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 char *s = PyString_AsString(v);
1313 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001314 if (len > 0 &&
1315 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001316 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001317 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001320 Py_XDECREF(stream);
1321 stream = NULL;
1322 if (err == 0)
1323 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001325
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001326 case PRINT_NEWLINE_TO:
1327 w = stream = POP();
1328 /* fall through to PRINT_NEWLINE */
1329
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001331 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001332 w = PySys_GetObject("stdout");
1333 if (w == NULL)
1334 PyErr_SetString(PyExc_RuntimeError,
1335 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001336 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001337 if (w != NULL) {
1338 err = PyFile_WriteString("\n", w);
1339 if (err == 0)
1340 PyFile_SoftSpace(w, 0);
1341 }
1342 Py_XDECREF(stream);
1343 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001345
Thomas Wouters434d0822000-08-24 20:11:32 +00001346
1347#ifdef CASE_TOO_BIG
1348 default: switch (opcode) {
1349#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 case BREAK_LOOP:
1351 why = WHY_BREAK;
1352 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001353
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001354 case CONTINUE_LOOP:
1355 retval = PyInt_FromLong(oparg);
1356 why = WHY_CONTINUE;
1357 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001358
Guido van Rossumf10570b1995-07-07 22:53:21 +00001359 case RAISE_VARARGS:
1360 u = v = w = NULL;
1361 switch (oparg) {
1362 case 3:
1363 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001364 /* Fallthrough */
1365 case 2:
1366 v = POP(); /* value */
1367 /* Fallthrough */
1368 case 1:
1369 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001370 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001371 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001372 break;
1373 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001374 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001375 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001376 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001377 break;
1378 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001380
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001382 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001383 PyErr_SetString(PyExc_SystemError,
1384 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001385 break;
1386 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001387 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001388 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001390
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 case RETURN_VALUE:
1392 retval = POP();
1393 why = WHY_RETURN;
1394 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001395
Tim Peters5ca576e2001-06-18 22:08:13 +00001396 case YIELD_VALUE:
1397 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001398 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001399 f->f_lasti = INSTR_OFFSET();
1400 why = WHY_YIELD;
1401 break;
1402
1403
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001404 case EXEC_STMT:
1405 w = POP();
1406 v = POP();
1407 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001408 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 Py_DECREF(u);
1410 Py_DECREF(v);
1411 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001412 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001413
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 case POP_BLOCK:
1415 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 while (STACK_LEVEL() > b->b_level) {
1418 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 }
1421 }
1422 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001423
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 case END_FINALLY:
1425 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 if (PyInt_Check(v)) {
1427 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001428 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001429 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001430 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 retval = POP();
1432 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001435 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001438 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 else if (v != Py_None) {
1441 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 "'finally' pops bad exception");
1443 why = WHY_EXCEPTION;
1444 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001447
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001449 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001451 w = POP();
1452 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001454 Py_DECREF(u);
1455 Py_DECREF(v);
1456 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001458
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 case STORE_NAME:
1460 w = GETNAMEV(oparg);
1461 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001462 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001463 PyErr_Format(PyExc_SystemError,
1464 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001465 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001466 break;
1467 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 err = PyDict_SetItem(x, w, v);
1469 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001471
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001473 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001474 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001475 PyErr_Format(PyExc_SystemError,
1476 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001477 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001478 break;
1479 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001481 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001482 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001484
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001485 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001487 if (PyTuple_Check(v)) {
1488 if (PyTuple_Size(v) != oparg) {
1489 PyErr_SetString(PyExc_ValueError,
1490 "unpack tuple of wrong size");
1491 why = WHY_EXCEPTION;
1492 }
1493 else {
1494 for (; --oparg >= 0; ) {
1495 w = PyTuple_GET_ITEM(v, oparg);
1496 Py_INCREF(w);
1497 PUSH(w);
1498 }
1499 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001501 else if (PyList_Check(v)) {
1502 if (PyList_Size(v) != oparg) {
1503 PyErr_SetString(PyExc_ValueError,
1504 "unpack list of wrong size");
1505 why = WHY_EXCEPTION;
1506 }
1507 else {
1508 for (; --oparg >= 0; ) {
1509 w = PyList_GET_ITEM(v, oparg);
1510 Py_INCREF(w);
1511 PUSH(w);
1512 }
1513 }
1514 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001515 else if (unpack_iterable(v, oparg,
1516 stack_pointer + oparg))
1517 stack_pointer += oparg;
1518 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001519 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001522
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001524 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 v = POP();
1526 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1528 Py_DECREF(v);
1529 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001531
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001533 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001535 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1536 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001539
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001540 case STORE_GLOBAL:
1541 w = GETNAMEV(oparg);
1542 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 err = PyDict_SetItem(f->f_globals, w, v);
1544 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001545 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001546
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001547 case DELETE_GLOBAL:
1548 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001550 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001551 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001552 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001553
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 case LOAD_CONST:
1555 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 PUSH(x);
1558 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001559
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001561 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001562 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001563 PyErr_Format(PyExc_SystemError,
1564 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001565 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001566 break;
1567 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001570 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001574 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001575 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001576 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
1578 }
1579 }
1580 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 PUSH(x);
1583 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001584
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001586 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001591 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001592 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001593 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 break;
1595 }
1596 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001597 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 PUSH(x);
1599 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600
Guido van Rossum9bfef441993-03-29 10:43:31 +00001601 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001602 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001603 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001604 format_exc_check_arg(
1605 PyExc_UnboundLocalError,
1606 UNBOUNDLOCAL_ERROR_MSG,
1607 PyTuple_GetItem(co->co_varnames, oparg)
1608 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001609 break;
1610 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001612 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001613 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001614 break;
1615
1616 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001617 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001619 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001620
1621 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001622 x = GETLOCAL(oparg);
1623 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001624 format_exc_check_arg(
1625 PyExc_UnboundLocalError,
1626 UNBOUNDLOCAL_ERROR_MSG,
1627 PyTuple_GetItem(co->co_varnames, oparg)
1628 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001629 break;
1630 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001631 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001632 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001633
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001634 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001635 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001636 Py_INCREF(x);
1637 PUSH(x);
1638 break;
1639
1640 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001641 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001642 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001643 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001644 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001645 v = PyTuple_GetItem(co->co_cellvars,
1646 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001647 format_exc_check_arg(
1648 PyExc_UnboundLocalError,
1649 UNBOUNDLOCAL_ERROR_MSG,
1650 v);
1651 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001652 v = PyTuple_GetItem(
1653 co->co_freevars,
1654 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001655 format_exc_check_arg(
1656 PyExc_NameError,
1657 UNBOUNDFREE_ERROR_MSG,
1658 v);
1659 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001660 err = -1;
1661 break;
1662 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001663 PUSH(w);
1664 break;
1665
1666 case STORE_DEREF:
1667 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001668 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001669 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001670 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001671 continue;
1672
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 if (x != NULL) {
1676 for (; --oparg >= 0;) {
1677 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 }
1680 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001681 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 }
1683 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001684
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001686 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 if (x != NULL) {
1688 for (; --oparg >= 0;) {
1689 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001690 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 }
1692 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001693 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 }
1695 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001696
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001700 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001702
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001704 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 x = PyObject_GetAttr(v, w);
1707 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001709 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001711
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 case COMPARE_OP:
1713 w = POP();
1714 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001715 if (PyInt_Check(v) && PyInt_Check(w)) {
1716 /* INLINE: cmp(int, int) */
1717 register long a, b;
1718 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001719 a = PyInt_AS_LONG(v);
1720 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001721 switch (oparg) {
1722 case LT: res = a < b; break;
1723 case LE: res = a <= b; break;
1724 case EQ: res = a == b; break;
1725 case NE: res = a != b; break;
1726 case GT: res = a > b; break;
1727 case GE: res = a >= b; break;
1728 case IS: res = v == w; break;
1729 case IS_NOT: res = v != w; break;
1730 default: goto slow_compare;
1731 }
1732 x = res ? Py_True : Py_False;
1733 Py_INCREF(x);
1734 }
1735 else {
1736 slow_compare:
1737 x = cmp_outcome(oparg, v, w);
1738 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 Py_DECREF(v);
1740 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001742 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001744
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001746 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001748 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001750 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001751 break;
1752 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001753 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001754 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001755 w,
1756 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001757 f->f_locals == NULL ?
1758 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001759 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001761 if (w == NULL) {
1762 x = NULL;
1763 break;
1764 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 x = PyEval_CallObject(x, w);
1766 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001767 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001768 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001770
Thomas Wouters52152252000-08-17 22:55:00 +00001771 case IMPORT_STAR:
1772 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001773 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001774 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001775 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001776 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001777 break;
1778 }
Thomas Wouters52152252000-08-17 22:55:00 +00001779 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001780 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001781 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001782 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001784
Thomas Wouters52152252000-08-17 22:55:00 +00001785 case IMPORT_FROM:
1786 w = GETNAMEV(oparg);
1787 v = TOP();
1788 x = import_from(v, w);
1789 PUSH(x);
1790 if (x != NULL) continue;
1791 break;
1792
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 case JUMP_FORWARD:
1794 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001795 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001796
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001798 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001799 if (err > 0)
1800 err = 0;
1801 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001803 else
1804 break;
1805 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001806
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001809 if (err > 0) {
1810 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001812 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001813 else if (err == 0)
1814 ;
1815 else
1816 break;
1817 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001818
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 case JUMP_ABSOLUTE:
1820 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001821 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001822
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001823 case GET_ITER:
1824 /* before: [obj]; after [getiter(obj)] */
1825 v = POP();
1826 x = PyObject_GetIter(v);
1827 Py_DECREF(v);
1828 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001829 PUSH(x);
1830 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001831 }
1832 break;
1833
1834 case FOR_ITER:
1835 /* before: [iter]; after: [iter, iter()] *or* [] */
1836 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001837 x = PyIter_Next(v);
1838 if (x != NULL) {
1839 PUSH(x);
1840 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001841 }
Tim Petersf4848da2001-05-05 00:14:56 +00001842 if (!PyErr_Occurred()) {
1843 /* iterator ended normally */
1844 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001845 Py_DECREF(v);
1846 JUMPBY(oparg);
1847 continue;
1848 }
1849 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001850
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 case FOR_LOOP:
1852 /* for v in s: ...
1853 On entry: stack contains s, i.
1854 On exit: stack contains s, i+1, s[i];
1855 but if loop exhausted:
1856 s, i are popped, and we jump */
1857 w = POP(); /* Loop index */
1858 v = POP(); /* Sequence object */
1859 u = loop_subscript(v, w);
1860 if (u != NULL) {
1861 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001862 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001866 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 }
1868 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001869 Py_DECREF(v);
1870 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 /* A NULL can mean "s exhausted"
1872 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001873 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001874 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001875 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001876 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001877 continue;
1878 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 }
1880 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001881
Guido van Rossum374a9221991-04-04 10:40:29 +00001882 case SETUP_LOOP:
1883 case SETUP_EXCEPT:
1884 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001885 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001886 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001887 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001888
Guido van Rossum374a9221991-04-04 10:40:29 +00001889 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001890#ifdef LLTRACE
1891 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001892 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001893#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001894 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001895 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001896 continue;
1897 /* Trace each line of code reached */
1898 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001899 /* Inline call_trace() for performance: */
1900 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001901 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001902 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1903 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001904 tstate->use_tracing = (tstate->c_tracefunc
1905 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001906 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001908
1909 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001910 {
1911 int na = oparg & 0xff;
1912 int nk = (oparg>>8) & 0xff;
1913 int n = na + 2 * nk;
1914 PyObject **pfunc = stack_pointer - n - 1;
1915 PyObject *func = *pfunc;
1916 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1917
1918 /* Always dispatch PyCFunction first, because
1919 these are presumed to be the most frequent
1920 callable object.
1921 */
1922 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001923 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001924 if (flags > 1 || nk != 0)
1925 x = do_call(func, &stack_pointer,
1926 na, nk);
1927 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001928 PyObject *callargs;
1929 callargs = load_args(&stack_pointer, na);
1930 x = call_cfunction(func, callargs, NULL);
1931 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001932 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001933 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001934 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001935 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001936 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001937 && PyMethod_GET_SELF(func) != NULL) {
1938 /* optimize access to bound methods */
1939 PyObject *self = PyMethod_GET_SELF(func);
1940 Py_INCREF(self);
1941 func = PyMethod_GET_FUNCTION(func);
1942 Py_INCREF(func);
1943 Py_DECREF(*pfunc);
1944 *pfunc = self;
1945 na++;
1946 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001947 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001948 Py_INCREF(func);
1949 if (PyFunction_Check(func)) {
1950 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001951 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001952 } else {
1953 x = do_call(func, &stack_pointer,
1954 na, nk);
1955 }
1956 Py_DECREF(func);
1957 }
1958
1959 while (stack_pointer > pfunc) {
1960 w = POP();
1961 Py_DECREF(w);
1962 }
1963 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001964 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001965 continue;
1966 break;
1967 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001968
Jeremy Hylton76901512000-03-28 23:49:17 +00001969 case CALL_FUNCTION_VAR:
1970 case CALL_FUNCTION_KW:
1971 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001972 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001973 int na = oparg & 0xff;
1974 int nk = (oparg>>8) & 0xff;
1975 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001976 int n = na + 2 * nk;
1977 PyObject **pfunc, *func;
1978 if (flags & CALL_FLAG_VAR)
1979 n++;
1980 if (flags & CALL_FLAG_KW)
1981 n++;
1982 pfunc = stack_pointer - n - 1;
1983 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001984 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001985
Guido van Rossumac7be682001-01-17 15:42:30 +00001986 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001987 && PyMethod_GET_SELF(func) != NULL) {
1988 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001989 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001990 func = PyMethod_GET_FUNCTION(func);
1991 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001992 Py_DECREF(*pfunc);
1993 *pfunc = self;
1994 na++;
1995 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001996 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001997 Py_INCREF(func);
1998 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001999 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002000
Jeremy Hylton76901512000-03-28 23:49:17 +00002001 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002002 w = POP();
2003 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002004 }
2005 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002006 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002007 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002008 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002009 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002010
Guido van Rossum681d79a1995-07-18 14:51:37 +00002011 case MAKE_FUNCTION:
2012 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002013 x = PyFunction_New(v, f->f_globals);
2014 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002015 /* XXX Maybe this should be a separate opcode? */
2016 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002018 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002020 x = NULL;
2021 break;
2022 }
2023 while (--oparg >= 0) {
2024 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002026 }
2027 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002028 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002029 }
2030 PUSH(x);
2031 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002032
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002033 case MAKE_CLOSURE:
2034 {
2035 int nfree;
2036 v = POP(); /* code object */
2037 x = PyFunction_New(v, f->f_globals);
2038 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2039 Py_DECREF(v);
2040 /* XXX Maybe this should be a separate opcode? */
2041 if (x != NULL && nfree > 0) {
2042 v = PyTuple_New(nfree);
2043 if (v == NULL) {
2044 Py_DECREF(x);
2045 x = NULL;
2046 break;
2047 }
2048 while (--nfree >= 0) {
2049 w = POP();
2050 PyTuple_SET_ITEM(v, nfree, w);
2051 }
2052 err = PyFunction_SetClosure(x, v);
2053 Py_DECREF(v);
2054 }
2055 if (x != NULL && oparg > 0) {
2056 v = PyTuple_New(oparg);
2057 if (v == NULL) {
2058 Py_DECREF(x);
2059 x = NULL;
2060 break;
2061 }
2062 while (--oparg >= 0) {
2063 w = POP();
2064 PyTuple_SET_ITEM(v, oparg, w);
2065 }
2066 err = PyFunction_SetDefaults(x, v);
2067 Py_DECREF(v);
2068 }
2069 PUSH(x);
2070 break;
2071 }
2072
Guido van Rossum8861b741996-07-30 16:49:37 +00002073 case BUILD_SLICE:
2074 if (oparg == 3)
2075 w = POP();
2076 else
2077 w = NULL;
2078 v = POP();
2079 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002080 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 Py_DECREF(u);
2082 Py_DECREF(v);
2083 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002084 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002085 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002086 break;
2087
Fred Drakeef8ace32000-08-24 00:32:09 +00002088 case EXTENDED_ARG:
2089 opcode = NEXTOP();
2090 oparg = oparg<<16 | NEXTARG();
2091 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002092
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 default:
2094 fprintf(stderr,
2095 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002096 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002098 why = WHY_EXCEPTION;
2099 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002100
2101#ifdef CASE_TOO_BIG
2102 }
2103#endif
2104
Guido van Rossum374a9221991-04-04 10:40:29 +00002105 } /* switch */
2106
2107 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002108
Guido van Rossum374a9221991-04-04 10:40:29 +00002109 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002110
Guido van Rossum374a9221991-04-04 10:40:29 +00002111 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002112 if (err == 0 && x != NULL) {
2113#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002114 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002116 fprintf(stderr,
2117 "XXX undetected error\n");
2118 else
2119#endif
2120 continue; /* Normal, fast path */
2121 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002124 err = 0;
2125 }
2126
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002128
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002131 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002132 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 why = WHY_EXCEPTION;
2134 }
2135 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002136#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002137 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002138 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002140 fprintf(stderr,
2141 "XXX undetected error (why=%d)\n",
2142 why);
2143 why = WHY_EXCEPTION;
2144 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002145 }
2146#endif
2147
2148 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002149
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002151 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002152 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002153 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002155
Fred Drake9e3ad782001-07-03 23:39:52 +00002156 if (tstate->use_tracing) {
2157 if (tstate->c_tracefunc)
2158 call_exc_trace(tstate->c_tracefunc,
2159 tstate->c_traceobj, f);
2160 if (tstate->c_profilefunc)
2161 call_exc_trace(tstate->c_profilefunc,
2162 tstate->c_profileobj,f);
2163 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002164 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002165
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002167
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 if (why == WHY_RERAISE)
2169 why = WHY_EXCEPTION;
2170
2171 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002172
Tim Peters5ca576e2001-06-18 22:08:13 +00002173 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002175
2176 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2177 /* For a continue inside a try block,
2178 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002179 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002180 b->b_handler);
2181 why = WHY_NOT;
2182 JUMPTO(PyInt_AS_LONG(retval));
2183 Py_DECREF(retval);
2184 break;
2185 }
2186
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 while (STACK_LEVEL() > b->b_level) {
2188 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 }
2191 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2192 why = WHY_NOT;
2193 JUMPTO(b->b_handler);
2194 break;
2195 }
2196 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002197 (b->b_type == SETUP_EXCEPT &&
2198 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 PyObject *exc, *val, *tb;
2201 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 val = Py_None;
2204 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002205 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 /* Make the raw exception data
2207 available to the handler,
2208 so a program can emulate the
2209 Python main loop. Don't do
2210 this for 'finally'. */
2211 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002212 PyErr_NormalizeException(
2213 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002214 set_exc_info(tstate,
2215 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002217 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002218 PUSH(val);
2219 PUSH(exc);
2220 }
2221 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002222 if (why == WHY_RETURN ||
2223 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002224 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002226 PUSH(v);
2227 }
2228 why = WHY_NOT;
2229 JUMPTO(b->b_handler);
2230 break;
2231 }
2232 } /* unwind stack */
2233
2234 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002235
Guido van Rossum374a9221991-04-04 10:40:29 +00002236 if (why != WHY_NOT)
2237 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002238
Guido van Rossum374a9221991-04-04 10:40:29 +00002239 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002240
Tim Peters5ca576e2001-06-18 22:08:13 +00002241 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002242 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002243
Fred Drake9e3ad782001-07-03 23:39:52 +00002244 if (tstate->use_tracing) {
2245 if (tstate->c_tracefunc
2246 && (why == WHY_RETURN || why == WHY_YIELD)) {
2247 if (call_trace(tstate->c_tracefunc,
2248 tstate->c_traceobj, f,
2249 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002250 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002251 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002252 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002253 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002254 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002255 if (tstate->c_profilefunc
2256 && (why == WHY_RETURN || why == WHY_YIELD)) {
2257 if (call_trace(tstate->c_profilefunc,
2258 tstate->c_profileobj, f,
2259 PyTrace_RETURN, retval)) {
2260 Py_XDECREF(retval);
2261 retval = NULL;
2262 why = WHY_EXCEPTION;
2263 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002264 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002265 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002266
Guido van Rossuma027efa1997-05-05 20:56:21 +00002267 reset_exc_info(tstate);
2268
Tim Peters5ca576e2001-06-18 22:08:13 +00002269 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002270 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002271 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002272
Guido van Rossum96a42c81992-01-12 02:29:51 +00002273 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002274}
2275
Tim Peters5ca576e2001-06-18 22:08:13 +00002276static PyObject *
2277eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2278 PyObject **args, int argcount, PyObject **kws, int kwcount,
2279 PyObject **defs, int defcount, PyObject *closure)
2280{
2281 register PyFrameObject *f;
2282 register PyObject *retval = NULL;
2283 register PyObject **fastlocals, **freevars;
2284 PyThreadState *tstate = PyThreadState_GET();
2285 PyObject *x, *u;
2286
2287 if (globals == NULL) {
2288 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2289 return NULL;
2290 }
2291
2292 f = PyFrame_New(tstate, /*back*/
2293 co, /*code*/
2294 globals, locals);
2295 if (f == NULL)
2296 return NULL;
2297
2298 fastlocals = f->f_localsplus;
2299 freevars = f->f_localsplus + f->f_nlocals;
2300
2301 if (co->co_argcount > 0 ||
2302 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2303 int i;
2304 int n = argcount;
2305 PyObject *kwdict = NULL;
2306 if (co->co_flags & CO_VARKEYWORDS) {
2307 kwdict = PyDict_New();
2308 if (kwdict == NULL)
2309 goto fail;
2310 i = co->co_argcount;
2311 if (co->co_flags & CO_VARARGS)
2312 i++;
2313 SETLOCAL(i, kwdict);
2314 }
2315 if (argcount > co->co_argcount) {
2316 if (!(co->co_flags & CO_VARARGS)) {
2317 PyErr_Format(PyExc_TypeError,
2318 "%.200s() takes %s %d "
2319 "%sargument%s (%d given)",
2320 PyString_AsString(co->co_name),
2321 defcount ? "at most" : "exactly",
2322 co->co_argcount,
2323 kwcount ? "non-keyword " : "",
2324 co->co_argcount == 1 ? "" : "s",
2325 argcount);
2326 goto fail;
2327 }
2328 n = co->co_argcount;
2329 }
2330 for (i = 0; i < n; i++) {
2331 x = args[i];
2332 Py_INCREF(x);
2333 SETLOCAL(i, x);
2334 }
2335 if (co->co_flags & CO_VARARGS) {
2336 u = PyTuple_New(argcount - n);
2337 if (u == NULL)
2338 goto fail;
2339 SETLOCAL(co->co_argcount, u);
2340 for (i = n; i < argcount; i++) {
2341 x = args[i];
2342 Py_INCREF(x);
2343 PyTuple_SET_ITEM(u, i-n, x);
2344 }
2345 }
2346 for (i = 0; i < kwcount; i++) {
2347 PyObject *keyword = kws[2*i];
2348 PyObject *value = kws[2*i + 1];
2349 int j;
2350 if (keyword == NULL || !PyString_Check(keyword)) {
2351 PyErr_Format(PyExc_TypeError,
2352 "%.200s() keywords must be strings",
2353 PyString_AsString(co->co_name));
2354 goto fail;
2355 }
2356 /* XXX slow -- speed up using dictionary? */
2357 for (j = 0; j < co->co_argcount; j++) {
2358 PyObject *nm = PyTuple_GET_ITEM(
2359 co->co_varnames, j);
2360 int cmp = PyObject_RichCompareBool(
2361 keyword, nm, Py_EQ);
2362 if (cmp > 0)
2363 break;
2364 else if (cmp < 0)
2365 goto fail;
2366 }
2367 /* Check errors from Compare */
2368 if (PyErr_Occurred())
2369 goto fail;
2370 if (j >= co->co_argcount) {
2371 if (kwdict == NULL) {
2372 PyErr_Format(PyExc_TypeError,
2373 "%.200s() got an unexpected "
2374 "keyword argument '%.400s'",
2375 PyString_AsString(co->co_name),
2376 PyString_AsString(keyword));
2377 goto fail;
2378 }
2379 PyDict_SetItem(kwdict, keyword, value);
2380 }
2381 else {
2382 if (GETLOCAL(j) != NULL) {
2383 PyErr_Format(PyExc_TypeError,
2384 "%.200s() got multiple "
2385 "values for keyword "
2386 "argument '%.400s'",
2387 PyString_AsString(co->co_name),
2388 PyString_AsString(keyword));
2389 goto fail;
2390 }
2391 Py_INCREF(value);
2392 SETLOCAL(j, value);
2393 }
2394 }
2395 if (argcount < co->co_argcount) {
2396 int m = co->co_argcount - defcount;
2397 for (i = argcount; i < m; i++) {
2398 if (GETLOCAL(i) == NULL) {
2399 PyErr_Format(PyExc_TypeError,
2400 "%.200s() takes %s %d "
2401 "%sargument%s (%d given)",
2402 PyString_AsString(co->co_name),
2403 ((co->co_flags & CO_VARARGS) ||
2404 defcount) ? "at least"
2405 : "exactly",
2406 m, kwcount ? "non-keyword " : "",
2407 m == 1 ? "" : "s", i);
2408 goto fail;
2409 }
2410 }
2411 if (n > m)
2412 i = n - m;
2413 else
2414 i = 0;
2415 for (; i < defcount; i++) {
2416 if (GETLOCAL(m+i) == NULL) {
2417 PyObject *def = defs[i];
2418 Py_INCREF(def);
2419 SETLOCAL(m+i, def);
2420 }
2421 }
2422 }
2423 }
2424 else {
2425 if (argcount > 0 || kwcount > 0) {
2426 PyErr_Format(PyExc_TypeError,
2427 "%.200s() takes no arguments (%d given)",
2428 PyString_AsString(co->co_name),
2429 argcount + kwcount);
2430 goto fail;
2431 }
2432 }
2433 /* Allocate and initialize storage for cell vars, and copy free
2434 vars into frame. This isn't too efficient right now. */
2435 if (f->f_ncells) {
2436 int i = 0, j = 0, nargs, found;
2437 char *cellname, *argname;
2438 PyObject *c;
2439
2440 nargs = co->co_argcount;
2441 if (co->co_flags & CO_VARARGS)
2442 nargs++;
2443 if (co->co_flags & CO_VARKEYWORDS)
2444 nargs++;
2445
2446 /* Check for cells that shadow args */
2447 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2448 cellname = PyString_AS_STRING(
2449 PyTuple_GET_ITEM(co->co_cellvars, i));
2450 found = 0;
2451 while (j < nargs) {
2452 argname = PyString_AS_STRING(
2453 PyTuple_GET_ITEM(co->co_varnames, j));
2454 if (strcmp(cellname, argname) == 0) {
2455 c = PyCell_New(GETLOCAL(j));
2456 if (c == NULL)
2457 goto fail;
2458 GETLOCAL(f->f_nlocals + i) = c;
2459 found = 1;
2460 break;
2461 }
2462 j++;
2463 }
2464 if (found == 0) {
2465 c = PyCell_New(NULL);
2466 if (c == NULL)
2467 goto fail;
2468 SETLOCAL(f->f_nlocals + i, c);
2469 }
2470 }
2471 /* Initialize any that are left */
2472 while (i < f->f_ncells) {
2473 c = PyCell_New(NULL);
2474 if (c == NULL)
2475 goto fail;
2476 SETLOCAL(f->f_nlocals + i, c);
2477 i++;
2478 }
2479 }
2480 if (f->f_nfreevars) {
2481 int i;
2482 for (i = 0; i < f->f_nfreevars; ++i) {
2483 PyObject *o = PyTuple_GET_ITEM(closure, i);
2484 Py_INCREF(o);
2485 freevars[f->f_ncells + i] = o;
2486 }
2487 }
2488
Fred Drake9e3ad782001-07-03 23:39:52 +00002489 if (tstate->use_tracing) {
2490 if (tstate->c_tracefunc != NULL) {
2491 /* tstate->c_tracefunc, if defined, is a
2492 function that will be called on *every* entry
2493 to a code block. Its return value, if not
2494 None, is a function that will be called at
2495 the start of each executed line of code.
2496 (Actually, the function must return itself
2497 in order to continue tracing.) The trace
2498 functions are called with three arguments:
2499 a pointer to the current frame, a string
2500 indicating why the function is called, and
2501 an argument which depends on the situation.
2502 The global trace function is also called
2503 whenever an exception is detected. */
2504 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2505 f, PyTrace_CALL, Py_None)) {
2506 /* XXX Need way to compute arguments?? */
2507 /* Trace function raised an error */
2508 goto fail;
2509 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002510 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002511 if (tstate->c_profilefunc != NULL) {
2512 /* Similar for c_profilefunc, except it needn't
2513 return itself and isn't called for "line" events */
2514 if (call_trace(tstate->c_profilefunc,
2515 tstate->c_profileobj,
2516 f, PyTrace_CALL, Py_None)) {
2517 /* XXX Need way to compute arguments?? */
2518 /* Profile function raised an error */
2519 goto fail;
2520 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002521 }
2522 }
2523
2524 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002525 /* Don't need to keep the reference to f_back, it will be set
2526 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002527 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002528 f->f_back = NULL;
2529
2530 /* Create a new generator that owns the ready to run frame
2531 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002532 return gen_new(f);
2533 }
2534
2535 retval = eval_frame(f);
2536
2537 fail: /* Jump here from prelude on failure */
2538
2539 Py_DECREF(f);
2540 return retval;
2541}
2542
2543
Guido van Rossuma027efa1997-05-05 20:56:21 +00002544static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002545set_exc_info(PyThreadState *tstate,
2546 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002547{
2548 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002549 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002550
Guido van Rossuma027efa1997-05-05 20:56:21 +00002551 frame = tstate->frame;
2552 if (frame->f_exc_type == NULL) {
2553 /* This frame didn't catch an exception before */
2554 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002555 if (tstate->exc_type == NULL) {
2556 Py_INCREF(Py_None);
2557 tstate->exc_type = Py_None;
2558 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002559 tmp_type = frame->f_exc_type;
2560 tmp_value = frame->f_exc_value;
2561 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562 Py_XINCREF(tstate->exc_type);
2563 Py_XINCREF(tstate->exc_value);
2564 Py_XINCREF(tstate->exc_traceback);
2565 frame->f_exc_type = tstate->exc_type;
2566 frame->f_exc_value = tstate->exc_value;
2567 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002568 Py_XDECREF(tmp_type);
2569 Py_XDECREF(tmp_value);
2570 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002571 }
2572 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002573 tmp_type = tstate->exc_type;
2574 tmp_value = tstate->exc_value;
2575 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002576 Py_XINCREF(type);
2577 Py_XINCREF(value);
2578 Py_XINCREF(tb);
2579 tstate->exc_type = type;
2580 tstate->exc_value = value;
2581 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002582 Py_XDECREF(tmp_type);
2583 Py_XDECREF(tmp_value);
2584 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002585 /* For b/w compatibility */
2586 PySys_SetObject("exc_type", type);
2587 PySys_SetObject("exc_value", value);
2588 PySys_SetObject("exc_traceback", tb);
2589}
2590
2591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002593{
2594 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002595 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002596 frame = tstate->frame;
2597 if (frame->f_exc_type != NULL) {
2598 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002599 tmp_type = tstate->exc_type;
2600 tmp_value = tstate->exc_value;
2601 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002602 Py_XINCREF(frame->f_exc_type);
2603 Py_XINCREF(frame->f_exc_value);
2604 Py_XINCREF(frame->f_exc_traceback);
2605 tstate->exc_type = frame->f_exc_type;
2606 tstate->exc_value = frame->f_exc_value;
2607 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002608 Py_XDECREF(tmp_type);
2609 Py_XDECREF(tmp_value);
2610 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 /* For b/w compatibility */
2612 PySys_SetObject("exc_type", frame->f_exc_type);
2613 PySys_SetObject("exc_value", frame->f_exc_value);
2614 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2615 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002616 tmp_type = frame->f_exc_type;
2617 tmp_value = frame->f_exc_value;
2618 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002619 frame->f_exc_type = NULL;
2620 frame->f_exc_value = NULL;
2621 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002622 Py_XDECREF(tmp_type);
2623 Py_XDECREF(tmp_value);
2624 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002625}
2626
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002627/* Logic for the raise statement (too complicated for inlining).
2628 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002629static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002630do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002631{
Guido van Rossumd295f121998-04-09 21:39:57 +00002632 if (type == NULL) {
2633 /* Reraise */
2634 PyThreadState *tstate = PyThreadState_Get();
2635 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2636 value = tstate->exc_value;
2637 tb = tstate->exc_traceback;
2638 Py_XINCREF(type);
2639 Py_XINCREF(value);
2640 Py_XINCREF(tb);
2641 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002642
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002643 /* We support the following forms of raise:
2644 raise <class>, <classinstance>
2645 raise <class>, <argument tuple>
2646 raise <class>, None
2647 raise <class>, <argument>
2648 raise <classinstance>, None
2649 raise <string>, <object>
2650 raise <string>, None
2651
2652 An omitted second argument is the same as None.
2653
2654 In addition, raise <tuple>, <anything> is the same as
2655 raising the tuple's first item (and it better have one!);
2656 this rule is applied recursively.
2657
2658 Finally, an optional third argument can be supplied, which
2659 gives the traceback to be substituted (useful when
2660 re-raising an exception after examining it). */
2661
2662 /* First, check the traceback argument, replacing None with
2663 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 if (tb == Py_None) {
2665 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002666 tb = NULL;
2667 }
2668 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002669 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002670 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002671 goto raise_error;
2672 }
2673
2674 /* Next, replace a missing value with None */
2675 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 value = Py_None;
2677 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002678 }
2679
2680 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2682 PyObject *tmp = type;
2683 type = PyTuple_GET_ITEM(type, 0);
2684 Py_INCREF(type);
2685 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 }
2687
Barry Warsaw4249f541997-08-22 21:26:19 +00002688 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002689 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002690
2691 else if (PyClass_Check(type))
2692 PyErr_NormalizeException(&type, &value, &tb);
2693
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002695 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 if (value != Py_None) {
2697 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002698 "instance exception may not have a separate value");
2699 goto raise_error;
2700 }
2701 else {
2702 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002704 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2706 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002707 }
2708 }
2709 else {
2710 /* Not something you can raise. You get an exception
2711 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002712 PyErr_Format(PyExc_TypeError,
2713 "exceptions must be strings, classes, or "
2714 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002715 goto raise_error;
2716 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002718 if (tb == NULL)
2719 return WHY_EXCEPTION;
2720 else
2721 return WHY_RERAISE;
2722 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 Py_XDECREF(value);
2724 Py_XDECREF(type);
2725 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002726 return WHY_EXCEPTION;
2727}
2728
Tim Petersd6d010b2001-06-21 02:49:55 +00002729/* Iterate v argcnt times and store the results on the stack (via decreasing
2730 sp). Return 1 for success, 0 if error. */
2731
Barry Warsawe42b18f1997-08-25 22:13:04 +00002732static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002733unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002734{
Tim Petersd6d010b2001-06-21 02:49:55 +00002735 int i = 0;
2736 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002737 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002738
Tim Petersd6d010b2001-06-21 02:49:55 +00002739 assert(v != NULL);
2740
2741 it = PyObject_GetIter(v);
2742 if (it == NULL)
2743 goto Error;
2744
2745 for (; i < argcnt; i++) {
2746 w = PyIter_Next(it);
2747 if (w == NULL) {
2748 /* Iterator done, via error or exhaustion. */
2749 if (!PyErr_Occurred()) {
2750 PyErr_Format(PyExc_ValueError,
2751 "need more than %d value%s to unpack",
2752 i, i == 1 ? "" : "s");
2753 }
2754 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002755 }
2756 *--sp = w;
2757 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002758
2759 /* We better have exhausted the iterator now. */
2760 w = PyIter_Next(it);
2761 if (w == NULL) {
2762 if (PyErr_Occurred())
2763 goto Error;
2764 Py_DECREF(it);
2765 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002766 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002767 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002768 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002769Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002770 for (; i > 0; i--, sp++)
2771 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002772 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002773 return 0;
2774}
2775
2776
Guido van Rossum96a42c81992-01-12 02:29:51 +00002777#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002778static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002779prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002781 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 if (PyObject_Print(v, stdout, 0) != 0)
2783 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002784 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002785 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002787#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002789static void
Fred Drake5755ce62001-06-27 19:19:46 +00002790call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002791{
Guido van Rossumb209a111997-04-29 18:18:01 +00002792 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002793 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002795 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002796 value = Py_None;
2797 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002798 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002800 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002802 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002803 }
Fred Drake5755ce62001-06-27 19:19:46 +00002804 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002805 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002806 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002808 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 Py_XDECREF(type);
2810 Py_XDECREF(value);
2811 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002812 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002813}
2814
2815static int
Fred Drake5755ce62001-06-27 19:19:46 +00002816call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2817 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002818{
Fred Drake5755ce62001-06-27 19:19:46 +00002819 register PyThreadState *tstate = frame->f_tstate;
2820 int result;
2821 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002822 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002823 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002824 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002825 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002826 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2827 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002828 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002829 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002830}
2831
Fred Drake5755ce62001-06-27 19:19:46 +00002832void
2833PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002834{
Fred Drake5755ce62001-06-27 19:19:46 +00002835 PyThreadState *tstate = PyThreadState_Get();
2836 PyObject *temp = tstate->c_profileobj;
2837 Py_XINCREF(arg);
2838 tstate->c_profilefunc = NULL;
2839 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002840 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002841 Py_XDECREF(temp);
2842 tstate->c_profilefunc = func;
2843 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002844 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002845}
2846
2847void
2848PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2849{
2850 PyThreadState *tstate = PyThreadState_Get();
2851 PyObject *temp = tstate->c_traceobj;
2852 Py_XINCREF(arg);
2853 tstate->c_tracefunc = NULL;
2854 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002855 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002856 Py_XDECREF(temp);
2857 tstate->c_tracefunc = func;
2858 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002859 tstate->use_tracing = ((func != NULL)
2860 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002861}
2862
Guido van Rossumb209a111997-04-29 18:18:01 +00002863PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002864PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002865{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002866 PyThreadState *tstate = PyThreadState_Get();
2867 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002868 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002869 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002870 else
2871 return current_frame->f_builtins;
2872}
2873
Guido van Rossumb209a111997-04-29 18:18:01 +00002874PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002875PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002876{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002877 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002878 if (current_frame == NULL)
2879 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002880 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002881 return current_frame->f_locals;
2882}
2883
Guido van Rossumb209a111997-04-29 18:18:01 +00002884PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002885PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002887 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 if (current_frame == NULL)
2889 return NULL;
2890 else
2891 return current_frame->f_globals;
2892}
2893
Guido van Rossumb209a111997-04-29 18:18:01 +00002894PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002895PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002896{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002897 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002898 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002899}
2900
Guido van Rossum6135a871995-01-09 17:53:26 +00002901int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002902PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002903{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002904 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002905 return current_frame == NULL ? 0 : current_frame->f_restricted;
2906}
2907
Guido van Rossumbe270261997-05-22 22:26:18 +00002908int
Tim Peters5ba58662001-07-16 02:29:45 +00002909PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002910{
2911 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002912 int result = 0;
2913
2914 if (current_frame != NULL) {
2915 const int codeflags = current_frame->f_code->co_flags;
2916 if (codeflags & CO_NESTED) {
2917 result = 1;
2918 cf->cf_flags |= PyCF_NESTED_SCOPES;
2919 }
2920 if (codeflags & CO_GENERATOR_ALLOWED) {
2921 result = 1;
2922 cf->cf_flags |= PyCF_GENERATORS;
2923 }
2924 }
2925 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002926}
2927
2928int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002929Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930{
Guido van Rossumb209a111997-04-29 18:18:01 +00002931 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002932 if (f == NULL)
2933 return 0;
2934 if (!PyFile_SoftSpace(f, 0))
2935 return 0;
2936 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937}
2938
Guido van Rossum3f5da241990-12-20 15:06:42 +00002939
Guido van Rossum681d79a1995-07-18 14:51:37 +00002940/* External interface to call any callable object.
2941 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002942
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002943#undef PyEval_CallObject
2944/* for backward compatibility: export this interface */
2945
Guido van Rossumb209a111997-04-29 18:18:01 +00002946PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002947PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002948{
Guido van Rossumb209a111997-04-29 18:18:01 +00002949 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002950}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002951#define PyEval_CallObject(func,arg) \
2952 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002953
Guido van Rossumb209a111997-04-29 18:18:01 +00002954PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002955PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002956{
Jeremy Hylton52820442001-01-03 23:52:36 +00002957 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002958
2959 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002960 arg = PyTuple_New(0);
2961 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002962 PyErr_SetString(PyExc_TypeError,
2963 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002964 return NULL;
2965 }
2966 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002967 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968
Guido van Rossumb209a111997-04-29 18:18:01 +00002969 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002970 PyErr_SetString(PyExc_TypeError,
2971 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002972 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002973 return NULL;
2974 }
2975
Jeremy Hylton52820442001-01-03 23:52:36 +00002976 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002977 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002978 return result;
2979}
2980
2981/* How often is each kind of object called? The answer depends on the
2982 program. An instrumented call_object() was used to run the Python
2983 regression test suite. The results were:
2984 4200000 PyCFunctions
2985 390000 fast_function() calls
2986 94000 other functions
2987 480000 all functions (sum of prev two)
2988 150000 methods
2989 100000 classes
2990
2991 Tests on other bodies of code show that PyCFunctions are still
2992 most common, but not by such a large margin.
2993*/
2994
Jeremy Hylton512a2372001-04-11 13:52:29 +00002995static char *
2996get_func_name(PyObject *func)
2997{
2998 if (PyMethod_Check(func))
2999 return get_func_name(PyMethod_GET_FUNCTION(func));
3000 else if (PyFunction_Check(func))
3001 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3002 else if (PyCFunction_Check(func))
3003 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3004 else if (PyClass_Check(func))
3005 return PyString_AsString(((PyClassObject*)func)->cl_name);
3006 else if (PyInstance_Check(func)) {
3007 return PyString_AsString(
3008 ((PyInstanceObject*)func)->in_class->cl_name);
3009 } else {
3010 return func->ob_type->tp_name;
3011 }
3012}
3013
3014static char *
3015get_func_desc(PyObject *func)
3016{
3017 if (PyMethod_Check(func))
3018 return "()";
3019 else if (PyFunction_Check(func))
3020 return "()";
3021 else if (PyCFunction_Check(func))
3022 return "()";
3023 else if (PyClass_Check(func))
3024 return " constructor";
3025 else if (PyInstance_Check(func)) {
3026 return " instance";
3027 } else {
3028 return " object";
3029 }
3030}
3031
Jeremy Hylton52820442001-01-03 23:52:36 +00003032static PyObject *
3033call_object(PyObject *func, PyObject *arg, PyObject *kw)
3034{
3035 ternaryfunc call;
3036 PyObject *result;
3037
3038 if (PyMethod_Check(func))
3039 result = call_method(func, arg, kw);
3040 else if (PyFunction_Check(func))
3041 result = call_eval_code2(func, arg, kw);
3042 else if (PyCFunction_Check(func))
3043 result = call_cfunction(func, arg, kw);
3044 else if (PyClass_Check(func))
3045 result = PyInstance_New(func, arg, kw);
3046 else if (PyInstance_Check(func))
3047 result = call_instance(func, arg, kw);
3048 else if ((call = func->ob_type->tp_call) != NULL)
3049 result = (*call)(func, arg, kw);
3050 else {
Tim Peters239508c2001-06-16 00:09:28 +00003051 PyErr_Format(PyExc_TypeError,
3052 "object of type '%.100s' is not callable",
3053 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003054 return NULL;
3055 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003056 if (result == NULL && !PyErr_Occurred())
3057 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003058 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003059
Guido van Rossume59214e1994-08-30 08:01:59 +00003060 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003061}
3062
Guido van Rossumb209a111997-04-29 18:18:01 +00003063static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003064call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065{
Jeremy Hylton52820442001-01-03 23:52:36 +00003066 PyCFunctionObject* f = (PyCFunctionObject*)func;
3067 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3068 PyObject *self = PyCFunction_GET_SELF(func);
3069 int flags = PyCFunction_GET_FLAGS(func);
3070
Jeremy Hylton52820442001-01-03 23:52:36 +00003071 if (flags & METH_KEYWORDS) {
3072 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003073 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003074 if (kw != NULL && PyDict_Size(kw) != 0) {
3075 PyErr_Format(PyExc_TypeError,
3076 "%.200s() takes no keyword arguments",
3077 f->m_ml->ml_name);
3078 return NULL;
3079 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003080 if (flags & METH_VARARGS) {
3081 return (*meth)(self, arg);
3082 }
3083 if (!(flags & METH_VARARGS)) {
3084 /* the really old style */
3085 int size = PyTuple_GET_SIZE(arg);
3086 if (size == 1)
3087 arg = PyTuple_GET_ITEM(arg, 0);
3088 else if (size == 0)
3089 arg = NULL;
3090 return (*meth)(self, arg);
3091 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003092 /* should never get here ??? */
3093 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 return NULL;
3095}
3096
Guido van Rossumb209a111997-04-29 18:18:01 +00003097static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003098call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099{
Jeremy Hylton52820442001-01-03 23:52:36 +00003100 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3101 if (call == NULL) {
3102 PyInstanceObject *inst = (PyInstanceObject*) func;
3103 PyErr_Clear();
3104 PyErr_Format(PyExc_AttributeError,
3105 "%.200s instance has no __call__ method",
3106 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003107 return NULL;
3108 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003109 res = call_object(call, arg, kw);
3110 Py_DECREF(call);
3111 return res;
3112}
3113
3114static PyObject *
3115call_method(PyObject *func, PyObject *arg, PyObject *kw)
3116{
3117 PyObject *self = PyMethod_GET_SELF(func);
3118 PyObject *class = PyMethod_GET_CLASS(func);
3119 PyObject *result;
3120
3121 func = PyMethod_GET_FUNCTION(func);
3122 if (self == NULL) {
3123 /* Unbound methods must be called with an instance of
3124 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003125 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003126 if (PyTuple_Size(arg) >= 1)
3127 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003128 if (self == NULL)
3129 ok = 0;
3130 else {
3131 ok = PyObject_IsInstance(self, class);
3132 if (ok < 0)
3133 return NULL;
3134 }
3135 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003136 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003137 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003138 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003139 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140 return NULL;
3141 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003142 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003143 }
3144 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003145 int argcount = PyTuple_Size(arg);
3146 PyObject *newarg = PyTuple_New(argcount + 1);
3147 int i;
3148 if (newarg == NULL)
3149 return NULL;
3150 Py_INCREF(self);
3151 PyTuple_SET_ITEM(newarg, 0, self);
3152 for (i = 0; i < argcount; i++) {
3153 PyObject *v = PyTuple_GET_ITEM(arg, i);
3154 Py_XINCREF(v);
3155 PyTuple_SET_ITEM(newarg, i+1, v);
3156 }
3157 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003158 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003159 result = call_object(func, arg, kw);
3160 Py_DECREF(arg);
3161 return result;
3162}
3163
3164static PyObject *
3165call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3166{
3167 PyObject *result;
3168 PyObject *argdefs;
3169 PyObject **d, **k;
3170 int nk, nd;
3171
3172 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003173 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3174 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3175 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003176 }
3177 else {
3178 d = NULL;
3179 nd = 0;
3180 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003181
Guido van Rossum681d79a1995-07-18 14:51:37 +00003182 if (kw != NULL) {
3183 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003184 nk = PyDict_Size(kw);
3185 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003186 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003187 PyErr_NoMemory();
3188 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003189 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003190 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003191 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003192 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003193 i += 2;
3194 nk = i/2;
3195 /* XXX This is broken if the caller deletes dict items! */
3196 }
3197 else {
3198 k = NULL;
3199 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003200 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003201
Guido van Rossum681d79a1995-07-18 14:51:37 +00003202 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003203 (PyCodeObject *)PyFunction_GET_CODE(func),
3204 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003205 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003206 k, nk, d, nd,
3207 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003208
Guido van Rossumb18618d2000-05-03 23:44:39 +00003209 if (k != NULL)
3210 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003211
Guido van Rossum681d79a1995-07-18 14:51:37 +00003212 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213}
3214
Jeremy Hylton52820442001-01-03 23:52:36 +00003215#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3216
3217/* The two fast_xxx() functions optimize calls for which no argument
3218 tuple is necessary; the objects are passed directly from the stack.
3219 fast_cfunction() is called for METH_OLDARGS functions.
3220 fast_function() is for functions with no special argument handling.
3221*/
3222
3223static PyObject *
3224fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3225{
3226 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3227 PyObject *self = PyCFunction_GET_SELF(func);
3228
3229 if (na == 0)
3230 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003231 else if (na == 1) {
3232 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003233 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003234 Py_DECREF(arg);
3235 return result;
3236 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003237 PyObject *args = load_args(pp_stack, na);
3238 PyObject *result = (*meth)(self, args);
3239 Py_DECREF(args);
3240 return result;
3241 }
3242}
3243
3244static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003245fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003246{
3247 PyObject *co = PyFunction_GET_CODE(func);
3248 PyObject *globals = PyFunction_GET_GLOBALS(func);
3249 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003250 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003251 PyObject **d = NULL;
3252 int nd = 0;
3253
3254 if (argdefs != NULL) {
3255 d = &PyTuple_GET_ITEM(argdefs, 0);
3256 nd = ((PyTupleObject *)argdefs)->ob_size;
3257 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003258 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003259 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003260 (*pp_stack)-2*nk, nk, d, nd,
3261 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003262}
3263
3264static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003265update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3266 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003267{
3268 PyObject *kwdict = NULL;
3269 if (orig_kwdict == NULL)
3270 kwdict = PyDict_New();
3271 else {
3272 kwdict = PyDict_Copy(orig_kwdict);
3273 Py_DECREF(orig_kwdict);
3274 }
3275 if (kwdict == NULL)
3276 return NULL;
3277 while (--nk >= 0) {
3278 int err;
3279 PyObject *value = EXT_POP(*pp_stack);
3280 PyObject *key = EXT_POP(*pp_stack);
3281 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003282 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003283 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003284 "for keyword argument '%.200s'",
3285 get_func_name(func),
3286 get_func_desc(func),
3287 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003288 Py_DECREF(key);
3289 Py_DECREF(value);
3290 Py_DECREF(kwdict);
3291 return NULL;
3292 }
3293 err = PyDict_SetItem(kwdict, key, value);
3294 Py_DECREF(key);
3295 Py_DECREF(value);
3296 if (err) {
3297 Py_DECREF(kwdict);
3298 return NULL;
3299 }
3300 }
3301 return kwdict;
3302}
3303
3304static PyObject *
3305update_star_args(int nstack, int nstar, PyObject *stararg,
3306 PyObject ***pp_stack)
3307{
3308 PyObject *callargs, *w;
3309
3310 callargs = PyTuple_New(nstack + nstar);
3311 if (callargs == NULL) {
3312 return NULL;
3313 }
3314 if (nstar) {
3315 int i;
3316 for (i = 0; i < nstar; i++) {
3317 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3318 Py_INCREF(a);
3319 PyTuple_SET_ITEM(callargs, nstack + i, a);
3320 }
3321 }
3322 while (--nstack >= 0) {
3323 w = EXT_POP(*pp_stack);
3324 PyTuple_SET_ITEM(callargs, nstack, w);
3325 }
3326 return callargs;
3327}
3328
3329static PyObject *
3330load_args(PyObject ***pp_stack, int na)
3331{
3332 PyObject *args = PyTuple_New(na);
3333 PyObject *w;
3334
3335 if (args == NULL)
3336 return NULL;
3337 while (--na >= 0) {
3338 w = EXT_POP(*pp_stack);
3339 PyTuple_SET_ITEM(args, na, w);
3340 }
3341 return args;
3342}
3343
3344static PyObject *
3345do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3346{
3347 PyObject *callargs = NULL;
3348 PyObject *kwdict = NULL;
3349 PyObject *result = NULL;
3350
3351 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003352 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003353 if (kwdict == NULL)
3354 goto call_fail;
3355 }
3356 callargs = load_args(pp_stack, na);
3357 if (callargs == NULL)
3358 goto call_fail;
3359 result = call_object(func, callargs, kwdict);
3360 call_fail:
3361 Py_XDECREF(callargs);
3362 Py_XDECREF(kwdict);
3363 return result;
3364}
3365
3366static PyObject *
3367ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3368{
3369 int nstar = 0;
3370 PyObject *callargs = NULL;
3371 PyObject *stararg = NULL;
3372 PyObject *kwdict = NULL;
3373 PyObject *result = NULL;
3374
3375 if (flags & CALL_FLAG_KW) {
3376 kwdict = EXT_POP(*pp_stack);
3377 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003378 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003379 "%s%s argument after ** "
3380 "must be a dictionary",
3381 get_func_name(func),
3382 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003383 goto ext_call_fail;
3384 }
3385 }
3386 if (flags & CALL_FLAG_VAR) {
3387 stararg = EXT_POP(*pp_stack);
3388 if (!PyTuple_Check(stararg)) {
3389 PyObject *t = NULL;
3390 t = PySequence_Tuple(stararg);
3391 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003392 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3393 PyErr_Format(PyExc_TypeError,
3394 "%s%s argument after * "
3395 "must be a sequence",
3396 get_func_name(func),
3397 get_func_desc(func));
3398 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003399 goto ext_call_fail;
3400 }
3401 Py_DECREF(stararg);
3402 stararg = t;
3403 }
3404 nstar = PyTuple_GET_SIZE(stararg);
3405 }
3406 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003407 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003408 if (kwdict == NULL)
3409 goto ext_call_fail;
3410 }
3411 callargs = update_star_args(na, nstar, stararg, pp_stack);
3412 if (callargs == NULL)
3413 goto ext_call_fail;
3414 result = call_object(func, callargs, kwdict);
3415 ext_call_fail:
3416 Py_XDECREF(callargs);
3417 Py_XDECREF(kwdict);
3418 Py_XDECREF(stararg);
3419 return result;
3420}
3421
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003422#define SLICE_ERROR_MSG \
3423 "standard sequence type does not support step size other than one"
3424
Guido van Rossumb209a111997-04-29 18:18:01 +00003425static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003426loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003427{
Guido van Rossumb209a111997-04-29 18:18:01 +00003428 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003429 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003430 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003431 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 return NULL;
3433 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003434 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003435 v = (*sq->sq_item)(v, i);
3436 if (v)
3437 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003438 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003439 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003440 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441}
3442
Guido van Rossum20c6add2000-05-08 14:06:50 +00003443/* Extract a slice index from a PyInt or PyLong, the index is bound to
3444 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3445 and error. Returns 1 on success.*/
3446
3447int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003448_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449{
3450 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003451 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003452 if (PyInt_Check(v)) {
3453 x = PyInt_AsLong(v);
3454 } else if (PyLong_Check(v)) {
3455 x = PyLong_AsLong(v);
3456 if (x==-1 && PyErr_Occurred()) {
3457 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003458 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003459
Guido van Rossumac7be682001-01-17 15:42:30 +00003460 if (!PyErr_ExceptionMatches(
3461 PyExc_OverflowError)) {
3462 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003463 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003464 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003465 }
3466
Guido van Rossumac7be682001-01-17 15:42:30 +00003467 /* Clear the OverflowError */
3468 PyErr_Clear();
3469
3470 /* It's an overflow error, so we need to
3471 check the sign of the long integer,
3472 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003473 the error. */
3474
3475 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003476 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003477 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003478
3479 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003480 cmp = PyObject_RichCompareBool(v, long_zero,
3481 Py_GT);
3482 Py_DECREF(long_zero);
3483 if (cmp < 0)
3484 return 0;
3485 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003486 x = INT_MAX;
3487 else
3488 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003489 }
3490 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003491 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003492 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003493 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003495 /* Truncate -- very long indices are truncated anyway */
3496 if (x > INT_MAX)
3497 x = INT_MAX;
3498 else if (x < -INT_MAX)
3499 x = 0;
3500 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003501 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003502 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503}
3504
Guido van Rossumb209a111997-04-29 18:18:01 +00003505static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003506apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003508 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003509 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003511 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003512 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003513 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003515
3516static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003517assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3518 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003520 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003521 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003522 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003523 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003524 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003525 if (x == NULL)
3526 return PySequence_DelSlice(u, ilow, ihigh);
3527 else
3528 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529}
3530
Guido van Rossumb209a111997-04-29 18:18:01 +00003531static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003532cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533{
Guido van Rossumac7be682001-01-17 15:42:30 +00003534 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003535 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003536 case IS:
3537 case IS_NOT:
3538 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003539 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003540 res = !res;
3541 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542 case IN:
3543 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003544 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003545 if (res < 0)
3546 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003547 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003548 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003549 break;
3550 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003551 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003552 break;
3553 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003554 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003555 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003556 v = res ? Py_True : Py_False;
3557 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558 return v;
3559}
3560
Thomas Wouters52152252000-08-17 22:55:00 +00003561static PyObject *
3562import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003563{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003564 PyObject *x;
3565
3566 x = PyObject_GetAttr(v, name);
3567 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003568 PyErr_Format(PyExc_ImportError,
3569 "cannot import name %.230s",
3570 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003571 }
Thomas Wouters52152252000-08-17 22:55:00 +00003572 return x;
3573}
Guido van Rossumac7be682001-01-17 15:42:30 +00003574
Thomas Wouters52152252000-08-17 22:55:00 +00003575static int
3576import_all_from(PyObject *locals, PyObject *v)
3577{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003578 PyObject *all = PyObject_GetAttrString(v, "__all__");
3579 PyObject *dict, *name, *value;
3580 int skip_leading_underscores = 0;
3581 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003582
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003583 if (all == NULL) {
3584 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3585 return -1; /* Unexpected error */
3586 PyErr_Clear();
3587 dict = PyObject_GetAttrString(v, "__dict__");
3588 if (dict == NULL) {
3589 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3590 return -1;
3591 PyErr_SetString(PyExc_ImportError,
3592 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003593 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003594 }
3595 all = PyMapping_Keys(dict);
3596 Py_DECREF(dict);
3597 if (all == NULL)
3598 return -1;
3599 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003600 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003601
3602 for (pos = 0, err = 0; ; pos++) {
3603 name = PySequence_GetItem(all, pos);
3604 if (name == NULL) {
3605 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3606 err = -1;
3607 else
3608 PyErr_Clear();
3609 break;
3610 }
3611 if (skip_leading_underscores &&
3612 PyString_Check(name) &&
3613 PyString_AS_STRING(name)[0] == '_')
3614 {
3615 Py_DECREF(name);
3616 continue;
3617 }
3618 value = PyObject_GetAttr(v, name);
3619 if (value == NULL)
3620 err = -1;
3621 else
3622 err = PyDict_SetItem(locals, name, value);
3623 Py_DECREF(name);
3624 Py_XDECREF(value);
3625 if (err != 0)
3626 break;
3627 }
3628 Py_DECREF(all);
3629 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003630}
3631
Guido van Rossumb209a111997-04-29 18:18:01 +00003632static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003633build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003634{
Guido van Rossumcd649651997-08-22 16:56:16 +00003635 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003636 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003637 PyErr_SetString(PyExc_SystemError,
3638 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003639 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003640 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003641 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003642 PyErr_SetString(PyExc_SystemError,
3643 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003644 return NULL;
3645 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003646 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003647 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003648 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003649 return NULL;
3650 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003651 n = PyTuple_Size(bases);
3652 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003653 PyObject *base = PyTuple_GET_ITEM(bases, i);
3654 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003655 /* Call the base's *type*, if it is callable.
3656 This code is a hook for Donald Beaudry's
3657 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003658 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003659 since its types are not callable.
3660 Ditto: call the bases's *class*, if it has
3661 one. This makes the same thing possible
3662 without writing C code. A true meta-object
3663 protocol! */
3664 PyObject *basetype = (PyObject *)base->ob_type;
3665 PyObject *callable = NULL;
3666 if (PyCallable_Check(basetype))
3667 callable = basetype;
3668 else
3669 callable = PyObject_GetAttrString(
3670 base, "__class__");
3671 if (callable) {
3672 PyObject *args;
3673 PyObject *newclass = NULL;
3674 args = Py_BuildValue(
3675 "(OOO)", name, bases, methods);
3676 if (args != NULL) {
3677 newclass = PyEval_CallObject(
3678 callable, args);
3679 Py_DECREF(args);
3680 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003681 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003682 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003683 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003684 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003685 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003686 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003687 "base is not a class object");
3688 return NULL;
3689 }
3690 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003691 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003692}
3693
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003694static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003695exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3696 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003697{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003698 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003699 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003700 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003701
Guido van Rossumb209a111997-04-29 18:18:01 +00003702 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3703 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003704 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003705 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003706 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003707 locals = PyTuple_GetItem(prog, 2);
3708 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003709 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003710 if (globals == Py_None) {
3711 globals = PyEval_GetGlobals();
3712 if (locals == Py_None) {
3713 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003714 plain = 1;
3715 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003716 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003717 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003718 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003719 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003720 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003721 !PyCode_Check(prog) &&
3722 !PyFile_Check(prog)) {
3723 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003724 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003725 return -1;
3726 }
Fred Drake661ea262000-10-24 19:57:45 +00003727 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003728 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003729 "exec: arg 2 must be a dictionary or None");
3730 return -1;
3731 }
3732 if (!PyDict_Check(locals)) {
3733 PyErr_SetString(PyExc_TypeError,
3734 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003735 return -1;
3736 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003737 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003738 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003739 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003740 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003741 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003742 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003743 FILE *fp = PyFile_AsFile(prog);
3744 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003745 PyCompilerFlags cf;
3746 cf.cf_flags = 0;
3747 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003748 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3749 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003750 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003751 v = PyRun_File(fp, name, Py_file_input, globals,
3752 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003753 }
3754 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003755 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003756 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003757 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003758 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003759 cf.cf_flags = 0;
3760 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003761 v = PyRun_StringFlags(str, Py_file_input, globals,
3762 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003763 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003764 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003765 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003766 if (plain)
3767 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003768 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003769 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003770 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003771 return 0;
3772}
Guido van Rossum24c13741995-02-14 09:42:43 +00003773
Guido van Rossumac7be682001-01-17 15:42:30 +00003774static void
Paul Prescode68140d2000-08-30 20:25:01 +00003775format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3776{
3777 char *obj_str;
3778
3779 if (!obj)
3780 return;
3781
3782 obj_str = PyString_AsString(obj);
3783 if (!obj_str)
3784 return;
3785
3786 PyErr_Format(exc, format_str, obj_str);
3787}
Guido van Rossum950361c1997-01-24 13:49:28 +00003788
3789#ifdef DYNAMIC_EXECUTION_PROFILE
3790
3791PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003792getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003793{
3794 int i;
3795 PyObject *l = PyList_New(256);
3796 if (l == NULL) return NULL;
3797 for (i = 0; i < 256; i++) {
3798 PyObject *x = PyInt_FromLong(a[i]);
3799 if (x == NULL) {
3800 Py_DECREF(l);
3801 return NULL;
3802 }
3803 PyList_SetItem(l, i, x);
3804 }
3805 for (i = 0; i < 256; i++)
3806 a[i] = 0;
3807 return l;
3808}
3809
3810PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003811_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003812{
3813#ifndef DXPAIRS
3814 return getarray(dxp);
3815#else
3816 int i;
3817 PyObject *l = PyList_New(257);
3818 if (l == NULL) return NULL;
3819 for (i = 0; i < 257; i++) {
3820 PyObject *x = getarray(dxpairs[i]);
3821 if (x == NULL) {
3822 Py_DECREF(l);
3823 return NULL;
3824 }
3825 PyList_SetItem(l, i, x);
3826 }
3827 return l;
3828#endif
3829}
3830
3831#endif