blob: 6a1ba50020e36b9db54b95ea1c48cb723ef60cd6 [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:
5 XXX how to pass arguments to call_trace?
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
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
65static int call_trace(PyObject **, PyObject **,
Fred Draked0838392001-06-16 21:02:31 +000066 PyFrameObject *, PyObject *, PyObject *);
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/* Cached interned string objects used for calling the profile and
102 * trace functions.
103 */
104static PyObject *str_call = NULL;
105static PyObject *str_exception = NULL;
106static PyObject *str_line = NULL;
107static PyObject *str_return = NULL;
108
109
Tim Peters5ca576e2001-06-18 22:08:13 +0000110staticforward PyTypeObject gentype;
111
112typedef struct {
113 PyObject_HEAD
114 PyFrameObject *frame;
115 int running; /* true if generator is being executed */
116} genobject;
117
118static PyObject *
119gen_new(PyFrameObject *f)
120{
121 genobject *gen = PyObject_New(genobject, &gentype);
122 if (gen == NULL) {
123 Py_DECREF(f);
124 return NULL;
125 }
126 gen->frame = f;
127 gen->running = 0;
128 return (PyObject *)gen;
129}
130
131static void
132gen_dealloc(genobject *gen)
133{
134 Py_DECREF(gen->frame);
135 PyObject_DEL(gen);
136}
137
138static PyObject *
139gen_iternext(genobject *gen)
140{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000141 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000142 PyFrameObject *f = gen->frame;
143 PyObject *result;
144
145 if (gen->running) {
146 PyErr_SetString(PyExc_ValueError,
147 "generator already executing");
148 return NULL;
149 }
Tim Peters8c963692001-06-23 05:26:56 +0000150 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000151 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000152
153 /* Generators always return to their most recent caller, not
154 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000155 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000156 assert(f->f_back == NULL);
157 f->f_back = tstate->frame;
158
159 gen->running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000160 result = eval_frame(f);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000161 gen->running = 0;
162
163 /* Don't keep the reference to f_back any longer than necessary. It
164 * may keep a chain of frames alive or it could create a reference
165 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000166 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000167 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000168
Tim Petersad1a18b2001-06-23 06:19:16 +0000169 /* If the generator just returned (as opposed to yielding), signal
170 * that the generator is exhausted. */
171 if (result == Py_None && f->f_stacktop == NULL) {
172 Py_DECREF(result);
173 result = NULL;
174 }
175
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000176 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000177}
178
179static PyObject *
180gen_next(genobject *gen, PyObject *args)
181{
182 PyObject *result;
183
184 if (!PyArg_ParseTuple(args, ":next"))
185 return NULL;
186
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000187 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000188
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000189 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000190 PyErr_SetObject(PyExc_StopIteration, Py_None);
191 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000192 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000193
194 return result;
195}
196
197static PyObject *
198gen_getiter(PyObject *gen)
199{
200 Py_INCREF(gen);
201 return gen;
202}
203
204static struct PyMethodDef gen_methods[] = {
205 {"next", (PyCFunction)gen_next, METH_VARARGS,
206 "next() -- get the next value, or raise StopIteration"},
207 {NULL, NULL} /* Sentinel */
208};
209
210static PyObject *
211gen_getattr(genobject *gen, char *name)
212{
213 return Py_FindMethod(gen_methods, (PyObject *)gen, name);
214}
215
216statichere PyTypeObject gentype = {
217 PyObject_HEAD_INIT(&PyType_Type)
218 0, /* ob_size */
219 "generator", /* tp_name */
220 sizeof(genobject), /* tp_basicsize */
221 0, /* tp_itemsize */
222 /* methods */
223 (destructor)gen_dealloc, /* tp_dealloc */
224 0, /* tp_print */
225 (getattrfunc)gen_getattr, /* tp_getattr */
226 0, /* tp_setattr */
227 0, /* tp_compare */
228 0, /* tp_repr */
229 0, /* tp_as_number */
230 0, /* tp_as_sequence */
231 0, /* tp_as_mapping */
232 0, /* tp_hash */
233 0, /* tp_call */
234 0, /* tp_str */
235 0, /* tp_getattro */
236 0, /* tp_setattro */
237 0, /* tp_as_buffer */
238 Py_TPFLAGS_DEFAULT, /* tp_flags */
239 0, /* tp_doc */
240 0, /* tp_traverse */
241 0, /* tp_clear */
242 0, /* tp_richcompare */
243 0, /* tp_weaklistoffset */
244 (getiterfunc)gen_getiter, /* tp_iter */
245 (iternextfunc)gen_iternext, /* tp_iternext */
246};
247
248
Guido van Rossume59214e1994-08-30 08:01:59 +0000249#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000250
Guido van Rossum2571cc81999-04-07 16:07:23 +0000251#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000253#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000254#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000255
Guido van Rossuma027efa1997-05-05 20:56:21 +0000256extern int _PyThread_Started; /* Flag for Py_Exit */
257
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000259static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000260
261void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000262PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000263{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000264 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000265 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000266 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267 interpreter_lock = PyThread_allocate_lock();
268 PyThread_acquire_lock(interpreter_lock, 1);
269 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000270}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000271
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000272void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000273PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000275 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000276}
277
278void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000280{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000281 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000282}
283
284void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000285PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000286{
287 if (tstate == NULL)
288 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000289 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000290 if (PyThreadState_Swap(tstate) != NULL)
291 Py_FatalError(
292 "PyEval_AcquireThread: non-NULL old thread state");
293}
294
295void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000296PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000297{
298 if (tstate == NULL)
299 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
300 if (PyThreadState_Swap(NULL) != tstate)
301 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000302 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000303}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000304
305/* This function is called from PyOS_AfterFork to ensure that newly
306 created child processes don't hold locks referring to threads which
307 are not running in the child process. (This could also be done using
308 pthread_atfork mechanism, at least for the pthreads implementation.) */
309
310void
311PyEval_ReInitThreads(void)
312{
313 if (!interpreter_lock)
314 return;
315 /*XXX Can't use PyThread_free_lock here because it does too
316 much error-checking. Doing this cleanly would require
317 adding a new function to each thread_*.h. Instead, just
318 create a new lock and waste a little bit of memory */
319 interpreter_lock = PyThread_allocate_lock();
320 PyThread_acquire_lock(interpreter_lock, 1);
321 main_thread = PyThread_get_thread_ident();
322}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323#endif
324
Guido van Rossumff4949e1992-08-05 19:58:53 +0000325/* Functions save_thread and restore_thread are always defined so
326 dynamically loaded modules needn't be compiled separately for use
327 with and without threads: */
328
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000329PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000330PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000332 PyThreadState *tstate = PyThreadState_Swap(NULL);
333 if (tstate == NULL)
334 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000335#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000336 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000337 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000338#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000339 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340}
341
342void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000343PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000345 if (tstate == NULL)
346 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000347#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000348 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000349 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000350 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000351 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000352 }
353#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000354 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000355}
356
357
Guido van Rossuma9672091994-09-14 13:31:22 +0000358/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
359 signal handlers or Mac I/O completion routines) can schedule calls
360 to a function to be called synchronously.
361 The synchronous function is called with one void* argument.
362 It should return 0 for success or -1 for failure -- failure should
363 be accompanied by an exception.
364
365 If registry succeeds, the registry function returns 0; if it fails
366 (e.g. due to too many pending calls) it returns -1 (without setting
367 an exception condition).
368
369 Note that because registry may occur from within signal handlers,
370 or other asynchronous events, calling malloc() is unsafe!
371
372#ifdef WITH_THREAD
373 Any thread can schedule pending calls, but only the main thread
374 will execute them.
375#endif
376
377 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
378 There are two possible race conditions:
379 (1) nested asynchronous registry calls;
380 (2) registry calls made while pending calls are being processed.
381 While (1) is very unlikely, (2) is a real possibility.
382 The current code is safe against (2), but not against (1).
383 The safety against (2) is derived from the fact that only one
384 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000385
Guido van Rossuma027efa1997-05-05 20:56:21 +0000386 XXX Darn! With the advent of thread state, we should have an array
387 of pending calls per thread in the thread state! Later...
388*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000389
Guido van Rossuma9672091994-09-14 13:31:22 +0000390#define NPENDINGCALLS 32
391static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000392 int (*func)(void *);
393 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000394} pendingcalls[NPENDINGCALLS];
395static volatile int pendingfirst = 0;
396static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000397static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000398
399int
Thomas Wouters334fb892000-07-25 12:56:38 +0000400Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000401{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000402 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000403 int i, j;
404 /* XXX Begin critical section */
405 /* XXX If you want this to be safe against nested
406 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000407 if (busy)
408 return -1;
409 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000410 i = pendinglast;
411 j = (i + 1) % NPENDINGCALLS;
412 if (j == pendingfirst)
413 return -1; /* Queue full */
414 pendingcalls[i].func = func;
415 pendingcalls[i].arg = arg;
416 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000417 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000418 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419 /* XXX End critical section */
420 return 0;
421}
422
Guido van Rossum180d7b41994-09-29 09:45:57 +0000423int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000424Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000425{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000426 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000427#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000428 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000429 return 0;
430#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000431 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000432 return 0;
433 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000434 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000435 for (;;) {
436 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000437 int (*func)(void *);
438 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000439 i = pendingfirst;
440 if (i == pendinglast)
441 break; /* Queue empty */
442 func = pendingcalls[i].func;
443 arg = pendingcalls[i].arg;
444 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000445 if (func(arg) < 0) {
446 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000447 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000448 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000449 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000450 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000451 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000452 return 0;
453}
454
455
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000456/* The interpreter's recursion limit */
457
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000458static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000459
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000460int
461Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000462{
463 return recursion_limit;
464}
465
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000466void
467Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000468{
469 recursion_limit = new_limit;
470}
471
Guido van Rossum374a9221991-04-04 10:40:29 +0000472/* Status code for main loop (reason for stack unwind) */
473
474enum why_code {
475 WHY_NOT, /* No error */
476 WHY_EXCEPTION, /* Exception occurred */
477 WHY_RERAISE, /* Exception re-raised by 'finally' */
478 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000479 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000480 WHY_CONTINUE, /* 'continue' statement */
481 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000482};
483
Tim Petersdbd9ba62000-07-09 03:09:57 +0000484static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000485static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000486
Guido van Rossum374a9221991-04-04 10:40:29 +0000487
Guido van Rossumb209a111997-04-29 18:18:01 +0000488PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000489PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490{
491 return eval_code2(co,
492 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000493 (PyObject **)NULL, 0,
494 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000495 (PyObject **)NULL, 0,
496 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497}
498
499
500/* Interpreter main loop */
501
Tim Peters5ca576e2001-06-18 22:08:13 +0000502PyObject *
503eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000504{
Guido van Rossum950361c1997-01-24 13:49:28 +0000505#ifdef DXPAIRS
506 int lastopcode = 0;
507#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000508 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000509 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000510 register int opcode=0; /* Current opcode */
511 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000512 register enum why_code why; /* Reason for block stack unwind */
513 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000514 register PyObject *x; /* Result object -- NULL if error */
515 register PyObject *v; /* Temporary objects popped off stack */
516 register PyObject *w;
517 register PyObject *u;
518 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000519 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000520 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000521 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000522 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000523 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000524 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000525#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000526 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000527#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000528#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000530 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000531#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000532
533/* Code access macros */
534
535#define GETCONST(i) Getconst(f, i)
536#define GETNAME(i) Getname(f, i)
537#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000538#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000539#define NEXTOP() (*next_instr++)
540#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000541#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000542#define JUMPBY(x) (next_instr += (x))
543
544/* Stack manipulation macros */
545
546#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
547#define EMPTY() (STACK_LEVEL() == 0)
548#define TOP() (stack_pointer[-1])
549#define BASIC_PUSH(v) (*stack_pointer++ = (v))
550#define BASIC_POP() (*--stack_pointer)
551
Guido van Rossum96a42c81992-01-12 02:29:51 +0000552#ifdef LLTRACE
553#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
554#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000555#else
556#define PUSH(v) BASIC_PUSH(v)
557#define POP() BASIC_POP()
558#endif
559
Guido van Rossum681d79a1995-07-18 14:51:37 +0000560/* Local variable macros */
561
562#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000563#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000564 GETLOCAL(i) = value; } while (0)
565
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566/* Start of code */
567
Tim Peters5ca576e2001-06-18 22:08:13 +0000568 if (f == NULL)
569 return NULL;
570
Guido van Rossum8861b741996-07-30 16:49:37 +0000571#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000572 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000573 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000574 return NULL;
575 }
576#endif
577
Tim Peters5ca576e2001-06-18 22:08:13 +0000578 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000579 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000580 --tstate->recursion_depth;
581 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000582 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000583 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000584 return NULL;
585 }
586
Tim Peters5ca576e2001-06-18 22:08:13 +0000587 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000588 co = f->f_code;
589 fastlocals = f->f_localsplus;
590 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000591 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000592 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000593 stack_pointer = f->f_stacktop;
594 assert(stack_pointer != NULL);
595 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000596
597#ifdef LLTRACE
598 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
599#endif
600#if defined(Py_DEBUG) || defined(LLTRACE)
601 filename = PyString_AsString(co->co_filename);
602#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000603
Guido van Rossum374a9221991-04-04 10:40:29 +0000604 why = WHY_NOT;
605 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000606 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000607 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000608
Guido van Rossum374a9221991-04-04 10:40:29 +0000609 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000610 /* Do periodic things. Doing this every time through
611 the loop would add too much overhead, so we do it
612 only every Nth instruction. We also do it if
613 ``things_to_do'' is set, i.e. when an asynchronous
614 event needs attention (e.g. a signal handler or
615 async I/O handler); see Py_AddPendingCall() and
616 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000617
Guido van Rossuma027efa1997-05-05 20:56:21 +0000618 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000619 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000621 if (Py_MakePendingCalls() < 0) {
622 why = WHY_EXCEPTION;
623 goto on_error;
624 }
625 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000626#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000627 /* If we have true signals, the signal handler
628 will call Py_AddPendingCall() so we don't
629 have to call sigcheck(). On the Mac and
630 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000631 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000633 goto on_error;
634 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000635#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000636
Guido van Rossume59214e1994-08-30 08:01:59 +0000637#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638 if (interpreter_lock) {
639 /* Give another thread a chance */
640
Guido van Rossum25ce5661997-08-02 03:10:38 +0000641 if (PyThreadState_Swap(NULL) != tstate)
642 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000643 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000644
645 /* Other threads may run now */
646
Guido van Rossum65d5b571998-12-21 19:32:43 +0000647 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000648 if (PyThreadState_Swap(tstate) != NULL)
649 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000650 }
651#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000652 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000653
Guido van Rossum374a9221991-04-04 10:40:29 +0000654 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000655
Guido van Rossum408027e1996-12-30 16:17:54 +0000656#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000657 f->f_lasti = INSTR_OFFSET();
658#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000659
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 opcode = NEXTOP();
661 if (HAS_ARG(opcode))
662 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000663 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000664#ifdef DYNAMIC_EXECUTION_PROFILE
665#ifdef DXPAIRS
666 dxpairs[lastopcode][opcode]++;
667 lastopcode = opcode;
668#endif
669 dxp[opcode]++;
670#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000671
Guido van Rossum96a42c81992-01-12 02:29:51 +0000672#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000673 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000674
Guido van Rossum96a42c81992-01-12 02:29:51 +0000675 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000676 if (HAS_ARG(opcode)) {
677 printf("%d: %d, %d\n",
678 (int) (INSTR_OFFSET() - 3),
679 opcode, oparg);
680 }
681 else {
682 printf("%d: %d\n",
683 (int) (INSTR_OFFSET() - 1), opcode);
684 }
685 }
686#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000688
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000690
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 /* BEWARE!
692 It is essential that any operation that fails sets either
693 x to NULL, err to nonzero, or why to anything but WHY_NOT,
694 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000695
Guido van Rossum374a9221991-04-04 10:40:29 +0000696 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000697
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 case POP_TOP:
699 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000700 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000701 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000702
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 case ROT_TWO:
704 v = POP();
705 w = POP();
706 PUSH(v);
707 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000708 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000709
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 case ROT_THREE:
711 v = POP();
712 w = POP();
713 x = POP();
714 PUSH(v);
715 PUSH(x);
716 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000717 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Thomas Wouters434d0822000-08-24 20:11:32 +0000719 case ROT_FOUR:
720 u = POP();
721 v = POP();
722 w = POP();
723 x = POP();
724 PUSH(u);
725 PUSH(x);
726 PUSH(w);
727 PUSH(v);
728 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000729
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 case DUP_TOP:
731 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000732 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 PUSH(v);
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 DUP_TOPX:
737 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000738 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000739 x = TOP();
740 Py_INCREF(x);
741 PUSH(x);
742 continue;
743 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000744 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000745 Py_INCREF(x);
746 w = TOP();
747 Py_INCREF(w);
748 PUSH(x);
749 PUSH(w);
750 PUSH(x);
751 continue;
752 case 3:
753 x = POP();
754 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000755 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000756 Py_INCREF(w);
757 v = TOP();
758 Py_INCREF(v);
759 PUSH(w);
760 PUSH(x);
761 PUSH(v);
762 PUSH(w);
763 PUSH(x);
764 continue;
765 case 4:
766 x = POP();
767 Py_INCREF(x);
768 w = POP();
769 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000770 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000771 Py_INCREF(v);
772 u = TOP();
773 Py_INCREF(u);
774 PUSH(v);
775 PUSH(w);
776 PUSH(x);
777 PUSH(u);
778 PUSH(v);
779 PUSH(w);
780 PUSH(x);
781 continue;
782 case 5:
783 x = POP();
784 Py_INCREF(x);
785 w = POP();
786 Py_INCREF(w);
787 v = POP();
788 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000789 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000790 Py_INCREF(u);
791 t = TOP();
792 Py_INCREF(t);
793 PUSH(u);
794 PUSH(v);
795 PUSH(w);
796 PUSH(x);
797 PUSH(t);
798 PUSH(u);
799 PUSH(v);
800 PUSH(w);
801 PUSH(x);
802 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000803 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000804 Py_FatalError("invalid argument to DUP_TOPX"
805 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000806 }
Tim Peters35ba6892000-10-11 07:04:49 +0000807 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000808
Guido van Rossum374a9221991-04-04 10:40:29 +0000809 case UNARY_POSITIVE:
810 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000811 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000812 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000814 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000815 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000816
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 case UNARY_NEGATIVE:
818 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000819 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000820 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000821 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000822 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000823 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000824
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 case UNARY_NOT:
826 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000827 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000828 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000829 if (err == 0) {
830 Py_INCREF(Py_True);
831 PUSH(Py_True);
832 continue;
833 }
834 else if (err > 0) {
835 Py_INCREF(Py_False);
836 PUSH(Py_False);
837 err = 0;
838 continue;
839 }
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_CONVERT:
843 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000844 x = PyObject_Repr(v);
845 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000846 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000847 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000849
Guido van Rossum7928cd71991-10-24 14:59:31 +0000850 case UNARY_INVERT:
851 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000852 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000854 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000855 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000856 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000857
Guido van Rossum50564e81996-01-12 01:13:16 +0000858 case BINARY_POWER:
859 w = POP();
860 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000861 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000862 Py_DECREF(v);
863 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000864 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000865 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000866 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000867
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 case BINARY_MULTIPLY:
869 w = POP();
870 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000871 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000872 Py_DECREF(v);
873 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000875 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000877
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 case BINARY_DIVIDE:
879 w = POP();
880 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000881 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000882 Py_DECREF(v);
883 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000885 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000887
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 case BINARY_MODULO:
889 w = POP();
890 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000891 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000892 Py_DECREF(v);
893 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000895 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000897
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 case BINARY_ADD:
899 w = POP();
900 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000901 if (PyInt_Check(v) && PyInt_Check(w)) {
902 /* INLINE: int + int */
903 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000904 a = PyInt_AS_LONG(v);
905 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000906 i = a + b;
907 if ((i^a) < 0 && (i^b) < 0) {
908 PyErr_SetString(PyExc_OverflowError,
909 "integer addition");
910 x = NULL;
911 }
912 else
913 x = PyInt_FromLong(i);
914 }
915 else
916 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 Py_DECREF(v);
918 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000920 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000922
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 case BINARY_SUBTRACT:
924 w = POP();
925 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000926 if (PyInt_Check(v) && PyInt_Check(w)) {
927 /* INLINE: int - int */
928 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000929 a = PyInt_AS_LONG(v);
930 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000931 i = a - b;
932 if ((i^a) < 0 && (i^~b) < 0) {
933 PyErr_SetString(PyExc_OverflowError,
934 "integer subtraction");
935 x = NULL;
936 }
937 else
938 x = PyInt_FromLong(i);
939 }
940 else
941 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_SUBSCR:
949 w = POP();
950 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000951 if (PyList_Check(v) && PyInt_Check(w)) {
952 /* INLINE: list[int] */
953 long i = PyInt_AsLong(w);
954 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000955 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000956 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000957 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000958 PyErr_SetString(PyExc_IndexError,
959 "list index out of range");
960 x = NULL;
961 }
962 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000963 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000964 Py_INCREF(x);
965 }
966 }
967 else
968 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000969 Py_DECREF(v);
970 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000972 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000974
Guido van Rossum7928cd71991-10-24 14:59:31 +0000975 case BINARY_LSHIFT:
976 w = POP();
977 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000978 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 Py_DECREF(v);
980 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000981 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000982 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000983 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000984
Guido van Rossum7928cd71991-10-24 14:59:31 +0000985 case BINARY_RSHIFT:
986 w = POP();
987 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000988 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000989 Py_DECREF(v);
990 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000991 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000992 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000993 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000994
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995 case BINARY_AND:
996 w = POP();
997 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000998 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000999 Py_DECREF(v);
1000 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001001 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001002 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001003 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001004
Guido van Rossum7928cd71991-10-24 14:59:31 +00001005 case BINARY_XOR:
1006 w = POP();
1007 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001008 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001009 Py_DECREF(v);
1010 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001011 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001012 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001013 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001014
Guido van Rossum7928cd71991-10-24 14:59:31 +00001015 case BINARY_OR:
1016 w = POP();
1017 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001018 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001019 Py_DECREF(v);
1020 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001022 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001024
1025 case INPLACE_POWER:
1026 w = POP();
1027 v = POP();
1028 x = PyNumber_InPlacePower(v, w, Py_None);
1029 Py_DECREF(v);
1030 Py_DECREF(w);
1031 PUSH(x);
1032 if (x != NULL) continue;
1033 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001034
Thomas Wouters434d0822000-08-24 20:11:32 +00001035 case INPLACE_MULTIPLY:
1036 w = POP();
1037 v = POP();
1038 x = PyNumber_InPlaceMultiply(v, w);
1039 Py_DECREF(v);
1040 Py_DECREF(w);
1041 PUSH(x);
1042 if (x != NULL) continue;
1043 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001044
Thomas Wouters434d0822000-08-24 20:11:32 +00001045 case INPLACE_DIVIDE:
1046 w = POP();
1047 v = POP();
1048 x = PyNumber_InPlaceDivide(v, w);
1049 Py_DECREF(v);
1050 Py_DECREF(w);
1051 PUSH(x);
1052 if (x != NULL) continue;
1053 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001054
Thomas Wouters434d0822000-08-24 20:11:32 +00001055 case INPLACE_MODULO:
1056 w = POP();
1057 v = POP();
1058 x = PyNumber_InPlaceRemainder(v, w);
1059 Py_DECREF(v);
1060 Py_DECREF(w);
1061 PUSH(x);
1062 if (x != NULL) continue;
1063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Thomas Wouters434d0822000-08-24 20:11:32 +00001065 case INPLACE_ADD:
1066 w = POP();
1067 v = POP();
1068 if (PyInt_Check(v) && PyInt_Check(w)) {
1069 /* INLINE: int + int */
1070 register long a, b, i;
1071 a = PyInt_AS_LONG(v);
1072 b = PyInt_AS_LONG(w);
1073 i = a + b;
1074 if ((i^a) < 0 && (i^b) < 0) {
1075 PyErr_SetString(PyExc_OverflowError,
1076 "integer addition");
1077 x = NULL;
1078 }
1079 else
1080 x = PyInt_FromLong(i);
1081 }
1082 else
1083 x = PyNumber_InPlaceAdd(v, w);
1084 Py_DECREF(v);
1085 Py_DECREF(w);
1086 PUSH(x);
1087 if (x != NULL) continue;
1088 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001089
Thomas Wouters434d0822000-08-24 20:11:32 +00001090 case INPLACE_SUBTRACT:
1091 w = POP();
1092 v = POP();
1093 if (PyInt_Check(v) && PyInt_Check(w)) {
1094 /* INLINE: int - int */
1095 register long a, b, i;
1096 a = PyInt_AS_LONG(v);
1097 b = PyInt_AS_LONG(w);
1098 i = a - b;
1099 if ((i^a) < 0 && (i^~b) < 0) {
1100 PyErr_SetString(PyExc_OverflowError,
1101 "integer subtraction");
1102 x = NULL;
1103 }
1104 else
1105 x = PyInt_FromLong(i);
1106 }
1107 else
1108 x = PyNumber_InPlaceSubtract(v, w);
1109 Py_DECREF(v);
1110 Py_DECREF(w);
1111 PUSH(x);
1112 if (x != NULL) continue;
1113 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001114
Thomas Wouters434d0822000-08-24 20:11:32 +00001115 case INPLACE_LSHIFT:
1116 w = POP();
1117 v = POP();
1118 x = PyNumber_InPlaceLshift(v, w);
1119 Py_DECREF(v);
1120 Py_DECREF(w);
1121 PUSH(x);
1122 if (x != NULL) continue;
1123 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001124
Thomas Wouters434d0822000-08-24 20:11:32 +00001125 case INPLACE_RSHIFT:
1126 w = POP();
1127 v = POP();
1128 x = PyNumber_InPlaceRshift(v, w);
1129 Py_DECREF(v);
1130 Py_DECREF(w);
1131 PUSH(x);
1132 if (x != NULL) continue;
1133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 case INPLACE_AND:
1136 w = POP();
1137 v = POP();
1138 x = PyNumber_InPlaceAnd(v, w);
1139 Py_DECREF(v);
1140 Py_DECREF(w);
1141 PUSH(x);
1142 if (x != NULL) continue;
1143 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001144
Thomas Wouters434d0822000-08-24 20:11:32 +00001145 case INPLACE_XOR:
1146 w = POP();
1147 v = POP();
1148 x = PyNumber_InPlaceXor(v, w);
1149 Py_DECREF(v);
1150 Py_DECREF(w);
1151 PUSH(x);
1152 if (x != NULL) continue;
1153 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001154
Thomas Wouters434d0822000-08-24 20:11:32 +00001155 case INPLACE_OR:
1156 w = POP();
1157 v = POP();
1158 x = PyNumber_InPlaceOr(v, w);
1159 Py_DECREF(v);
1160 Py_DECREF(w);
1161 PUSH(x);
1162 if (x != NULL) continue;
1163 break;
1164
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 case SLICE+0:
1166 case SLICE+1:
1167 case SLICE+2:
1168 case SLICE+3:
1169 if ((opcode-SLICE) & 2)
1170 w = POP();
1171 else
1172 w = NULL;
1173 if ((opcode-SLICE) & 1)
1174 v = POP();
1175 else
1176 v = NULL;
1177 u = POP();
1178 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001179 Py_DECREF(u);
1180 Py_XDECREF(v);
1181 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001183 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001185
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 case STORE_SLICE+0:
1187 case STORE_SLICE+1:
1188 case STORE_SLICE+2:
1189 case STORE_SLICE+3:
1190 if ((opcode-STORE_SLICE) & 2)
1191 w = POP();
1192 else
1193 w = NULL;
1194 if ((opcode-STORE_SLICE) & 1)
1195 v = POP();
1196 else
1197 v = NULL;
1198 u = POP();
1199 t = POP();
1200 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001201 Py_DECREF(t);
1202 Py_DECREF(u);
1203 Py_XDECREF(v);
1204 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001205 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001207
Guido van Rossum374a9221991-04-04 10:40:29 +00001208 case DELETE_SLICE+0:
1209 case DELETE_SLICE+1:
1210 case DELETE_SLICE+2:
1211 case DELETE_SLICE+3:
1212 if ((opcode-DELETE_SLICE) & 2)
1213 w = POP();
1214 else
1215 w = NULL;
1216 if ((opcode-DELETE_SLICE) & 1)
1217 v = POP();
1218 else
1219 v = NULL;
1220 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001221 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001223 Py_DECREF(u);
1224 Py_XDECREF(v);
1225 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001226 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001228
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 case STORE_SUBSCR:
1230 w = POP();
1231 v = POP();
1232 u = POP();
1233 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001234 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001235 Py_DECREF(u);
1236 Py_DECREF(v);
1237 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001238 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001240
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 case DELETE_SUBSCR:
1242 w = POP();
1243 v = POP();
1244 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001245 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001246 Py_DECREF(v);
1247 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001248 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001250
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 case PRINT_EXPR:
1252 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001253 w = PySys_GetObject("displayhook");
1254 if (w == NULL) {
1255 PyErr_SetString(PyExc_RuntimeError,
1256 "lost sys.displayhook");
1257 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001258 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001259 }
1260 if (err == 0) {
1261 x = Py_BuildValue("(O)", v);
1262 if (x == NULL)
1263 err = -1;
1264 }
1265 if (err == 0) {
1266 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001267 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001268 if (w == NULL)
1269 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001271 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001272 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001274
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001275 case PRINT_ITEM_TO:
1276 w = stream = POP();
1277 /* fall through to PRINT_ITEM */
1278
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 case PRINT_ITEM:
1280 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001281 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001282 w = PySys_GetObject("stdout");
1283 if (w == NULL) {
1284 PyErr_SetString(PyExc_RuntimeError,
1285 "lost sys.stdout");
1286 err = -1;
1287 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001288 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001289 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001290 err = PyFile_WriteString(" ", w);
1291 if (err == 0)
1292 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001294 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 char *s = PyString_AsString(v);
1296 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001297 if (len > 0 &&
1298 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001299 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001300 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001302 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001303 Py_XDECREF(stream);
1304 stream = NULL;
1305 if (err == 0)
1306 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001308
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001309 case PRINT_NEWLINE_TO:
1310 w = stream = POP();
1311 /* fall through to PRINT_NEWLINE */
1312
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001314 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001315 w = PySys_GetObject("stdout");
1316 if (w == NULL)
1317 PyErr_SetString(PyExc_RuntimeError,
1318 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001319 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001320 if (w != NULL) {
1321 err = PyFile_WriteString("\n", w);
1322 if (err == 0)
1323 PyFile_SoftSpace(w, 0);
1324 }
1325 Py_XDECREF(stream);
1326 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001327 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001328
Thomas Wouters434d0822000-08-24 20:11:32 +00001329
1330#ifdef CASE_TOO_BIG
1331 default: switch (opcode) {
1332#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 case BREAK_LOOP:
1334 why = WHY_BREAK;
1335 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001336
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001337 case CONTINUE_LOOP:
1338 retval = PyInt_FromLong(oparg);
1339 why = WHY_CONTINUE;
1340 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001341
Guido van Rossumf10570b1995-07-07 22:53:21 +00001342 case RAISE_VARARGS:
1343 u = v = w = NULL;
1344 switch (oparg) {
1345 case 3:
1346 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001347 /* Fallthrough */
1348 case 2:
1349 v = POP(); /* value */
1350 /* Fallthrough */
1351 case 1:
1352 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001353 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001354 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001355 break;
1356 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001357 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001358 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001359 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001360 break;
1361 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001363
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001365 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001366 PyErr_SetString(PyExc_SystemError,
1367 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001368 break;
1369 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001371 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001373
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 case RETURN_VALUE:
1375 retval = POP();
1376 why = WHY_RETURN;
1377 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001378
Tim Peters5ca576e2001-06-18 22:08:13 +00001379 case YIELD_VALUE:
1380 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001381 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001382 f->f_lasti = INSTR_OFFSET();
1383 why = WHY_YIELD;
1384 break;
1385
1386
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001387 case EXEC_STMT:
1388 w = POP();
1389 v = POP();
1390 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001391 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001392 Py_DECREF(u);
1393 Py_DECREF(v);
1394 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001395 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001396
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 case POP_BLOCK:
1398 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 while (STACK_LEVEL() > b->b_level) {
1401 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 }
1404 }
1405 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001406
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 case END_FINALLY:
1408 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 if (PyInt_Check(v)) {
1410 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001411 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001412 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001413 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 retval = POP();
1415 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001418 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001421 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 else if (v != Py_None) {
1424 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001425 "'finally' pops bad exception");
1426 why = WHY_EXCEPTION;
1427 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001430
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001432 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001434 w = POP();
1435 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001437 Py_DECREF(u);
1438 Py_DECREF(v);
1439 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001441
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 case STORE_NAME:
1443 w = GETNAMEV(oparg);
1444 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001445 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001446 PyErr_Format(PyExc_SystemError,
1447 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001448 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001449 break;
1450 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001451 err = PyDict_SetItem(x, w, v);
1452 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001454
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001456 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001457 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001458 PyErr_Format(PyExc_SystemError,
1459 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001460 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001461 break;
1462 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001463 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001464 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001465 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001467
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001468 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001470 if (PyTuple_Check(v)) {
1471 if (PyTuple_Size(v) != oparg) {
1472 PyErr_SetString(PyExc_ValueError,
1473 "unpack tuple of wrong size");
1474 why = WHY_EXCEPTION;
1475 }
1476 else {
1477 for (; --oparg >= 0; ) {
1478 w = PyTuple_GET_ITEM(v, oparg);
1479 Py_INCREF(w);
1480 PUSH(w);
1481 }
1482 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001484 else if (PyList_Check(v)) {
1485 if (PyList_Size(v) != oparg) {
1486 PyErr_SetString(PyExc_ValueError,
1487 "unpack list of wrong size");
1488 why = WHY_EXCEPTION;
1489 }
1490 else {
1491 for (; --oparg >= 0; ) {
1492 w = PyList_GET_ITEM(v, oparg);
1493 Py_INCREF(w);
1494 PUSH(w);
1495 }
1496 }
1497 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001498 else if (unpack_iterable(v, oparg,
1499 stack_pointer + oparg))
1500 stack_pointer += oparg;
1501 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001502 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001505
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001507 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 v = POP();
1509 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1511 Py_DECREF(v);
1512 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001514
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001516 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001518 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1519 /* del v.w */
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 Rossum32c6cdf1991-12-10 13:52:46 +00001523 case STORE_GLOBAL:
1524 w = GETNAMEV(oparg);
1525 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 err = PyDict_SetItem(f->f_globals, w, v);
1527 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001530 case DELETE_GLOBAL:
1531 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001533 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001534 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001535 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001536
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 case LOAD_CONST:
1538 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 PUSH(x);
1541 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001542
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001544 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001545 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001546 PyErr_Format(PyExc_SystemError,
1547 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001548 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001549 break;
1550 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001557 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001558 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001559 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 break;
1561 }
1562 }
1563 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 PUSH(x);
1566 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001567
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001569 w = GETNAMEV(oparg);
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,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001576 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
1578 }
1579 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 PUSH(x);
1582 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001583
Guido van Rossum9bfef441993-03-29 10:43:31 +00001584 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001585 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001586 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001587 format_exc_check_arg(
1588 PyExc_UnboundLocalError,
1589 UNBOUNDLOCAL_ERROR_MSG,
1590 PyTuple_GetItem(co->co_varnames, oparg)
1591 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001592 break;
1593 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001594 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001595 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001596 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001597 break;
1598
1599 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001600 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001602 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001603
1604 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001605 x = GETLOCAL(oparg);
1606 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001607 format_exc_check_arg(
1608 PyExc_UnboundLocalError,
1609 UNBOUNDLOCAL_ERROR_MSG,
1610 PyTuple_GetItem(co->co_varnames, oparg)
1611 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001612 break;
1613 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001614 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001615 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001616
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001617 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001618 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001619 Py_INCREF(x);
1620 PUSH(x);
1621 break;
1622
1623 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001624 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001625 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001626 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001627 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001628 v = PyTuple_GetItem(co->co_cellvars,
1629 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001630 format_exc_check_arg(
1631 PyExc_UnboundLocalError,
1632 UNBOUNDLOCAL_ERROR_MSG,
1633 v);
1634 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001635 v = PyTuple_GetItem(
1636 co->co_freevars,
1637 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001638 format_exc_check_arg(
1639 PyExc_NameError,
1640 UNBOUNDFREE_ERROR_MSG,
1641 v);
1642 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001643 err = -1;
1644 break;
1645 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001646 PUSH(w);
1647 break;
1648
1649 case STORE_DEREF:
1650 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001651 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001652 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001653 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001654 continue;
1655
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 if (x != NULL) {
1659 for (; --oparg >= 0;) {
1660 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 }
1663 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001664 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 }
1666 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001667
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 if (x != NULL) {
1671 for (; --oparg >= 0;) {
1672 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001673 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 }
1675 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001676 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 }
1678 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001679
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001683 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001685
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001687 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 x = PyObject_GetAttr(v, w);
1690 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001692 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 case COMPARE_OP:
1696 w = POP();
1697 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001698 if (PyInt_Check(v) && PyInt_Check(w)) {
1699 /* INLINE: cmp(int, int) */
1700 register long a, b;
1701 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001702 a = PyInt_AS_LONG(v);
1703 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001704 switch (oparg) {
1705 case LT: res = a < b; break;
1706 case LE: res = a <= b; break;
1707 case EQ: res = a == b; break;
1708 case NE: res = a != b; break;
1709 case GT: res = a > b; break;
1710 case GE: res = a >= b; break;
1711 case IS: res = v == w; break;
1712 case IS_NOT: res = v != w; break;
1713 default: goto slow_compare;
1714 }
1715 x = res ? Py_True : Py_False;
1716 Py_INCREF(x);
1717 }
1718 else {
1719 slow_compare:
1720 x = cmp_outcome(oparg, v, w);
1721 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 Py_DECREF(v);
1723 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001727
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001729 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001731 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001733 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001734 break;
1735 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001736 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001737 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001738 w,
1739 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001740 f->f_locals == NULL ?
1741 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001742 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001744 if (w == NULL) {
1745 x = NULL;
1746 break;
1747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 x = PyEval_CallObject(x, w);
1749 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001750 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001751 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001753
Thomas Wouters52152252000-08-17 22:55:00 +00001754 case IMPORT_STAR:
1755 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001757 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001758 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001759 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001760 break;
1761 }
Thomas Wouters52152252000-08-17 22:55:00 +00001762 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001763 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001764 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001765 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001767
Thomas Wouters52152252000-08-17 22:55:00 +00001768 case IMPORT_FROM:
1769 w = GETNAMEV(oparg);
1770 v = TOP();
1771 x = import_from(v, w);
1772 PUSH(x);
1773 if (x != NULL) continue;
1774 break;
1775
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 case JUMP_FORWARD:
1777 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001778 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001779
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001781 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001782 if (err > 0)
1783 err = 0;
1784 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001786 else
1787 break;
1788 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001789
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001791 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001792 if (err > 0) {
1793 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001795 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001796 else if (err == 0)
1797 ;
1798 else
1799 break;
1800 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001801
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 case JUMP_ABSOLUTE:
1803 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001804 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001806 case GET_ITER:
1807 /* before: [obj]; after [getiter(obj)] */
1808 v = POP();
1809 x = PyObject_GetIter(v);
1810 Py_DECREF(v);
1811 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001812 PUSH(x);
1813 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001814 }
1815 break;
1816
1817 case FOR_ITER:
1818 /* before: [iter]; after: [iter, iter()] *or* [] */
1819 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001820 x = PyIter_Next(v);
1821 if (x != NULL) {
1822 PUSH(x);
1823 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001824 }
Tim Petersf4848da2001-05-05 00:14:56 +00001825 if (!PyErr_Occurred()) {
1826 /* iterator ended normally */
1827 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001828 Py_DECREF(v);
1829 JUMPBY(oparg);
1830 continue;
1831 }
1832 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001833
Guido van Rossum374a9221991-04-04 10:40:29 +00001834 case FOR_LOOP:
1835 /* for v in s: ...
1836 On entry: stack contains s, i.
1837 On exit: stack contains s, i+1, s[i];
1838 but if loop exhausted:
1839 s, i are popped, and we jump */
1840 w = POP(); /* Loop index */
1841 v = POP(); /* Sequence object */
1842 u = loop_subscript(v, w);
1843 if (u != NULL) {
1844 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001849 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 }
1851 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 Py_DECREF(v);
1853 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 /* A NULL can mean "s exhausted"
1855 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001858 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001860 continue;
1861 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 }
1863 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001864
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 case SETUP_LOOP:
1866 case SETUP_EXCEPT:
1867 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001869 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001870 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001871
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001873#ifdef LLTRACE
1874 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001875 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001876#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001877 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001878 if (f->f_trace == NULL)
1879 continue;
1880 /* Trace each line of code reached */
1881 f->f_lasti = INSTR_OFFSET();
1882 err = call_trace(&f->f_trace, &f->f_trace,
Fred Draked0838392001-06-16 21:02:31 +00001883 f, str_line, Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001885
1886 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001887 {
1888 int na = oparg & 0xff;
1889 int nk = (oparg>>8) & 0xff;
1890 int n = na + 2 * nk;
1891 PyObject **pfunc = stack_pointer - n - 1;
1892 PyObject *func = *pfunc;
1893 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1894
1895 /* Always dispatch PyCFunction first, because
1896 these are presumed to be the most frequent
1897 callable object.
1898 */
1899 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001900 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001901 if (flags > 1 || nk != 0)
1902 x = do_call(func, &stack_pointer,
1903 na, nk);
1904 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001905 PyObject *callargs;
1906 callargs = load_args(&stack_pointer, na);
1907 x = call_cfunction(func, callargs, NULL);
1908 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001909 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001910 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001911 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001912 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001913 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001914 && PyMethod_GET_SELF(func) != NULL) {
1915 /* optimize access to bound methods */
1916 PyObject *self = PyMethod_GET_SELF(func);
1917 Py_INCREF(self);
1918 func = PyMethod_GET_FUNCTION(func);
1919 Py_INCREF(func);
1920 Py_DECREF(*pfunc);
1921 *pfunc = self;
1922 na++;
1923 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001924 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001925 Py_INCREF(func);
1926 if (PyFunction_Check(func)) {
1927 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001928 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001929 } else {
1930 x = do_call(func, &stack_pointer,
1931 na, nk);
1932 }
1933 Py_DECREF(func);
1934 }
1935
1936 while (stack_pointer > pfunc) {
1937 w = POP();
1938 Py_DECREF(w);
1939 }
1940 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001941 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001942 continue;
1943 break;
1944 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001945
Jeremy Hylton76901512000-03-28 23:49:17 +00001946 case CALL_FUNCTION_VAR:
1947 case CALL_FUNCTION_KW:
1948 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001949 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001950 int na = oparg & 0xff;
1951 int nk = (oparg>>8) & 0xff;
1952 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001953 int n = na + 2 * nk;
1954 PyObject **pfunc, *func;
1955 if (flags & CALL_FLAG_VAR)
1956 n++;
1957 if (flags & CALL_FLAG_KW)
1958 n++;
1959 pfunc = stack_pointer - n - 1;
1960 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001961 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001962
Guido van Rossumac7be682001-01-17 15:42:30 +00001963 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001964 && PyMethod_GET_SELF(func) != NULL) {
1965 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001966 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001967 func = PyMethod_GET_FUNCTION(func);
1968 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001969 Py_DECREF(*pfunc);
1970 *pfunc = self;
1971 na++;
1972 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001973 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001974 Py_INCREF(func);
1975 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001976 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001977
Jeremy Hylton76901512000-03-28 23:49:17 +00001978 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 w = POP();
1980 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001981 }
1982 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001983 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001984 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001985 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001986 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001987
Guido van Rossum681d79a1995-07-18 14:51:37 +00001988 case MAKE_FUNCTION:
1989 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001990 x = PyFunction_New(v, f->f_globals);
1991 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001992 /* XXX Maybe this should be a separate opcode? */
1993 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001995 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001996 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001997 x = NULL;
1998 break;
1999 }
2000 while (--oparg >= 0) {
2001 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002002 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002003 }
2004 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002005 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002006 }
2007 PUSH(x);
2008 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002009
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002010 case MAKE_CLOSURE:
2011 {
2012 int nfree;
2013 v = POP(); /* code object */
2014 x = PyFunction_New(v, f->f_globals);
2015 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2016 Py_DECREF(v);
2017 /* XXX Maybe this should be a separate opcode? */
2018 if (x != NULL && nfree > 0) {
2019 v = PyTuple_New(nfree);
2020 if (v == NULL) {
2021 Py_DECREF(x);
2022 x = NULL;
2023 break;
2024 }
2025 while (--nfree >= 0) {
2026 w = POP();
2027 PyTuple_SET_ITEM(v, nfree, w);
2028 }
2029 err = PyFunction_SetClosure(x, v);
2030 Py_DECREF(v);
2031 }
2032 if (x != NULL && oparg > 0) {
2033 v = PyTuple_New(oparg);
2034 if (v == NULL) {
2035 Py_DECREF(x);
2036 x = NULL;
2037 break;
2038 }
2039 while (--oparg >= 0) {
2040 w = POP();
2041 PyTuple_SET_ITEM(v, oparg, w);
2042 }
2043 err = PyFunction_SetDefaults(x, v);
2044 Py_DECREF(v);
2045 }
2046 PUSH(x);
2047 break;
2048 }
2049
Guido van Rossum8861b741996-07-30 16:49:37 +00002050 case BUILD_SLICE:
2051 if (oparg == 3)
2052 w = POP();
2053 else
2054 w = NULL;
2055 v = POP();
2056 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002057 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 Py_DECREF(u);
2059 Py_DECREF(v);
2060 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002061 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002062 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002063 break;
2064
Fred Drakeef8ace32000-08-24 00:32:09 +00002065 case EXTENDED_ARG:
2066 opcode = NEXTOP();
2067 oparg = oparg<<16 | NEXTARG();
2068 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002069
Guido van Rossum374a9221991-04-04 10:40:29 +00002070 default:
2071 fprintf(stderr,
2072 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002073 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 why = WHY_EXCEPTION;
2076 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002077
2078#ifdef CASE_TOO_BIG
2079 }
2080#endif
2081
Guido van Rossum374a9221991-04-04 10:40:29 +00002082 } /* switch */
2083
2084 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002085
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002087
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002089 if (err == 0 && x != NULL) {
2090#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002091 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002093 fprintf(stderr,
2094 "XXX undetected error\n");
2095 else
2096#endif
2097 continue; /* Normal, fast path */
2098 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002099 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002101 err = 0;
2102 }
2103
Guido van Rossum374a9221991-04-04 10:40:29 +00002104 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002105
Guido van Rossum374a9221991-04-04 10:40:29 +00002106 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002108 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002109 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002110 why = WHY_EXCEPTION;
2111 }
2112 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002113#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002115 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002117 fprintf(stderr,
2118 "XXX undetected error (why=%d)\n",
2119 why);
2120 why = WHY_EXCEPTION;
2121 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 }
2123#endif
2124
2125 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002126
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002128 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002130 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002132
Guido van Rossume59214e1994-08-30 08:01:59 +00002133 if (f->f_trace)
2134 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002135 if (tstate->sys_profilefunc)
2136 call_exc_trace(&tstate->sys_profilefunc,
2137 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002138 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002139
Guido van Rossum374a9221991-04-04 10:40:29 +00002140 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002141
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 if (why == WHY_RERAISE)
2143 why = WHY_EXCEPTION;
2144
2145 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002146
Tim Peters5ca576e2001-06-18 22:08:13 +00002147 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002149
2150 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2151 /* For a continue inside a try block,
2152 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002153 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002154 b->b_handler);
2155 why = WHY_NOT;
2156 JUMPTO(PyInt_AS_LONG(retval));
2157 Py_DECREF(retval);
2158 break;
2159 }
2160
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 while (STACK_LEVEL() > b->b_level) {
2162 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 }
2165 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2166 why = WHY_NOT;
2167 JUMPTO(b->b_handler);
2168 break;
2169 }
2170 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002171 (b->b_type == SETUP_EXCEPT &&
2172 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 PyObject *exc, *val, *tb;
2175 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002176 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 val = Py_None;
2178 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 /* Make the raw exception data
2181 available to the handler,
2182 so a program can emulate the
2183 Python main loop. Don't do
2184 this for 'finally'. */
2185 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002186 PyErr_NormalizeException(
2187 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002188 set_exc_info(tstate,
2189 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002191 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 PUSH(val);
2193 PUSH(exc);
2194 }
2195 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002196 if (why == WHY_RETURN ||
2197 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002198 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002200 PUSH(v);
2201 }
2202 why = WHY_NOT;
2203 JUMPTO(b->b_handler);
2204 break;
2205 }
2206 } /* unwind stack */
2207
2208 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002209
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 if (why != WHY_NOT)
2211 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002212
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002214
Tim Peters5ca576e2001-06-18 22:08:13 +00002215 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002216 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002217
Guido van Rossume59214e1994-08-30 08:01:59 +00002218 if (f->f_trace) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002219 if (why == WHY_RETURN || why == WHY_YIELD) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002220 if (call_trace(&f->f_trace, &f->f_trace, f,
Fred Draked0838392001-06-16 21:02:31 +00002221 str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002223 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002224 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002225 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002226 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002227 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002228
Tim Peters5ca576e2001-06-18 22:08:13 +00002229 if (tstate->sys_profilefunc &&
2230 (why == WHY_RETURN || why == WHY_YIELD)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002231 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Fred Draked0838392001-06-16 21:02:31 +00002232 f, str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002234 retval = NULL;
2235 why = WHY_EXCEPTION;
2236 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002237 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002238
Guido van Rossuma027efa1997-05-05 20:56:21 +00002239 reset_exc_info(tstate);
2240
Tim Peters5ca576e2001-06-18 22:08:13 +00002241 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002242 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002243 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002244
Guido van Rossum96a42c81992-01-12 02:29:51 +00002245 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002246}
2247
Tim Peters5ca576e2001-06-18 22:08:13 +00002248static PyObject *
2249eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2250 PyObject **args, int argcount, PyObject **kws, int kwcount,
2251 PyObject **defs, int defcount, PyObject *closure)
2252{
2253 register PyFrameObject *f;
2254 register PyObject *retval = NULL;
2255 register PyObject **fastlocals, **freevars;
2256 PyThreadState *tstate = PyThreadState_GET();
2257 PyObject *x, *u;
2258
2259 if (globals == NULL) {
2260 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2261 return NULL;
2262 }
2263
2264 f = PyFrame_New(tstate, /*back*/
2265 co, /*code*/
2266 globals, locals);
2267 if (f == NULL)
2268 return NULL;
2269
2270 fastlocals = f->f_localsplus;
2271 freevars = f->f_localsplus + f->f_nlocals;
2272
2273 if (co->co_argcount > 0 ||
2274 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2275 int i;
2276 int n = argcount;
2277 PyObject *kwdict = NULL;
2278 if (co->co_flags & CO_VARKEYWORDS) {
2279 kwdict = PyDict_New();
2280 if (kwdict == NULL)
2281 goto fail;
2282 i = co->co_argcount;
2283 if (co->co_flags & CO_VARARGS)
2284 i++;
2285 SETLOCAL(i, kwdict);
2286 }
2287 if (argcount > co->co_argcount) {
2288 if (!(co->co_flags & CO_VARARGS)) {
2289 PyErr_Format(PyExc_TypeError,
2290 "%.200s() takes %s %d "
2291 "%sargument%s (%d given)",
2292 PyString_AsString(co->co_name),
2293 defcount ? "at most" : "exactly",
2294 co->co_argcount,
2295 kwcount ? "non-keyword " : "",
2296 co->co_argcount == 1 ? "" : "s",
2297 argcount);
2298 goto fail;
2299 }
2300 n = co->co_argcount;
2301 }
2302 for (i = 0; i < n; i++) {
2303 x = args[i];
2304 Py_INCREF(x);
2305 SETLOCAL(i, x);
2306 }
2307 if (co->co_flags & CO_VARARGS) {
2308 u = PyTuple_New(argcount - n);
2309 if (u == NULL)
2310 goto fail;
2311 SETLOCAL(co->co_argcount, u);
2312 for (i = n; i < argcount; i++) {
2313 x = args[i];
2314 Py_INCREF(x);
2315 PyTuple_SET_ITEM(u, i-n, x);
2316 }
2317 }
2318 for (i = 0; i < kwcount; i++) {
2319 PyObject *keyword = kws[2*i];
2320 PyObject *value = kws[2*i + 1];
2321 int j;
2322 if (keyword == NULL || !PyString_Check(keyword)) {
2323 PyErr_Format(PyExc_TypeError,
2324 "%.200s() keywords must be strings",
2325 PyString_AsString(co->co_name));
2326 goto fail;
2327 }
2328 /* XXX slow -- speed up using dictionary? */
2329 for (j = 0; j < co->co_argcount; j++) {
2330 PyObject *nm = PyTuple_GET_ITEM(
2331 co->co_varnames, j);
2332 int cmp = PyObject_RichCompareBool(
2333 keyword, nm, Py_EQ);
2334 if (cmp > 0)
2335 break;
2336 else if (cmp < 0)
2337 goto fail;
2338 }
2339 /* Check errors from Compare */
2340 if (PyErr_Occurred())
2341 goto fail;
2342 if (j >= co->co_argcount) {
2343 if (kwdict == NULL) {
2344 PyErr_Format(PyExc_TypeError,
2345 "%.200s() got an unexpected "
2346 "keyword argument '%.400s'",
2347 PyString_AsString(co->co_name),
2348 PyString_AsString(keyword));
2349 goto fail;
2350 }
2351 PyDict_SetItem(kwdict, keyword, value);
2352 }
2353 else {
2354 if (GETLOCAL(j) != NULL) {
2355 PyErr_Format(PyExc_TypeError,
2356 "%.200s() got multiple "
2357 "values for keyword "
2358 "argument '%.400s'",
2359 PyString_AsString(co->co_name),
2360 PyString_AsString(keyword));
2361 goto fail;
2362 }
2363 Py_INCREF(value);
2364 SETLOCAL(j, value);
2365 }
2366 }
2367 if (argcount < co->co_argcount) {
2368 int m = co->co_argcount - defcount;
2369 for (i = argcount; i < m; i++) {
2370 if (GETLOCAL(i) == NULL) {
2371 PyErr_Format(PyExc_TypeError,
2372 "%.200s() takes %s %d "
2373 "%sargument%s (%d given)",
2374 PyString_AsString(co->co_name),
2375 ((co->co_flags & CO_VARARGS) ||
2376 defcount) ? "at least"
2377 : "exactly",
2378 m, kwcount ? "non-keyword " : "",
2379 m == 1 ? "" : "s", i);
2380 goto fail;
2381 }
2382 }
2383 if (n > m)
2384 i = n - m;
2385 else
2386 i = 0;
2387 for (; i < defcount; i++) {
2388 if (GETLOCAL(m+i) == NULL) {
2389 PyObject *def = defs[i];
2390 Py_INCREF(def);
2391 SETLOCAL(m+i, def);
2392 }
2393 }
2394 }
2395 }
2396 else {
2397 if (argcount > 0 || kwcount > 0) {
2398 PyErr_Format(PyExc_TypeError,
2399 "%.200s() takes no arguments (%d given)",
2400 PyString_AsString(co->co_name),
2401 argcount + kwcount);
2402 goto fail;
2403 }
2404 }
2405 /* Allocate and initialize storage for cell vars, and copy free
2406 vars into frame. This isn't too efficient right now. */
2407 if (f->f_ncells) {
2408 int i = 0, j = 0, nargs, found;
2409 char *cellname, *argname;
2410 PyObject *c;
2411
2412 nargs = co->co_argcount;
2413 if (co->co_flags & CO_VARARGS)
2414 nargs++;
2415 if (co->co_flags & CO_VARKEYWORDS)
2416 nargs++;
2417
2418 /* Check for cells that shadow args */
2419 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2420 cellname = PyString_AS_STRING(
2421 PyTuple_GET_ITEM(co->co_cellvars, i));
2422 found = 0;
2423 while (j < nargs) {
2424 argname = PyString_AS_STRING(
2425 PyTuple_GET_ITEM(co->co_varnames, j));
2426 if (strcmp(cellname, argname) == 0) {
2427 c = PyCell_New(GETLOCAL(j));
2428 if (c == NULL)
2429 goto fail;
2430 GETLOCAL(f->f_nlocals + i) = c;
2431 found = 1;
2432 break;
2433 }
2434 j++;
2435 }
2436 if (found == 0) {
2437 c = PyCell_New(NULL);
2438 if (c == NULL)
2439 goto fail;
2440 SETLOCAL(f->f_nlocals + i, c);
2441 }
2442 }
2443 /* Initialize any that are left */
2444 while (i < f->f_ncells) {
2445 c = PyCell_New(NULL);
2446 if (c == NULL)
2447 goto fail;
2448 SETLOCAL(f->f_nlocals + i, c);
2449 i++;
2450 }
2451 }
2452 if (f->f_nfreevars) {
2453 int i;
2454 for (i = 0; i < f->f_nfreevars; ++i) {
2455 PyObject *o = PyTuple_GET_ITEM(closure, i);
2456 Py_INCREF(o);
2457 freevars[f->f_ncells + i] = o;
2458 }
2459 }
2460
2461 if (tstate->sys_tracefunc != NULL) {
2462 /* tstate->sys_tracefunc, if defined, is a function that
2463 will be called on *every* entry to a code block.
2464 Its return value, if not None, is a function that
2465 will be called at the start of each executed line
2466 of code. (Actually, the function must return
2467 itself in order to continue tracing.)
2468 The trace functions are called with three arguments:
2469 a pointer to the current frame, a string indicating
2470 why the function is called, and an argument which
2471 depends on the situation. The global trace function
2472 (sys.trace) is also called whenever an exception
2473 is detected. */
2474 if (call_trace(&tstate->sys_tracefunc,
2475 &f->f_trace, f, str_call,
2476 Py_None/*XXX how to compute arguments now?*/)) {
2477 /* Trace function raised an error */
2478 goto fail;
2479 }
2480 }
2481
2482 if (tstate->sys_profilefunc != NULL) {
2483 /* Similar for sys_profilefunc, except it needn't return
2484 itself and isn't called for "line" events */
2485 if (call_trace(&tstate->sys_profilefunc,
2486 (PyObject**)0, f, str_call,
2487 Py_None/*XXX*/)) {
2488 goto fail;
2489 }
2490 }
2491
2492 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002493 /* Don't need to keep the reference to f_back, it will be set
2494 * when the generator is resumed. */
2495 Py_DECREF(f->f_back);
2496 f->f_back = NULL;
2497
2498 /* Create a new generator that owns the ready to run frame
2499 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002500 return gen_new(f);
2501 }
2502
2503 retval = eval_frame(f);
2504
2505 fail: /* Jump here from prelude on failure */
2506
2507 Py_DECREF(f);
2508 return retval;
2509}
2510
2511
Guido van Rossuma027efa1997-05-05 20:56:21 +00002512static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002513set_exc_info(PyThreadState *tstate,
2514 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002515{
2516 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002517 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002518
Guido van Rossuma027efa1997-05-05 20:56:21 +00002519 frame = tstate->frame;
2520 if (frame->f_exc_type == NULL) {
2521 /* This frame didn't catch an exception before */
2522 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002523 if (tstate->exc_type == NULL) {
2524 Py_INCREF(Py_None);
2525 tstate->exc_type = Py_None;
2526 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002527 tmp_type = frame->f_exc_type;
2528 tmp_value = frame->f_exc_value;
2529 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002530 Py_XINCREF(tstate->exc_type);
2531 Py_XINCREF(tstate->exc_value);
2532 Py_XINCREF(tstate->exc_traceback);
2533 frame->f_exc_type = tstate->exc_type;
2534 frame->f_exc_value = tstate->exc_value;
2535 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002536 Py_XDECREF(tmp_type);
2537 Py_XDECREF(tmp_value);
2538 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002539 }
2540 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002541 tmp_type = tstate->exc_type;
2542 tmp_value = tstate->exc_value;
2543 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002544 Py_XINCREF(type);
2545 Py_XINCREF(value);
2546 Py_XINCREF(tb);
2547 tstate->exc_type = type;
2548 tstate->exc_value = value;
2549 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002550 Py_XDECREF(tmp_type);
2551 Py_XDECREF(tmp_value);
2552 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553 /* For b/w compatibility */
2554 PySys_SetObject("exc_type", type);
2555 PySys_SetObject("exc_value", value);
2556 PySys_SetObject("exc_traceback", tb);
2557}
2558
2559static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002560reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002561{
2562 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002563 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002564 frame = tstate->frame;
2565 if (frame->f_exc_type != NULL) {
2566 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002567 tmp_type = tstate->exc_type;
2568 tmp_value = tstate->exc_value;
2569 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 Py_XINCREF(frame->f_exc_type);
2571 Py_XINCREF(frame->f_exc_value);
2572 Py_XINCREF(frame->f_exc_traceback);
2573 tstate->exc_type = frame->f_exc_type;
2574 tstate->exc_value = frame->f_exc_value;
2575 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002576 Py_XDECREF(tmp_type);
2577 Py_XDECREF(tmp_value);
2578 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002579 /* For b/w compatibility */
2580 PySys_SetObject("exc_type", frame->f_exc_type);
2581 PySys_SetObject("exc_value", frame->f_exc_value);
2582 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2583 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002584 tmp_type = frame->f_exc_type;
2585 tmp_value = frame->f_exc_value;
2586 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002587 frame->f_exc_type = NULL;
2588 frame->f_exc_value = NULL;
2589 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002590 Py_XDECREF(tmp_type);
2591 Py_XDECREF(tmp_value);
2592 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002593}
2594
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002595/* Logic for the raise statement (too complicated for inlining).
2596 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002597static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002598do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002599{
Guido van Rossumd295f121998-04-09 21:39:57 +00002600 if (type == NULL) {
2601 /* Reraise */
2602 PyThreadState *tstate = PyThreadState_Get();
2603 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2604 value = tstate->exc_value;
2605 tb = tstate->exc_traceback;
2606 Py_XINCREF(type);
2607 Py_XINCREF(value);
2608 Py_XINCREF(tb);
2609 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002610
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002611 /* We support the following forms of raise:
2612 raise <class>, <classinstance>
2613 raise <class>, <argument tuple>
2614 raise <class>, None
2615 raise <class>, <argument>
2616 raise <classinstance>, None
2617 raise <string>, <object>
2618 raise <string>, None
2619
2620 An omitted second argument is the same as None.
2621
2622 In addition, raise <tuple>, <anything> is the same as
2623 raising the tuple's first item (and it better have one!);
2624 this rule is applied recursively.
2625
2626 Finally, an optional third argument can be supplied, which
2627 gives the traceback to be substituted (useful when
2628 re-raising an exception after examining it). */
2629
2630 /* First, check the traceback argument, replacing None with
2631 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 if (tb == Py_None) {
2633 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002634 tb = NULL;
2635 }
2636 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002637 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002638 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002639 goto raise_error;
2640 }
2641
2642 /* Next, replace a missing value with None */
2643 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002644 value = Py_None;
2645 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002646 }
2647
2648 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2650 PyObject *tmp = type;
2651 type = PyTuple_GET_ITEM(type, 0);
2652 Py_INCREF(type);
2653 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002654 }
2655
Barry Warsaw4249f541997-08-22 21:26:19 +00002656 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002657 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002658
2659 else if (PyClass_Check(type))
2660 PyErr_NormalizeException(&type, &value, &tb);
2661
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002663 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 if (value != Py_None) {
2665 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002666 "instance exception may not have a separate value");
2667 goto raise_error;
2668 }
2669 else {
2670 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002672 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2674 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002675 }
2676 }
2677 else {
2678 /* Not something you can raise. You get an exception
2679 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002680 PyErr_Format(PyExc_TypeError,
2681 "exceptions must be strings, classes, or "
2682 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002683 goto raise_error;
2684 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 if (tb == NULL)
2687 return WHY_EXCEPTION;
2688 else
2689 return WHY_RERAISE;
2690 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 Py_XDECREF(value);
2692 Py_XDECREF(type);
2693 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002694 return WHY_EXCEPTION;
2695}
2696
Tim Petersd6d010b2001-06-21 02:49:55 +00002697/* Iterate v argcnt times and store the results on the stack (via decreasing
2698 sp). Return 1 for success, 0 if error. */
2699
Barry Warsawe42b18f1997-08-25 22:13:04 +00002700static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002701unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002702{
Tim Petersd6d010b2001-06-21 02:49:55 +00002703 int i = 0;
2704 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002705 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002706
Tim Petersd6d010b2001-06-21 02:49:55 +00002707 assert(v != NULL);
2708
2709 it = PyObject_GetIter(v);
2710 if (it == NULL)
2711 goto Error;
2712
2713 for (; i < argcnt; i++) {
2714 w = PyIter_Next(it);
2715 if (w == NULL) {
2716 /* Iterator done, via error or exhaustion. */
2717 if (!PyErr_Occurred()) {
2718 PyErr_Format(PyExc_ValueError,
2719 "need more than %d value%s to unpack",
2720 i, i == 1 ? "" : "s");
2721 }
2722 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002723 }
2724 *--sp = w;
2725 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002726
2727 /* We better have exhausted the iterator now. */
2728 w = PyIter_Next(it);
2729 if (w == NULL) {
2730 if (PyErr_Occurred())
2731 goto Error;
2732 Py_DECREF(it);
2733 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002734 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002735 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002736 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002737Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002738 for (; i > 0; i--, sp++)
2739 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002740 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002741 return 0;
2742}
2743
2744
Guido van Rossum96a42c81992-01-12 02:29:51 +00002745#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002746static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002747prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002748{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002749 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 if (PyObject_Print(v, stdout, 0) != 0)
2751 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002752 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002753 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002755#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002757static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002758call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002759{
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002761 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002763 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 value = Py_None;
2765 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002766 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002768 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002769 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002770 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002771 }
Fred Draked0838392001-06-16 21:02:31 +00002772 err = call_trace(p_trace, p_newtrace, f, str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002773 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002774 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002776 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002777 Py_XDECREF(type);
2778 Py_XDECREF(value);
2779 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002780 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002781}
2782
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002783/* PyObject **p_trace: in/out; may not be NULL;
2784 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002785 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002786 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002787 may be same variable as p_newtrace
Fred Draked0838392001-06-16 21:02:31 +00002788 PyObject *msg: in; must not be NULL
Fred Drake904aa7b2001-06-08 04:33:09 +00002789*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002790
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002791static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002792call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Draked0838392001-06-16 21:02:31 +00002793 PyObject *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002794{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002795 PyThreadState *tstate = f->f_tstate;
Fred Draked0838392001-06-16 21:02:31 +00002796 PyObject *args;
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002798
Guido van Rossuma027efa1997-05-05 20:56:21 +00002799 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002800 /* Don't do recursive traces */
2801 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002802 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002803 *p_newtrace = NULL;
2804 }
2805 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002806 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002807
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002809 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002810 goto cleanup;
Fred Draked0838392001-06-16 21:02:31 +00002811 Py_INCREF(msg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 Py_INCREF(f);
2813 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
Fred Draked0838392001-06-16 21:02:31 +00002814 PyTuple_SET_ITEM(args, 1, msg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002815 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 arg = Py_None;
2817 Py_INCREF(arg);
2818 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002819 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 PyFrame_FastToLocals(f);
2821 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2822 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002823 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002824 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002826 if (res == NULL) {
2827 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 PyTraceBack_Here(f);
2829 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002830 *p_trace = NULL;
2831 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002833 *p_newtrace = NULL;
2834 }
Barry Warsawf6202631999-09-08 16:26:33 +00002835 /* to be extra double plus sure we don't get recursive
2836 * calls inf either tracefunc or profilefunc gets an
2837 * exception, zap the global variables.
2838 */
2839 Py_XDECREF(tstate->sys_tracefunc);
2840 tstate->sys_tracefunc = NULL;
2841 Py_XDECREF(tstate->sys_profilefunc);
2842 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002843 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002844 }
2845 else {
2846 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002847 Py_XDECREF(*p_newtrace);
2848 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002849 *p_newtrace = NULL;
2850 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002851 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002852 *p_newtrace = res;
2853 }
2854 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002855 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002856 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002857 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002858}
2859
Fred Draked0838392001-06-16 21:02:31 +00002860/* Initialize the strings that get passed to the profile and trace functions;
2861 * this avoids doing this while we're actually profiling/tracing.
2862 */
2863int
2864_PyTrace_Init(void)
2865{
2866 if (str_call == NULL) {
2867 str_call = PyString_InternFromString("call");
2868 if (str_call == NULL)
2869 return -1;
2870 }
2871 if (str_exception == NULL) {
2872 str_exception = PyString_InternFromString("exception");
2873 if (str_exception == NULL)
2874 return -1;
2875 }
2876 if (str_line == NULL) {
2877 str_line = PyString_InternFromString("line");
2878 if (str_line == NULL)
2879 return -1;
2880 }
2881 if (str_return == NULL) {
2882 str_return = PyString_InternFromString("return");
2883 if (str_return == NULL)
2884 return -1;
2885 }
2886 return 0;
2887}
2888
Guido van Rossumb209a111997-04-29 18:18:01 +00002889PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002890PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002891{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002892 PyThreadState *tstate = PyThreadState_Get();
2893 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002894 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002895 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002896 else
2897 return current_frame->f_builtins;
2898}
2899
Guido van Rossumb209a111997-04-29 18:18:01 +00002900PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002901PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002902{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002903 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002904 if (current_frame == NULL)
2905 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002906 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002907 return current_frame->f_locals;
2908}
2909
Guido van Rossumb209a111997-04-29 18:18:01 +00002910PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002912{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002913 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002914 if (current_frame == NULL)
2915 return NULL;
2916 else
2917 return current_frame->f_globals;
2918}
2919
Guido van Rossumb209a111997-04-29 18:18:01 +00002920PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002921PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002922{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002923 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002924 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002925}
2926
Guido van Rossum6135a871995-01-09 17:53:26 +00002927int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002928PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002929{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002930 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002931 return current_frame == NULL ? 0 : current_frame->f_restricted;
2932}
2933
Guido van Rossumbe270261997-05-22 22:26:18 +00002934int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002935PyEval_GetNestedScopes(void)
2936{
2937 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2938 return current_frame == NULL ? 0 :
2939 current_frame->f_code->co_flags & CO_NESTED;
2940}
2941
2942int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002943Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944{
Guido van Rossumb209a111997-04-29 18:18:01 +00002945 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002946 if (f == NULL)
2947 return 0;
2948 if (!PyFile_SoftSpace(f, 0))
2949 return 0;
2950 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951}
2952
Guido van Rossum3f5da241990-12-20 15:06:42 +00002953
Guido van Rossum681d79a1995-07-18 14:51:37 +00002954/* External interface to call any callable object.
2955 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002956
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002957#undef PyEval_CallObject
2958/* for backward compatibility: export this interface */
2959
Guido van Rossumb209a111997-04-29 18:18:01 +00002960PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002961PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002962{
Guido van Rossumb209a111997-04-29 18:18:01 +00002963 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002964}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002965#define PyEval_CallObject(func,arg) \
2966 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002967
Guido van Rossumb209a111997-04-29 18:18:01 +00002968PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002969PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002970{
Jeremy Hylton52820442001-01-03 23:52:36 +00002971 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002972
2973 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002974 arg = PyTuple_New(0);
2975 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002976 PyErr_SetString(PyExc_TypeError,
2977 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002978 return NULL;
2979 }
2980 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002981 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002982
Guido van Rossumb209a111997-04-29 18:18:01 +00002983 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002984 PyErr_SetString(PyExc_TypeError,
2985 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002986 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002987 return NULL;
2988 }
2989
Jeremy Hylton52820442001-01-03 23:52:36 +00002990 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002991 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002992 return result;
2993}
2994
2995/* How often is each kind of object called? The answer depends on the
2996 program. An instrumented call_object() was used to run the Python
2997 regression test suite. The results were:
2998 4200000 PyCFunctions
2999 390000 fast_function() calls
3000 94000 other functions
3001 480000 all functions (sum of prev two)
3002 150000 methods
3003 100000 classes
3004
3005 Tests on other bodies of code show that PyCFunctions are still
3006 most common, but not by such a large margin.
3007*/
3008
Jeremy Hylton512a2372001-04-11 13:52:29 +00003009static char *
3010get_func_name(PyObject *func)
3011{
3012 if (PyMethod_Check(func))
3013 return get_func_name(PyMethod_GET_FUNCTION(func));
3014 else if (PyFunction_Check(func))
3015 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3016 else if (PyCFunction_Check(func))
3017 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3018 else if (PyClass_Check(func))
3019 return PyString_AsString(((PyClassObject*)func)->cl_name);
3020 else if (PyInstance_Check(func)) {
3021 return PyString_AsString(
3022 ((PyInstanceObject*)func)->in_class->cl_name);
3023 } else {
3024 return func->ob_type->tp_name;
3025 }
3026}
3027
3028static char *
3029get_func_desc(PyObject *func)
3030{
3031 if (PyMethod_Check(func))
3032 return "()";
3033 else if (PyFunction_Check(func))
3034 return "()";
3035 else if (PyCFunction_Check(func))
3036 return "()";
3037 else if (PyClass_Check(func))
3038 return " constructor";
3039 else if (PyInstance_Check(func)) {
3040 return " instance";
3041 } else {
3042 return " object";
3043 }
3044}
3045
Jeremy Hylton52820442001-01-03 23:52:36 +00003046static PyObject *
3047call_object(PyObject *func, PyObject *arg, PyObject *kw)
3048{
3049 ternaryfunc call;
3050 PyObject *result;
3051
3052 if (PyMethod_Check(func))
3053 result = call_method(func, arg, kw);
3054 else if (PyFunction_Check(func))
3055 result = call_eval_code2(func, arg, kw);
3056 else if (PyCFunction_Check(func))
3057 result = call_cfunction(func, arg, kw);
3058 else if (PyClass_Check(func))
3059 result = PyInstance_New(func, arg, kw);
3060 else if (PyInstance_Check(func))
3061 result = call_instance(func, arg, kw);
3062 else if ((call = func->ob_type->tp_call) != NULL)
3063 result = (*call)(func, arg, kw);
3064 else {
Tim Peters239508c2001-06-16 00:09:28 +00003065 PyErr_Format(PyExc_TypeError,
3066 "object of type '%.100s' is not callable",
3067 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003068 return NULL;
3069 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003070 if (result == NULL && !PyErr_Occurred())
3071 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003072 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003073
Guido van Rossume59214e1994-08-30 08:01:59 +00003074 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003075}
3076
Guido van Rossumb209a111997-04-29 18:18:01 +00003077static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003078call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079{
Jeremy Hylton52820442001-01-03 23:52:36 +00003080 PyCFunctionObject* f = (PyCFunctionObject*)func;
3081 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3082 PyObject *self = PyCFunction_GET_SELF(func);
3083 int flags = PyCFunction_GET_FLAGS(func);
3084
Jeremy Hylton52820442001-01-03 23:52:36 +00003085 if (flags & METH_KEYWORDS) {
3086 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003088 if (kw != NULL && PyDict_Size(kw) != 0) {
3089 PyErr_Format(PyExc_TypeError,
3090 "%.200s() takes no keyword arguments",
3091 f->m_ml->ml_name);
3092 return NULL;
3093 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003094 if (flags & METH_VARARGS) {
3095 return (*meth)(self, arg);
3096 }
3097 if (!(flags & METH_VARARGS)) {
3098 /* the really old style */
3099 int size = PyTuple_GET_SIZE(arg);
3100 if (size == 1)
3101 arg = PyTuple_GET_ITEM(arg, 0);
3102 else if (size == 0)
3103 arg = NULL;
3104 return (*meth)(self, arg);
3105 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003106 /* should never get here ??? */
3107 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108 return NULL;
3109}
3110
Guido van Rossumb209a111997-04-29 18:18:01 +00003111static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003112call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113{
Jeremy Hylton52820442001-01-03 23:52:36 +00003114 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3115 if (call == NULL) {
3116 PyInstanceObject *inst = (PyInstanceObject*) func;
3117 PyErr_Clear();
3118 PyErr_Format(PyExc_AttributeError,
3119 "%.200s instance has no __call__ method",
3120 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003121 return NULL;
3122 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003123 res = call_object(call, arg, kw);
3124 Py_DECREF(call);
3125 return res;
3126}
3127
3128static PyObject *
3129call_method(PyObject *func, PyObject *arg, PyObject *kw)
3130{
3131 PyObject *self = PyMethod_GET_SELF(func);
3132 PyObject *class = PyMethod_GET_CLASS(func);
3133 PyObject *result;
3134
3135 func = PyMethod_GET_FUNCTION(func);
3136 if (self == NULL) {
3137 /* Unbound methods must be called with an instance of
3138 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003139 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003140 if (PyTuple_Size(arg) >= 1)
3141 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003142 if (self == NULL)
3143 ok = 0;
3144 else {
3145 ok = PyObject_IsInstance(self, class);
3146 if (ok < 0)
3147 return NULL;
3148 }
3149 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003150 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003151 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003152 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003153 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 return NULL;
3155 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003156 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003157 }
3158 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003159 int argcount = PyTuple_Size(arg);
3160 PyObject *newarg = PyTuple_New(argcount + 1);
3161 int i;
3162 if (newarg == NULL)
3163 return NULL;
3164 Py_INCREF(self);
3165 PyTuple_SET_ITEM(newarg, 0, self);
3166 for (i = 0; i < argcount; i++) {
3167 PyObject *v = PyTuple_GET_ITEM(arg, i);
3168 Py_XINCREF(v);
3169 PyTuple_SET_ITEM(newarg, i+1, v);
3170 }
3171 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003173 result = call_object(func, arg, kw);
3174 Py_DECREF(arg);
3175 return result;
3176}
3177
3178static PyObject *
3179call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3180{
3181 PyObject *result;
3182 PyObject *argdefs;
3183 PyObject **d, **k;
3184 int nk, nd;
3185
3186 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003187 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3188 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3189 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003190 }
3191 else {
3192 d = NULL;
3193 nd = 0;
3194 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003195
Guido van Rossum681d79a1995-07-18 14:51:37 +00003196 if (kw != NULL) {
3197 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003198 nk = PyDict_Size(kw);
3199 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003200 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003201 PyErr_NoMemory();
3202 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003203 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003204 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003205 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003206 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 i += 2;
3208 nk = i/2;
3209 /* XXX This is broken if the caller deletes dict items! */
3210 }
3211 else {
3212 k = NULL;
3213 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003214 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003215
Guido van Rossum681d79a1995-07-18 14:51:37 +00003216 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003217 (PyCodeObject *)PyFunction_GET_CODE(func),
3218 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003219 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003220 k, nk, d, nd,
3221 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003222
Guido van Rossumb18618d2000-05-03 23:44:39 +00003223 if (k != NULL)
3224 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003225
Guido van Rossum681d79a1995-07-18 14:51:37 +00003226 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227}
3228
Jeremy Hylton52820442001-01-03 23:52:36 +00003229#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3230
3231/* The two fast_xxx() functions optimize calls for which no argument
3232 tuple is necessary; the objects are passed directly from the stack.
3233 fast_cfunction() is called for METH_OLDARGS functions.
3234 fast_function() is for functions with no special argument handling.
3235*/
3236
3237static PyObject *
3238fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3239{
3240 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3241 PyObject *self = PyCFunction_GET_SELF(func);
3242
3243 if (na == 0)
3244 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003245 else if (na == 1) {
3246 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003247 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003248 Py_DECREF(arg);
3249 return result;
3250 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003251 PyObject *args = load_args(pp_stack, na);
3252 PyObject *result = (*meth)(self, args);
3253 Py_DECREF(args);
3254 return result;
3255 }
3256}
3257
3258static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003259fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003260{
3261 PyObject *co = PyFunction_GET_CODE(func);
3262 PyObject *globals = PyFunction_GET_GLOBALS(func);
3263 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003264 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003265 PyObject **d = NULL;
3266 int nd = 0;
3267
3268 if (argdefs != NULL) {
3269 d = &PyTuple_GET_ITEM(argdefs, 0);
3270 nd = ((PyTupleObject *)argdefs)->ob_size;
3271 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003272 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003273 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003274 (*pp_stack)-2*nk, nk, d, nd,
3275 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003276}
3277
3278static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003279update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3280 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003281{
3282 PyObject *kwdict = NULL;
3283 if (orig_kwdict == NULL)
3284 kwdict = PyDict_New();
3285 else {
3286 kwdict = PyDict_Copy(orig_kwdict);
3287 Py_DECREF(orig_kwdict);
3288 }
3289 if (kwdict == NULL)
3290 return NULL;
3291 while (--nk >= 0) {
3292 int err;
3293 PyObject *value = EXT_POP(*pp_stack);
3294 PyObject *key = EXT_POP(*pp_stack);
3295 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003296 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003297 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003298 "for keyword argument '%.200s'",
3299 get_func_name(func),
3300 get_func_desc(func),
3301 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003302 Py_DECREF(key);
3303 Py_DECREF(value);
3304 Py_DECREF(kwdict);
3305 return NULL;
3306 }
3307 err = PyDict_SetItem(kwdict, key, value);
3308 Py_DECREF(key);
3309 Py_DECREF(value);
3310 if (err) {
3311 Py_DECREF(kwdict);
3312 return NULL;
3313 }
3314 }
3315 return kwdict;
3316}
3317
3318static PyObject *
3319update_star_args(int nstack, int nstar, PyObject *stararg,
3320 PyObject ***pp_stack)
3321{
3322 PyObject *callargs, *w;
3323
3324 callargs = PyTuple_New(nstack + nstar);
3325 if (callargs == NULL) {
3326 return NULL;
3327 }
3328 if (nstar) {
3329 int i;
3330 for (i = 0; i < nstar; i++) {
3331 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3332 Py_INCREF(a);
3333 PyTuple_SET_ITEM(callargs, nstack + i, a);
3334 }
3335 }
3336 while (--nstack >= 0) {
3337 w = EXT_POP(*pp_stack);
3338 PyTuple_SET_ITEM(callargs, nstack, w);
3339 }
3340 return callargs;
3341}
3342
3343static PyObject *
3344load_args(PyObject ***pp_stack, int na)
3345{
3346 PyObject *args = PyTuple_New(na);
3347 PyObject *w;
3348
3349 if (args == NULL)
3350 return NULL;
3351 while (--na >= 0) {
3352 w = EXT_POP(*pp_stack);
3353 PyTuple_SET_ITEM(args, na, w);
3354 }
3355 return args;
3356}
3357
3358static PyObject *
3359do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3360{
3361 PyObject *callargs = NULL;
3362 PyObject *kwdict = NULL;
3363 PyObject *result = NULL;
3364
3365 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003366 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003367 if (kwdict == NULL)
3368 goto call_fail;
3369 }
3370 callargs = load_args(pp_stack, na);
3371 if (callargs == NULL)
3372 goto call_fail;
3373 result = call_object(func, callargs, kwdict);
3374 call_fail:
3375 Py_XDECREF(callargs);
3376 Py_XDECREF(kwdict);
3377 return result;
3378}
3379
3380static PyObject *
3381ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3382{
3383 int nstar = 0;
3384 PyObject *callargs = NULL;
3385 PyObject *stararg = NULL;
3386 PyObject *kwdict = NULL;
3387 PyObject *result = NULL;
3388
3389 if (flags & CALL_FLAG_KW) {
3390 kwdict = EXT_POP(*pp_stack);
3391 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003392 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003393 "%s%s argument after ** "
3394 "must be a dictionary",
3395 get_func_name(func),
3396 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003397 goto ext_call_fail;
3398 }
3399 }
3400 if (flags & CALL_FLAG_VAR) {
3401 stararg = EXT_POP(*pp_stack);
3402 if (!PyTuple_Check(stararg)) {
3403 PyObject *t = NULL;
3404 t = PySequence_Tuple(stararg);
3405 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003406 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3407 PyErr_Format(PyExc_TypeError,
3408 "%s%s argument after * "
3409 "must be a sequence",
3410 get_func_name(func),
3411 get_func_desc(func));
3412 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003413 goto ext_call_fail;
3414 }
3415 Py_DECREF(stararg);
3416 stararg = t;
3417 }
3418 nstar = PyTuple_GET_SIZE(stararg);
3419 }
3420 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003421 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003422 if (kwdict == NULL)
3423 goto ext_call_fail;
3424 }
3425 callargs = update_star_args(na, nstar, stararg, pp_stack);
3426 if (callargs == NULL)
3427 goto ext_call_fail;
3428 result = call_object(func, callargs, kwdict);
3429 ext_call_fail:
3430 Py_XDECREF(callargs);
3431 Py_XDECREF(kwdict);
3432 Py_XDECREF(stararg);
3433 return result;
3434}
3435
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003436#define SLICE_ERROR_MSG \
3437 "standard sequence type does not support step size other than one"
3438
Guido van Rossumb209a111997-04-29 18:18:01 +00003439static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003440loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441{
Guido van Rossumb209a111997-04-29 18:18:01 +00003442 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003443 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003444 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003445 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446 return NULL;
3447 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003448 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003449 v = (*sq->sq_item)(v, i);
3450 if (v)
3451 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003452 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003453 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003454 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455}
3456
Guido van Rossum20c6add2000-05-08 14:06:50 +00003457/* Extract a slice index from a PyInt or PyLong, the index is bound to
3458 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3459 and error. Returns 1 on success.*/
3460
3461int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003462_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463{
3464 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003465 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003466 if (PyInt_Check(v)) {
3467 x = PyInt_AsLong(v);
3468 } else if (PyLong_Check(v)) {
3469 x = PyLong_AsLong(v);
3470 if (x==-1 && PyErr_Occurred()) {
3471 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003472 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003473
Guido van Rossumac7be682001-01-17 15:42:30 +00003474 if (!PyErr_ExceptionMatches(
3475 PyExc_OverflowError)) {
3476 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003477 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003478 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003479 }
3480
Guido van Rossumac7be682001-01-17 15:42:30 +00003481 /* Clear the OverflowError */
3482 PyErr_Clear();
3483
3484 /* It's an overflow error, so we need to
3485 check the sign of the long integer,
3486 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003487 the error. */
3488
3489 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003490 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003491 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003492
3493 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003494 cmp = PyObject_RichCompareBool(v, long_zero,
3495 Py_GT);
3496 Py_DECREF(long_zero);
3497 if (cmp < 0)
3498 return 0;
3499 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003500 x = INT_MAX;
3501 else
3502 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003503 }
3504 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003505 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003506 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003507 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003509 /* Truncate -- very long indices are truncated anyway */
3510 if (x > INT_MAX)
3511 x = INT_MAX;
3512 else if (x < -INT_MAX)
3513 x = 0;
3514 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003516 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517}
3518
Guido van Rossumb209a111997-04-29 18:18:01 +00003519static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003520apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003522 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003523 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003525 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003526 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003527 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003528}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003529
3530static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003531assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3532 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003534 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003535 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003536 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003537 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003538 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003539 if (x == NULL)
3540 return PySequence_DelSlice(u, ilow, ihigh);
3541 else
3542 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003543}
3544
Guido van Rossumb209a111997-04-29 18:18:01 +00003545static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003546cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547{
Guido van Rossumac7be682001-01-17 15:42:30 +00003548 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003549 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003550 case IS:
3551 case IS_NOT:
3552 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003553 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003554 res = !res;
3555 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003556 case IN:
3557 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003558 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003559 if (res < 0)
3560 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003561 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003562 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003563 break;
3564 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003565 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566 break;
3567 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003568 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003569 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003570 v = res ? Py_True : Py_False;
3571 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572 return v;
3573}
3574
Thomas Wouters52152252000-08-17 22:55:00 +00003575static PyObject *
3576import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003577{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003578 PyObject *x;
3579
3580 x = PyObject_GetAttr(v, name);
3581 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003582 PyErr_Format(PyExc_ImportError,
3583 "cannot import name %.230s",
3584 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003585 }
Thomas Wouters52152252000-08-17 22:55:00 +00003586 return x;
3587}
Guido van Rossumac7be682001-01-17 15:42:30 +00003588
Thomas Wouters52152252000-08-17 22:55:00 +00003589static int
3590import_all_from(PyObject *locals, PyObject *v)
3591{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003592 PyObject *all = PyObject_GetAttrString(v, "__all__");
3593 PyObject *dict, *name, *value;
3594 int skip_leading_underscores = 0;
3595 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003596
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003597 if (all == NULL) {
3598 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3599 return -1; /* Unexpected error */
3600 PyErr_Clear();
3601 dict = PyObject_GetAttrString(v, "__dict__");
3602 if (dict == NULL) {
3603 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3604 return -1;
3605 PyErr_SetString(PyExc_ImportError,
3606 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003607 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003608 }
3609 all = PyMapping_Keys(dict);
3610 Py_DECREF(dict);
3611 if (all == NULL)
3612 return -1;
3613 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003614 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003615
3616 for (pos = 0, err = 0; ; pos++) {
3617 name = PySequence_GetItem(all, pos);
3618 if (name == NULL) {
3619 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3620 err = -1;
3621 else
3622 PyErr_Clear();
3623 break;
3624 }
3625 if (skip_leading_underscores &&
3626 PyString_Check(name) &&
3627 PyString_AS_STRING(name)[0] == '_')
3628 {
3629 Py_DECREF(name);
3630 continue;
3631 }
3632 value = PyObject_GetAttr(v, name);
3633 if (value == NULL)
3634 err = -1;
3635 else
3636 err = PyDict_SetItem(locals, name, value);
3637 Py_DECREF(name);
3638 Py_XDECREF(value);
3639 if (err != 0)
3640 break;
3641 }
3642 Py_DECREF(all);
3643 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003644}
3645
Guido van Rossumb209a111997-04-29 18:18:01 +00003646static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003647build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003648{
Guido van Rossumcd649651997-08-22 16:56:16 +00003649 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003650 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003651 PyErr_SetString(PyExc_SystemError,
3652 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003653 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003654 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003655 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003656 PyErr_SetString(PyExc_SystemError,
3657 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003658 return NULL;
3659 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003660 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003661 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003662 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003663 return NULL;
3664 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003665 n = PyTuple_Size(bases);
3666 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003667 PyObject *base = PyTuple_GET_ITEM(bases, i);
3668 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003669 /* Call the base's *type*, if it is callable.
3670 This code is a hook for Donald Beaudry's
3671 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003672 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003673 since its types are not callable.
3674 Ditto: call the bases's *class*, if it has
3675 one. This makes the same thing possible
3676 without writing C code. A true meta-object
3677 protocol! */
3678 PyObject *basetype = (PyObject *)base->ob_type;
3679 PyObject *callable = NULL;
3680 if (PyCallable_Check(basetype))
3681 callable = basetype;
3682 else
3683 callable = PyObject_GetAttrString(
3684 base, "__class__");
3685 if (callable) {
3686 PyObject *args;
3687 PyObject *newclass = NULL;
3688 args = Py_BuildValue(
3689 "(OOO)", name, bases, methods);
3690 if (args != NULL) {
3691 newclass = PyEval_CallObject(
3692 callable, args);
3693 Py_DECREF(args);
3694 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003695 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003696 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003697 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003698 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003699 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003700 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003701 "base is not a class object");
3702 return NULL;
3703 }
3704 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003705 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003706}
3707
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003708static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003709exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3710 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003711{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003712 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003713 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003714 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003715
Guido van Rossumb209a111997-04-29 18:18:01 +00003716 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3717 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003718 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003719 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003720 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003721 locals = PyTuple_GetItem(prog, 2);
3722 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003723 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003724 if (globals == Py_None) {
3725 globals = PyEval_GetGlobals();
3726 if (locals == Py_None) {
3727 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003728 plain = 1;
3729 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003731 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003732 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003733 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003734 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003735 !PyCode_Check(prog) &&
3736 !PyFile_Check(prog)) {
3737 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003738 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003739 return -1;
3740 }
Fred Drake661ea262000-10-24 19:57:45 +00003741 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003742 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003743 "exec: arg 2 must be a dictionary or None");
3744 return -1;
3745 }
3746 if (!PyDict_Check(locals)) {
3747 PyErr_SetString(PyExc_TypeError,
3748 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003749 return -1;
3750 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003751 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003752 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003753 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003754 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003755 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003756 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003757 FILE *fp = PyFile_AsFile(prog);
3758 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003759 if (PyEval_GetNestedScopes()) {
3760 PyCompilerFlags cf;
3761 cf.cf_nested_scopes = 1;
3762 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3763 locals, &cf);
3764 } else {
3765 v = PyRun_File(fp, name, Py_file_input, globals,
3766 locals);
3767 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003768 }
3769 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003770 char *str;
3771 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003772 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003773 if (PyEval_GetNestedScopes()) {
3774 PyCompilerFlags cf;
3775 cf.cf_nested_scopes = 1;
3776 v = PyRun_StringFlags(str, Py_file_input, globals,
3777 locals, &cf);
3778 } else
3779 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003780 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003781 if (plain)
3782 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003783 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003784 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003785 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003786 return 0;
3787}
Guido van Rossum24c13741995-02-14 09:42:43 +00003788
Guido van Rossumac7be682001-01-17 15:42:30 +00003789static void
Paul Prescode68140d2000-08-30 20:25:01 +00003790format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3791{
3792 char *obj_str;
3793
3794 if (!obj)
3795 return;
3796
3797 obj_str = PyString_AsString(obj);
3798 if (!obj_str)
3799 return;
3800
3801 PyErr_Format(exc, format_str, obj_str);
3802}
Guido van Rossum950361c1997-01-24 13:49:28 +00003803
3804#ifdef DYNAMIC_EXECUTION_PROFILE
3805
3806PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003807getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003808{
3809 int i;
3810 PyObject *l = PyList_New(256);
3811 if (l == NULL) return NULL;
3812 for (i = 0; i < 256; i++) {
3813 PyObject *x = PyInt_FromLong(a[i]);
3814 if (x == NULL) {
3815 Py_DECREF(l);
3816 return NULL;
3817 }
3818 PyList_SetItem(l, i, x);
3819 }
3820 for (i = 0; i < 256; i++)
3821 a[i] = 0;
3822 return l;
3823}
3824
3825PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003826_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003827{
3828#ifndef DXPAIRS
3829 return getarray(dxp);
3830#else
3831 int i;
3832 PyObject *l = PyList_New(257);
3833 if (l == NULL) return NULL;
3834 for (i = 0; i < 257; i++) {
3835 PyObject *x = getarray(dxpairs[i]);
3836 if (x == NULL) {
3837 Py_DECREF(l);
3838 return NULL;
3839 }
3840 PyList_SetItem(l, i, x);
3841 }
3842 return l;
3843#endif
3844}
3845
3846#endif