blob: d334775fbe36900d684efa81a032010dd8ab0701 [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
169 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000170}
171
172static PyObject *
173gen_next(genobject *gen, PyObject *args)
174{
175 PyObject *result;
176
177 if (!PyArg_ParseTuple(args, ":next"))
178 return NULL;
179
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000180 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000181
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000182 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000183 PyErr_SetObject(PyExc_StopIteration, Py_None);
184 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000185 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000186
187 return result;
188}
189
190static PyObject *
191gen_getiter(PyObject *gen)
192{
193 Py_INCREF(gen);
194 return gen;
195}
196
197static struct PyMethodDef gen_methods[] = {
198 {"next", (PyCFunction)gen_next, METH_VARARGS,
199 "next() -- get the next value, or raise StopIteration"},
200 {NULL, NULL} /* Sentinel */
201};
202
203static PyObject *
204gen_getattr(genobject *gen, char *name)
205{
206 return Py_FindMethod(gen_methods, (PyObject *)gen, name);
207}
208
209statichere PyTypeObject gentype = {
210 PyObject_HEAD_INIT(&PyType_Type)
211 0, /* ob_size */
212 "generator", /* tp_name */
213 sizeof(genobject), /* tp_basicsize */
214 0, /* tp_itemsize */
215 /* methods */
216 (destructor)gen_dealloc, /* tp_dealloc */
217 0, /* tp_print */
218 (getattrfunc)gen_getattr, /* tp_getattr */
219 0, /* tp_setattr */
220 0, /* tp_compare */
221 0, /* tp_repr */
222 0, /* tp_as_number */
223 0, /* tp_as_sequence */
224 0, /* tp_as_mapping */
225 0, /* tp_hash */
226 0, /* tp_call */
227 0, /* tp_str */
228 0, /* tp_getattro */
229 0, /* tp_setattro */
230 0, /* tp_as_buffer */
231 Py_TPFLAGS_DEFAULT, /* tp_flags */
232 0, /* tp_doc */
233 0, /* tp_traverse */
234 0, /* tp_clear */
235 0, /* tp_richcompare */
236 0, /* tp_weaklistoffset */
237 (getiterfunc)gen_getiter, /* tp_iter */
238 (iternextfunc)gen_iternext, /* tp_iternext */
239};
240
241
Guido van Rossume59214e1994-08-30 08:01:59 +0000242#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000243
Guido van Rossum2571cc81999-04-07 16:07:23 +0000244#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000245#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000246#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000247#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000248
Guido van Rossuma027efa1997-05-05 20:56:21 +0000249extern int _PyThread_Started; /* Flag for Py_Exit */
250
Guido van Rossum65d5b571998-12-21 19:32:43 +0000251static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000252static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000253
254void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000255PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000257 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000258 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000259 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000260 interpreter_lock = PyThread_allocate_lock();
261 PyThread_acquire_lock(interpreter_lock, 1);
262 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000263}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000264
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000265void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000266PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000269}
270
271void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000272PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000274 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000275}
276
277void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000278PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000279{
280 if (tstate == NULL)
281 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000282 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000283 if (PyThreadState_Swap(tstate) != NULL)
284 Py_FatalError(
285 "PyEval_AcquireThread: non-NULL old thread state");
286}
287
288void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000289PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000290{
291 if (tstate == NULL)
292 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
293 if (PyThreadState_Swap(NULL) != tstate)
294 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000295 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000296}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000297
298/* This function is called from PyOS_AfterFork to ensure that newly
299 created child processes don't hold locks referring to threads which
300 are not running in the child process. (This could also be done using
301 pthread_atfork mechanism, at least for the pthreads implementation.) */
302
303void
304PyEval_ReInitThreads(void)
305{
306 if (!interpreter_lock)
307 return;
308 /*XXX Can't use PyThread_free_lock here because it does too
309 much error-checking. Doing this cleanly would require
310 adding a new function to each thread_*.h. Instead, just
311 create a new lock and waste a little bit of memory */
312 interpreter_lock = PyThread_allocate_lock();
313 PyThread_acquire_lock(interpreter_lock, 1);
314 main_thread = PyThread_get_thread_ident();
315}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000316#endif
317
Guido van Rossumff4949e1992-08-05 19:58:53 +0000318/* Functions save_thread and restore_thread are always defined so
319 dynamically loaded modules needn't be compiled separately for use
320 with and without threads: */
321
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000322PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000323PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000324{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000325 PyThreadState *tstate = PyThreadState_Swap(NULL);
326 if (tstate == NULL)
327 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000328#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000329 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000330 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000332 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000333}
334
335void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000336PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000337{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000338 if (tstate == NULL)
339 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000340#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000341 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000342 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000343 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000345 }
346#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000347 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000348}
349
350
Guido van Rossuma9672091994-09-14 13:31:22 +0000351/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
352 signal handlers or Mac I/O completion routines) can schedule calls
353 to a function to be called synchronously.
354 The synchronous function is called with one void* argument.
355 It should return 0 for success or -1 for failure -- failure should
356 be accompanied by an exception.
357
358 If registry succeeds, the registry function returns 0; if it fails
359 (e.g. due to too many pending calls) it returns -1 (without setting
360 an exception condition).
361
362 Note that because registry may occur from within signal handlers,
363 or other asynchronous events, calling malloc() is unsafe!
364
365#ifdef WITH_THREAD
366 Any thread can schedule pending calls, but only the main thread
367 will execute them.
368#endif
369
370 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
371 There are two possible race conditions:
372 (1) nested asynchronous registry calls;
373 (2) registry calls made while pending calls are being processed.
374 While (1) is very unlikely, (2) is a real possibility.
375 The current code is safe against (2), but not against (1).
376 The safety against (2) is derived from the fact that only one
377 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000378
Guido van Rossuma027efa1997-05-05 20:56:21 +0000379 XXX Darn! With the advent of thread state, we should have an array
380 of pending calls per thread in the thread state! Later...
381*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000382
Guido van Rossuma9672091994-09-14 13:31:22 +0000383#define NPENDINGCALLS 32
384static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000385 int (*func)(void *);
386 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000387} pendingcalls[NPENDINGCALLS];
388static volatile int pendingfirst = 0;
389static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000390static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000391
392int
Thomas Wouters334fb892000-07-25 12:56:38 +0000393Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000394{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000395 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000396 int i, j;
397 /* XXX Begin critical section */
398 /* XXX If you want this to be safe against nested
399 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000400 if (busy)
401 return -1;
402 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000403 i = pendinglast;
404 j = (i + 1) % NPENDINGCALLS;
405 if (j == pendingfirst)
406 return -1; /* Queue full */
407 pendingcalls[i].func = func;
408 pendingcalls[i].arg = arg;
409 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000410 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000411 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000412 /* XXX End critical section */
413 return 0;
414}
415
Guido van Rossum180d7b41994-09-29 09:45:57 +0000416int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000417Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000418{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000419 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000420#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000421 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000422 return 0;
423#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000424 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000425 return 0;
426 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000427 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000428 for (;;) {
429 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000430 int (*func)(void *);
431 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000432 i = pendingfirst;
433 if (i == pendinglast)
434 break; /* Queue empty */
435 func = pendingcalls[i].func;
436 arg = pendingcalls[i].arg;
437 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000438 if (func(arg) < 0) {
439 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000440 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000441 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000442 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000443 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000444 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000445 return 0;
446}
447
448
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000449/* The interpreter's recursion limit */
450
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000451static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000452
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000453int
454Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000455{
456 return recursion_limit;
457}
458
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000459void
460Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000461{
462 recursion_limit = new_limit;
463}
464
Guido van Rossum374a9221991-04-04 10:40:29 +0000465/* Status code for main loop (reason for stack unwind) */
466
467enum why_code {
468 WHY_NOT, /* No error */
469 WHY_EXCEPTION, /* Exception occurred */
470 WHY_RERAISE, /* Exception re-raised by 'finally' */
471 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000472 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000473 WHY_CONTINUE, /* 'continue' statement */
474 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000475};
476
Tim Petersdbd9ba62000-07-09 03:09:57 +0000477static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000478static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000479
Guido van Rossum374a9221991-04-04 10:40:29 +0000480
Guido van Rossumb209a111997-04-29 18:18:01 +0000481PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000482PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483{
484 return eval_code2(co,
485 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000486 (PyObject **)NULL, 0,
487 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000488 (PyObject **)NULL, 0,
489 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490}
491
492
493/* Interpreter main loop */
494
Tim Peters5ca576e2001-06-18 22:08:13 +0000495PyObject *
496eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000497{
Guido van Rossum950361c1997-01-24 13:49:28 +0000498#ifdef DXPAIRS
499 int lastopcode = 0;
500#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000501 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000502 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000503 register int opcode=0; /* Current opcode */
504 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000505 register enum why_code why; /* Reason for block stack unwind */
506 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000507 register PyObject *x; /* Result object -- NULL if error */
508 register PyObject *v; /* Temporary objects popped off stack */
509 register PyObject *w;
510 register PyObject *u;
511 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000512 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000513 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000514 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000515 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000516 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000517 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000518#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000519 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000520#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000521#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000522 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000523 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000524#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000525
526/* Code access macros */
527
528#define GETCONST(i) Getconst(f, i)
529#define GETNAME(i) Getname(f, i)
530#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000531#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000532#define NEXTOP() (*next_instr++)
533#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000534#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000535#define JUMPBY(x) (next_instr += (x))
536
537/* Stack manipulation macros */
538
539#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
540#define EMPTY() (STACK_LEVEL() == 0)
541#define TOP() (stack_pointer[-1])
542#define BASIC_PUSH(v) (*stack_pointer++ = (v))
543#define BASIC_POP() (*--stack_pointer)
544
Guido van Rossum96a42c81992-01-12 02:29:51 +0000545#ifdef LLTRACE
546#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
547#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000548#else
549#define PUSH(v) BASIC_PUSH(v)
550#define POP() BASIC_POP()
551#endif
552
Guido van Rossum681d79a1995-07-18 14:51:37 +0000553/* Local variable macros */
554
555#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000556#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000557 GETLOCAL(i) = value; } while (0)
558
Guido van Rossuma027efa1997-05-05 20:56:21 +0000559/* Start of code */
560
Tim Peters5ca576e2001-06-18 22:08:13 +0000561 if (f == NULL)
562 return NULL;
563
Guido van Rossum8861b741996-07-30 16:49:37 +0000564#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000566 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000567 return NULL;
568 }
569#endif
570
Tim Peters5ca576e2001-06-18 22:08:13 +0000571 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000572 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 --tstate->recursion_depth;
574 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000575 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000577 return NULL;
578 }
579
Tim Peters5ca576e2001-06-18 22:08:13 +0000580 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 co = f->f_code;
582 fastlocals = f->f_localsplus;
583 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000584 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000585 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000586 stack_pointer = f->f_stacktop;
587 assert(stack_pointer != NULL);
588 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000589
590#ifdef LLTRACE
591 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
592#endif
593#if defined(Py_DEBUG) || defined(LLTRACE)
594 filename = PyString_AsString(co->co_filename);
595#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000596
Guido van Rossum374a9221991-04-04 10:40:29 +0000597 why = WHY_NOT;
598 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000599 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000600 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000601
Guido van Rossum374a9221991-04-04 10:40:29 +0000602 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000603 /* Do periodic things. Doing this every time through
604 the loop would add too much overhead, so we do it
605 only every Nth instruction. We also do it if
606 ``things_to_do'' is set, i.e. when an asynchronous
607 event needs attention (e.g. a signal handler or
608 async I/O handler); see Py_AddPendingCall() and
609 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000610
Guido van Rossuma027efa1997-05-05 20:56:21 +0000611 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000612 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000613 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000614 if (Py_MakePendingCalls() < 0) {
615 why = WHY_EXCEPTION;
616 goto on_error;
617 }
618 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000619#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620 /* If we have true signals, the signal handler
621 will call Py_AddPendingCall() so we don't
622 have to call sigcheck(). On the Mac and
623 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000624 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 goto on_error;
627 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000628#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000629
Guido van Rossume59214e1994-08-30 08:01:59 +0000630#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000631 if (interpreter_lock) {
632 /* Give another thread a chance */
633
Guido van Rossum25ce5661997-08-02 03:10:38 +0000634 if (PyThreadState_Swap(NULL) != tstate)
635 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000636 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000637
638 /* Other threads may run now */
639
Guido van Rossum65d5b571998-12-21 19:32:43 +0000640 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000641 if (PyThreadState_Swap(tstate) != NULL)
642 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000643 }
644#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000646
Guido van Rossum374a9221991-04-04 10:40:29 +0000647 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000648
Guido van Rossum408027e1996-12-30 16:17:54 +0000649#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000650 f->f_lasti = INSTR_OFFSET();
651#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000652
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 opcode = NEXTOP();
654 if (HAS_ARG(opcode))
655 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000656 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000657#ifdef DYNAMIC_EXECUTION_PROFILE
658#ifdef DXPAIRS
659 dxpairs[lastopcode][opcode]++;
660 lastopcode = opcode;
661#endif
662 dxp[opcode]++;
663#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000664
Guido van Rossum96a42c81992-01-12 02:29:51 +0000665#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000666 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000667
Guido van Rossum96a42c81992-01-12 02:29:51 +0000668 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 if (HAS_ARG(opcode)) {
670 printf("%d: %d, %d\n",
671 (int) (INSTR_OFFSET() - 3),
672 opcode, oparg);
673 }
674 else {
675 printf("%d: %d\n",
676 (int) (INSTR_OFFSET() - 1), opcode);
677 }
678 }
679#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000681
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000683
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 /* BEWARE!
685 It is essential that any operation that fails sets either
686 x to NULL, err to nonzero, or why to anything but WHY_NOT,
687 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000688
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000690
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 case POP_TOP:
692 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000693 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000694 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000695
Guido van Rossum374a9221991-04-04 10:40:29 +0000696 case ROT_TWO:
697 v = POP();
698 w = POP();
699 PUSH(v);
700 PUSH(w);
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_THREE:
704 v = POP();
705 w = POP();
706 x = POP();
707 PUSH(v);
708 PUSH(x);
709 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000710 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000711
Thomas Wouters434d0822000-08-24 20:11:32 +0000712 case ROT_FOUR:
713 u = POP();
714 v = POP();
715 w = POP();
716 x = POP();
717 PUSH(u);
718 PUSH(x);
719 PUSH(w);
720 PUSH(v);
721 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 case DUP_TOP:
724 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000725 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000727 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000728
Thomas Wouters434d0822000-08-24 20:11:32 +0000729 case DUP_TOPX:
730 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000731 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000732 x = TOP();
733 Py_INCREF(x);
734 PUSH(x);
735 continue;
736 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000737 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000738 Py_INCREF(x);
739 w = TOP();
740 Py_INCREF(w);
741 PUSH(x);
742 PUSH(w);
743 PUSH(x);
744 continue;
745 case 3:
746 x = POP();
747 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000748 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000749 Py_INCREF(w);
750 v = TOP();
751 Py_INCREF(v);
752 PUSH(w);
753 PUSH(x);
754 PUSH(v);
755 PUSH(w);
756 PUSH(x);
757 continue;
758 case 4:
759 x = POP();
760 Py_INCREF(x);
761 w = POP();
762 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000763 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000764 Py_INCREF(v);
765 u = TOP();
766 Py_INCREF(u);
767 PUSH(v);
768 PUSH(w);
769 PUSH(x);
770 PUSH(u);
771 PUSH(v);
772 PUSH(w);
773 PUSH(x);
774 continue;
775 case 5:
776 x = POP();
777 Py_INCREF(x);
778 w = POP();
779 Py_INCREF(w);
780 v = POP();
781 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000782 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000783 Py_INCREF(u);
784 t = TOP();
785 Py_INCREF(t);
786 PUSH(u);
787 PUSH(v);
788 PUSH(w);
789 PUSH(x);
790 PUSH(t);
791 PUSH(u);
792 PUSH(v);
793 PUSH(w);
794 PUSH(x);
795 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000796 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000797 Py_FatalError("invalid argument to DUP_TOPX"
798 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 }
Tim Peters35ba6892000-10-11 07:04:49 +0000800 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000801
Guido van Rossum374a9221991-04-04 10:40:29 +0000802 case UNARY_POSITIVE:
803 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000804 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000805 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000806 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000807 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000808 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000809
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 case UNARY_NEGATIVE:
811 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000812 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000813 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000815 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000816 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000817
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 case UNARY_NOT:
819 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000820 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000821 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000822 if (err == 0) {
823 Py_INCREF(Py_True);
824 PUSH(Py_True);
825 continue;
826 }
827 else if (err > 0) {
828 Py_INCREF(Py_False);
829 PUSH(Py_False);
830 err = 0;
831 continue;
832 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000834
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 case UNARY_CONVERT:
836 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 x = PyObject_Repr(v);
838 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000842
Guido van Rossum7928cd71991-10-24 14:59:31 +0000843 case UNARY_INVERT:
844 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000845 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000846 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000847 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000848 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000849 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000850
Guido van Rossum50564e81996-01-12 01:13:16 +0000851 case BINARY_POWER:
852 w = POP();
853 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000855 Py_DECREF(v);
856 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000857 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000858 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000859 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000860
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 case BINARY_MULTIPLY:
862 w = POP();
863 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000864 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000865 Py_DECREF(v);
866 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000868 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000870
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 case BINARY_DIVIDE:
872 w = POP();
873 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000874 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000875 Py_DECREF(v);
876 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000878 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000880
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 case BINARY_MODULO:
882 w = POP();
883 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000884 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000885 Py_DECREF(v);
886 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000888 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000890
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 case BINARY_ADD:
892 w = POP();
893 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000894 if (PyInt_Check(v) && PyInt_Check(w)) {
895 /* INLINE: int + int */
896 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000897 a = PyInt_AS_LONG(v);
898 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000899 i = a + b;
900 if ((i^a) < 0 && (i^b) < 0) {
901 PyErr_SetString(PyExc_OverflowError,
902 "integer addition");
903 x = NULL;
904 }
905 else
906 x = PyInt_FromLong(i);
907 }
908 else
909 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000910 Py_DECREF(v);
911 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000913 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000915
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 case BINARY_SUBTRACT:
917 w = POP();
918 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000919 if (PyInt_Check(v) && PyInt_Check(w)) {
920 /* INLINE: int - int */
921 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000922 a = PyInt_AS_LONG(v);
923 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000924 i = a - b;
925 if ((i^a) < 0 && (i^~b) < 0) {
926 PyErr_SetString(PyExc_OverflowError,
927 "integer subtraction");
928 x = NULL;
929 }
930 else
931 x = PyInt_FromLong(i);
932 }
933 else
934 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 Py_DECREF(v);
936 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000937 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000938 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000940
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 case BINARY_SUBSCR:
942 w = POP();
943 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000944 if (PyList_Check(v) && PyInt_Check(w)) {
945 /* INLINE: list[int] */
946 long i = PyInt_AsLong(w);
947 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000948 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000949 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000950 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000951 PyErr_SetString(PyExc_IndexError,
952 "list index out of range");
953 x = NULL;
954 }
955 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000956 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000957 Py_INCREF(x);
958 }
959 }
960 else
961 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 Py_DECREF(v);
963 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000965 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000967
Guido van Rossum7928cd71991-10-24 14:59:31 +0000968 case BINARY_LSHIFT:
969 w = POP();
970 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000971 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000972 Py_DECREF(v);
973 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000974 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000975 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000976 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000977
Guido van Rossum7928cd71991-10-24 14:59:31 +0000978 case BINARY_RSHIFT:
979 w = POP();
980 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000981 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_DECREF(v);
983 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000984 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000985 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000986 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000987
Guido van Rossum7928cd71991-10-24 14:59:31 +0000988 case BINARY_AND:
989 w = POP();
990 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000991 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_DECREF(v);
993 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000994 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000995 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000996 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000997
Guido van Rossum7928cd71991-10-24 14:59:31 +0000998 case BINARY_XOR:
999 w = POP();
1000 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001001 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001002 Py_DECREF(v);
1003 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001004 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001005 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001006 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001007
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008 case BINARY_OR:
1009 w = POP();
1010 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001011 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001012 Py_DECREF(v);
1013 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001014 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001015 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001016 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001017
1018 case INPLACE_POWER:
1019 w = POP();
1020 v = POP();
1021 x = PyNumber_InPlacePower(v, w, Py_None);
1022 Py_DECREF(v);
1023 Py_DECREF(w);
1024 PUSH(x);
1025 if (x != NULL) continue;
1026 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001027
Thomas Wouters434d0822000-08-24 20:11:32 +00001028 case INPLACE_MULTIPLY:
1029 w = POP();
1030 v = POP();
1031 x = PyNumber_InPlaceMultiply(v, w);
1032 Py_DECREF(v);
1033 Py_DECREF(w);
1034 PUSH(x);
1035 if (x != NULL) continue;
1036 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001037
Thomas Wouters434d0822000-08-24 20:11:32 +00001038 case INPLACE_DIVIDE:
1039 w = POP();
1040 v = POP();
1041 x = PyNumber_InPlaceDivide(v, w);
1042 Py_DECREF(v);
1043 Py_DECREF(w);
1044 PUSH(x);
1045 if (x != NULL) continue;
1046 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001047
Thomas Wouters434d0822000-08-24 20:11:32 +00001048 case INPLACE_MODULO:
1049 w = POP();
1050 v = POP();
1051 x = PyNumber_InPlaceRemainder(v, w);
1052 Py_DECREF(v);
1053 Py_DECREF(w);
1054 PUSH(x);
1055 if (x != NULL) continue;
1056 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001057
Thomas Wouters434d0822000-08-24 20:11:32 +00001058 case INPLACE_ADD:
1059 w = POP();
1060 v = POP();
1061 if (PyInt_Check(v) && PyInt_Check(w)) {
1062 /* INLINE: int + int */
1063 register long a, b, i;
1064 a = PyInt_AS_LONG(v);
1065 b = PyInt_AS_LONG(w);
1066 i = a + b;
1067 if ((i^a) < 0 && (i^b) < 0) {
1068 PyErr_SetString(PyExc_OverflowError,
1069 "integer addition");
1070 x = NULL;
1071 }
1072 else
1073 x = PyInt_FromLong(i);
1074 }
1075 else
1076 x = PyNumber_InPlaceAdd(v, w);
1077 Py_DECREF(v);
1078 Py_DECREF(w);
1079 PUSH(x);
1080 if (x != NULL) continue;
1081 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001082
Thomas Wouters434d0822000-08-24 20:11:32 +00001083 case INPLACE_SUBTRACT:
1084 w = POP();
1085 v = POP();
1086 if (PyInt_Check(v) && PyInt_Check(w)) {
1087 /* INLINE: int - int */
1088 register long a, b, i;
1089 a = PyInt_AS_LONG(v);
1090 b = PyInt_AS_LONG(w);
1091 i = a - b;
1092 if ((i^a) < 0 && (i^~b) < 0) {
1093 PyErr_SetString(PyExc_OverflowError,
1094 "integer subtraction");
1095 x = NULL;
1096 }
1097 else
1098 x = PyInt_FromLong(i);
1099 }
1100 else
1101 x = PyNumber_InPlaceSubtract(v, w);
1102 Py_DECREF(v);
1103 Py_DECREF(w);
1104 PUSH(x);
1105 if (x != NULL) continue;
1106 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001107
Thomas Wouters434d0822000-08-24 20:11:32 +00001108 case INPLACE_LSHIFT:
1109 w = POP();
1110 v = POP();
1111 x = PyNumber_InPlaceLshift(v, w);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Thomas Wouters434d0822000-08-24 20:11:32 +00001118 case INPLACE_RSHIFT:
1119 w = POP();
1120 v = POP();
1121 x = PyNumber_InPlaceRshift(v, w);
1122 Py_DECREF(v);
1123 Py_DECREF(w);
1124 PUSH(x);
1125 if (x != NULL) continue;
1126 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001127
Thomas Wouters434d0822000-08-24 20:11:32 +00001128 case INPLACE_AND:
1129 w = POP();
1130 v = POP();
1131 x = PyNumber_InPlaceAnd(v, w);
1132 Py_DECREF(v);
1133 Py_DECREF(w);
1134 PUSH(x);
1135 if (x != NULL) continue;
1136 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001137
Thomas Wouters434d0822000-08-24 20:11:32 +00001138 case INPLACE_XOR:
1139 w = POP();
1140 v = POP();
1141 x = PyNumber_InPlaceXor(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 PUSH(x);
1145 if (x != NULL) continue;
1146 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001147
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 case INPLACE_OR:
1149 w = POP();
1150 v = POP();
1151 x = PyNumber_InPlaceOr(v, w);
1152 Py_DECREF(v);
1153 Py_DECREF(w);
1154 PUSH(x);
1155 if (x != NULL) continue;
1156 break;
1157
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 case SLICE+0:
1159 case SLICE+1:
1160 case SLICE+2:
1161 case SLICE+3:
1162 if ((opcode-SLICE) & 2)
1163 w = POP();
1164 else
1165 w = NULL;
1166 if ((opcode-SLICE) & 1)
1167 v = POP();
1168 else
1169 v = NULL;
1170 u = POP();
1171 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001172 Py_DECREF(u);
1173 Py_XDECREF(v);
1174 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001175 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001176 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001178
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 case STORE_SLICE+0:
1180 case STORE_SLICE+1:
1181 case STORE_SLICE+2:
1182 case STORE_SLICE+3:
1183 if ((opcode-STORE_SLICE) & 2)
1184 w = POP();
1185 else
1186 w = NULL;
1187 if ((opcode-STORE_SLICE) & 1)
1188 v = POP();
1189 else
1190 v = NULL;
1191 u = POP();
1192 t = POP();
1193 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001194 Py_DECREF(t);
1195 Py_DECREF(u);
1196 Py_XDECREF(v);
1197 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001198 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001200
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 case DELETE_SLICE+0:
1202 case DELETE_SLICE+1:
1203 case DELETE_SLICE+2:
1204 case DELETE_SLICE+3:
1205 if ((opcode-DELETE_SLICE) & 2)
1206 w = POP();
1207 else
1208 w = NULL;
1209 if ((opcode-DELETE_SLICE) & 1)
1210 v = POP();
1211 else
1212 v = NULL;
1213 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001214 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001216 Py_DECREF(u);
1217 Py_XDECREF(v);
1218 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001219 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001221
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 case STORE_SUBSCR:
1223 w = POP();
1224 v = POP();
1225 u = POP();
1226 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001227 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001228 Py_DECREF(u);
1229 Py_DECREF(v);
1230 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001231 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001233
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 case DELETE_SUBSCR:
1235 w = POP();
1236 v = POP();
1237 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001238 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 Py_DECREF(v);
1240 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001241 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001243
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 case PRINT_EXPR:
1245 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001246 w = PySys_GetObject("displayhook");
1247 if (w == NULL) {
1248 PyErr_SetString(PyExc_RuntimeError,
1249 "lost sys.displayhook");
1250 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001251 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001252 }
1253 if (err == 0) {
1254 x = Py_BuildValue("(O)", v);
1255 if (x == NULL)
1256 err = -1;
1257 }
1258 if (err == 0) {
1259 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001260 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001261 if (w == NULL)
1262 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001264 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001265 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001267
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001268 case PRINT_ITEM_TO:
1269 w = stream = POP();
1270 /* fall through to PRINT_ITEM */
1271
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 case PRINT_ITEM:
1273 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001274 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001275 w = PySys_GetObject("stdout");
1276 if (w == NULL) {
1277 PyErr_SetString(PyExc_RuntimeError,
1278 "lost sys.stdout");
1279 err = -1;
1280 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001281 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001282 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001283 err = PyFile_WriteString(" ", w);
1284 if (err == 0)
1285 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001286 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001287 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 char *s = PyString_AsString(v);
1289 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001290 if (len > 0 &&
1291 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001292 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001296 Py_XDECREF(stream);
1297 stream = NULL;
1298 if (err == 0)
1299 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001301
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001302 case PRINT_NEWLINE_TO:
1303 w = stream = POP();
1304 /* fall through to PRINT_NEWLINE */
1305
Guido van Rossum374a9221991-04-04 10:40:29 +00001306 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001307 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001308 w = PySys_GetObject("stdout");
1309 if (w == NULL)
1310 PyErr_SetString(PyExc_RuntimeError,
1311 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001312 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001313 if (w != NULL) {
1314 err = PyFile_WriteString("\n", w);
1315 if (err == 0)
1316 PyFile_SoftSpace(w, 0);
1317 }
1318 Py_XDECREF(stream);
1319 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001321
Thomas Wouters434d0822000-08-24 20:11:32 +00001322
1323#ifdef CASE_TOO_BIG
1324 default: switch (opcode) {
1325#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 case BREAK_LOOP:
1327 why = WHY_BREAK;
1328 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001329
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001330 case CONTINUE_LOOP:
1331 retval = PyInt_FromLong(oparg);
1332 why = WHY_CONTINUE;
1333 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001334
Guido van Rossumf10570b1995-07-07 22:53:21 +00001335 case RAISE_VARARGS:
1336 u = v = w = NULL;
1337 switch (oparg) {
1338 case 3:
1339 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001340 /* Fallthrough */
1341 case 2:
1342 v = POP(); /* value */
1343 /* Fallthrough */
1344 case 1:
1345 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001346 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001347 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001348 break;
1349 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001351 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001352 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001353 break;
1354 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001356
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001358 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001359 PyErr_SetString(PyExc_SystemError,
1360 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001361 break;
1362 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001364 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001366
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 case RETURN_VALUE:
1368 retval = POP();
1369 why = WHY_RETURN;
1370 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001371
Tim Peters5ca576e2001-06-18 22:08:13 +00001372 case YIELD_VALUE:
1373 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001374 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001375 f->f_lasti = INSTR_OFFSET();
1376 why = WHY_YIELD;
1377 break;
1378
1379
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001380 case EXEC_STMT:
1381 w = POP();
1382 v = POP();
1383 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001384 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001385 Py_DECREF(u);
1386 Py_DECREF(v);
1387 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001388 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001389
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 case POP_BLOCK:
1391 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001392 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 while (STACK_LEVEL() > b->b_level) {
1394 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 }
1397 }
1398 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001399
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 case END_FINALLY:
1401 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 if (PyInt_Check(v)) {
1403 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001404 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001405 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001406 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 retval = POP();
1408 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001411 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001412 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001414 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 else if (v != Py_None) {
1417 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 "'finally' pops bad exception");
1419 why = WHY_EXCEPTION;
1420 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001421 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001423
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001425 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001427 w = POP();
1428 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 Py_DECREF(u);
1431 Py_DECREF(v);
1432 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001434
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 case STORE_NAME:
1436 w = GETNAMEV(oparg);
1437 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001438 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001439 PyErr_Format(PyExc_SystemError,
1440 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001441 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 break;
1443 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 err = PyDict_SetItem(x, w, v);
1445 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001447
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001449 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001450 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001451 PyErr_Format(PyExc_SystemError,
1452 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001453 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001454 break;
1455 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001456 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001457 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001458 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001460
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001461 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001463 if (PyTuple_Check(v)) {
1464 if (PyTuple_Size(v) != oparg) {
1465 PyErr_SetString(PyExc_ValueError,
1466 "unpack tuple of wrong size");
1467 why = WHY_EXCEPTION;
1468 }
1469 else {
1470 for (; --oparg >= 0; ) {
1471 w = PyTuple_GET_ITEM(v, oparg);
1472 Py_INCREF(w);
1473 PUSH(w);
1474 }
1475 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001477 else if (PyList_Check(v)) {
1478 if (PyList_Size(v) != oparg) {
1479 PyErr_SetString(PyExc_ValueError,
1480 "unpack list of wrong size");
1481 why = WHY_EXCEPTION;
1482 }
1483 else {
1484 for (; --oparg >= 0; ) {
1485 w = PyList_GET_ITEM(v, oparg);
1486 Py_INCREF(w);
1487 PUSH(w);
1488 }
1489 }
1490 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001491 else if (unpack_iterable(v, oparg,
1492 stack_pointer + oparg))
1493 stack_pointer += oparg;
1494 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001495 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001498
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001500 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 v = POP();
1502 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1504 Py_DECREF(v);
1505 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001507
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001509 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001511 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1512 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001515
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001516 case STORE_GLOBAL:
1517 w = GETNAMEV(oparg);
1518 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001519 err = PyDict_SetItem(f->f_globals, w, v);
1520 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001521 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001522
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001523 case DELETE_GLOBAL:
1524 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001526 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001527 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 case LOAD_CONST:
1531 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 PUSH(x);
1534 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001535
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001537 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001538 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001539 PyErr_Format(PyExc_SystemError,
1540 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001541 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001542 break;
1543 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001548 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001550 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001551 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001552 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 break;
1554 }
1555 }
1556 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 PUSH(x);
1559 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001560
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001562 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001567 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001568 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001569 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 break;
1571 }
1572 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 PUSH(x);
1575 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001576
Guido van Rossum9bfef441993-03-29 10:43:31 +00001577 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001578 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001579 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001580 format_exc_check_arg(
1581 PyExc_UnboundLocalError,
1582 UNBOUNDLOCAL_ERROR_MSG,
1583 PyTuple_GetItem(co->co_varnames, oparg)
1584 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001585 break;
1586 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001588 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001589 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001590 break;
1591
1592 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001593 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001594 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001595 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001596
1597 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001598 x = GETLOCAL(oparg);
1599 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001600 format_exc_check_arg(
1601 PyExc_UnboundLocalError,
1602 UNBOUNDLOCAL_ERROR_MSG,
1603 PyTuple_GetItem(co->co_varnames, oparg)
1604 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001605 break;
1606 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001607 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001608 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001610 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001611 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001612 Py_INCREF(x);
1613 PUSH(x);
1614 break;
1615
1616 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001617 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001618 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001619 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001620 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001621 v = PyTuple_GetItem(co->co_cellvars,
1622 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001623 format_exc_check_arg(
1624 PyExc_UnboundLocalError,
1625 UNBOUNDLOCAL_ERROR_MSG,
1626 v);
1627 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001628 v = PyTuple_GetItem(
1629 co->co_freevars,
1630 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001631 format_exc_check_arg(
1632 PyExc_NameError,
1633 UNBOUNDFREE_ERROR_MSG,
1634 v);
1635 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001636 err = -1;
1637 break;
1638 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001639 PUSH(w);
1640 break;
1641
1642 case STORE_DEREF:
1643 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001644 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001645 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001646 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001647 continue;
1648
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001650 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 if (x != NULL) {
1652 for (; --oparg >= 0;) {
1653 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 }
1656 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001657 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 }
1659 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001660
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001663 if (x != NULL) {
1664 for (; --oparg >= 0;) {
1665 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001666 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 }
1668 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001669 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 }
1671 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001672
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001676 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001678
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001680 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001682 x = PyObject_GetAttr(v, w);
1683 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001685 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001687
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 case COMPARE_OP:
1689 w = POP();
1690 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001691 if (PyInt_Check(v) && PyInt_Check(w)) {
1692 /* INLINE: cmp(int, int) */
1693 register long a, b;
1694 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001695 a = PyInt_AS_LONG(v);
1696 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001697 switch (oparg) {
1698 case LT: res = a < b; break;
1699 case LE: res = a <= b; break;
1700 case EQ: res = a == b; break;
1701 case NE: res = a != b; break;
1702 case GT: res = a > b; break;
1703 case GE: res = a >= b; break;
1704 case IS: res = v == w; break;
1705 case IS_NOT: res = v != w; break;
1706 default: goto slow_compare;
1707 }
1708 x = res ? Py_True : Py_False;
1709 Py_INCREF(x);
1710 }
1711 else {
1712 slow_compare:
1713 x = cmp_outcome(oparg, v, w);
1714 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001715 Py_DECREF(v);
1716 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001718 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001720
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001722 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001724 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001725 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001726 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001727 break;
1728 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001729 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001731 w,
1732 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001733 f->f_locals == NULL ?
1734 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001735 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001737 if (w == NULL) {
1738 x = NULL;
1739 break;
1740 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 x = PyEval_CallObject(x, w);
1742 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001743 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001744 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001746
Thomas Wouters52152252000-08-17 22:55:00 +00001747 case IMPORT_STAR:
1748 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001750 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001751 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001752 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001753 break;
1754 }
Thomas Wouters52152252000-08-17 22:55:00 +00001755 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001757 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001758 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001760
Thomas Wouters52152252000-08-17 22:55:00 +00001761 case IMPORT_FROM:
1762 w = GETNAMEV(oparg);
1763 v = TOP();
1764 x = import_from(v, w);
1765 PUSH(x);
1766 if (x != NULL) continue;
1767 break;
1768
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 case JUMP_FORWARD:
1770 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001771 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001772
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001775 if (err > 0)
1776 err = 0;
1777 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001779 else
1780 break;
1781 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001782
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001785 if (err > 0) {
1786 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001788 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001789 else if (err == 0)
1790 ;
1791 else
1792 break;
1793 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001794
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 case JUMP_ABSOLUTE:
1796 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001797 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001798
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001799 case GET_ITER:
1800 /* before: [obj]; after [getiter(obj)] */
1801 v = POP();
1802 x = PyObject_GetIter(v);
1803 Py_DECREF(v);
1804 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001805 PUSH(x);
1806 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001807 }
1808 break;
1809
1810 case FOR_ITER:
1811 /* before: [iter]; after: [iter, iter()] *or* [] */
1812 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001813 x = PyIter_Next(v);
1814 if (x != NULL) {
1815 PUSH(x);
1816 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001817 }
Tim Petersf4848da2001-05-05 00:14:56 +00001818 if (!PyErr_Occurred()) {
1819 /* iterator ended normally */
1820 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001821 Py_DECREF(v);
1822 JUMPBY(oparg);
1823 continue;
1824 }
1825 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001826
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 case FOR_LOOP:
1828 /* for v in s: ...
1829 On entry: stack contains s, i.
1830 On exit: stack contains s, i+1, s[i];
1831 but if loop exhausted:
1832 s, i are popped, and we jump */
1833 w = POP(); /* Loop index */
1834 v = POP(); /* Sequence object */
1835 u = loop_subscript(v, w);
1836 if (u != NULL) {
1837 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001838 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001840 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001842 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001843 }
1844 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 Py_DECREF(v);
1846 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 /* A NULL can mean "s exhausted"
1848 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001849 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001851 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001853 continue;
1854 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 }
1856 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001857
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 case SETUP_LOOP:
1859 case SETUP_EXCEPT:
1860 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001862 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001863 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001864
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001866#ifdef LLTRACE
1867 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001868 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001869#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001870 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001871 if (f->f_trace == NULL)
1872 continue;
1873 /* Trace each line of code reached */
1874 f->f_lasti = INSTR_OFFSET();
1875 err = call_trace(&f->f_trace, &f->f_trace,
Fred Draked0838392001-06-16 21:02:31 +00001876 f, str_line, Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001878
1879 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001880 {
1881 int na = oparg & 0xff;
1882 int nk = (oparg>>8) & 0xff;
1883 int n = na + 2 * nk;
1884 PyObject **pfunc = stack_pointer - n - 1;
1885 PyObject *func = *pfunc;
1886 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1887
1888 /* Always dispatch PyCFunction first, because
1889 these are presumed to be the most frequent
1890 callable object.
1891 */
1892 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001893 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001894 if (flags > 1 || nk != 0)
1895 x = do_call(func, &stack_pointer,
1896 na, nk);
1897 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001898 PyObject *callargs;
1899 callargs = load_args(&stack_pointer, na);
1900 x = call_cfunction(func, callargs, NULL);
1901 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001902 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001903 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001904 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001905 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001906 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001907 && PyMethod_GET_SELF(func) != NULL) {
1908 /* optimize access to bound methods */
1909 PyObject *self = PyMethod_GET_SELF(func);
1910 Py_INCREF(self);
1911 func = PyMethod_GET_FUNCTION(func);
1912 Py_INCREF(func);
1913 Py_DECREF(*pfunc);
1914 *pfunc = self;
1915 na++;
1916 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001917 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001918 Py_INCREF(func);
1919 if (PyFunction_Check(func)) {
1920 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001921 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001922 } else {
1923 x = do_call(func, &stack_pointer,
1924 na, nk);
1925 }
1926 Py_DECREF(func);
1927 }
1928
1929 while (stack_pointer > pfunc) {
1930 w = POP();
1931 Py_DECREF(w);
1932 }
1933 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001934 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001935 continue;
1936 break;
1937 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001938
Jeremy Hylton76901512000-03-28 23:49:17 +00001939 case CALL_FUNCTION_VAR:
1940 case CALL_FUNCTION_KW:
1941 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001942 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001943 int na = oparg & 0xff;
1944 int nk = (oparg>>8) & 0xff;
1945 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001946 int n = na + 2 * nk;
1947 PyObject **pfunc, *func;
1948 if (flags & CALL_FLAG_VAR)
1949 n++;
1950 if (flags & CALL_FLAG_KW)
1951 n++;
1952 pfunc = stack_pointer - n - 1;
1953 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001954 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001955
Guido van Rossumac7be682001-01-17 15:42:30 +00001956 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001957 && PyMethod_GET_SELF(func) != NULL) {
1958 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001959 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001960 func = PyMethod_GET_FUNCTION(func);
1961 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001962 Py_DECREF(*pfunc);
1963 *pfunc = self;
1964 na++;
1965 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001966 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001967 Py_INCREF(func);
1968 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001969 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001970
Jeremy Hylton76901512000-03-28 23:49:17 +00001971 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001972 w = POP();
1973 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001974 }
1975 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001976 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001977 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001978 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001979 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001980
Guido van Rossum681d79a1995-07-18 14:51:37 +00001981 case MAKE_FUNCTION:
1982 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001983 x = PyFunction_New(v, f->f_globals);
1984 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001985 /* XXX Maybe this should be a separate opcode? */
1986 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001988 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001989 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001990 x = NULL;
1991 break;
1992 }
1993 while (--oparg >= 0) {
1994 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001995 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001996 }
1997 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001998 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001999 }
2000 PUSH(x);
2001 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002002
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002003 case MAKE_CLOSURE:
2004 {
2005 int nfree;
2006 v = POP(); /* code object */
2007 x = PyFunction_New(v, f->f_globals);
2008 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2009 Py_DECREF(v);
2010 /* XXX Maybe this should be a separate opcode? */
2011 if (x != NULL && nfree > 0) {
2012 v = PyTuple_New(nfree);
2013 if (v == NULL) {
2014 Py_DECREF(x);
2015 x = NULL;
2016 break;
2017 }
2018 while (--nfree >= 0) {
2019 w = POP();
2020 PyTuple_SET_ITEM(v, nfree, w);
2021 }
2022 err = PyFunction_SetClosure(x, v);
2023 Py_DECREF(v);
2024 }
2025 if (x != NULL && oparg > 0) {
2026 v = PyTuple_New(oparg);
2027 if (v == NULL) {
2028 Py_DECREF(x);
2029 x = NULL;
2030 break;
2031 }
2032 while (--oparg >= 0) {
2033 w = POP();
2034 PyTuple_SET_ITEM(v, oparg, w);
2035 }
2036 err = PyFunction_SetDefaults(x, v);
2037 Py_DECREF(v);
2038 }
2039 PUSH(x);
2040 break;
2041 }
2042
Guido van Rossum8861b741996-07-30 16:49:37 +00002043 case BUILD_SLICE:
2044 if (oparg == 3)
2045 w = POP();
2046 else
2047 w = NULL;
2048 v = POP();
2049 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002050 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002051 Py_DECREF(u);
2052 Py_DECREF(v);
2053 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002054 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002055 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002056 break;
2057
Fred Drakeef8ace32000-08-24 00:32:09 +00002058 case EXTENDED_ARG:
2059 opcode = NEXTOP();
2060 oparg = oparg<<16 | NEXTARG();
2061 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002062
Guido van Rossum374a9221991-04-04 10:40:29 +00002063 default:
2064 fprintf(stderr,
2065 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002066 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002067 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002068 why = WHY_EXCEPTION;
2069 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002070
2071#ifdef CASE_TOO_BIG
2072 }
2073#endif
2074
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 } /* switch */
2076
2077 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002078
Guido van Rossum374a9221991-04-04 10:40:29 +00002079 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002080
Guido van Rossum374a9221991-04-04 10:40:29 +00002081 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002082 if (err == 0 && x != NULL) {
2083#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002084 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002085 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002086 fprintf(stderr,
2087 "XXX undetected error\n");
2088 else
2089#endif
2090 continue; /* Normal, fast path */
2091 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002092 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002093 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002094 err = 0;
2095 }
2096
Guido van Rossum374a9221991-04-04 10:40:29 +00002097 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002098
Guido van Rossum374a9221991-04-04 10:40:29 +00002099 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002101 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002102 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 why = WHY_EXCEPTION;
2104 }
2105 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002106#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002107 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002108 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002109 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002110 fprintf(stderr,
2111 "XXX undetected error (why=%d)\n",
2112 why);
2113 why = WHY_EXCEPTION;
2114 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002115 }
2116#endif
2117
2118 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002119
Guido van Rossum374a9221991-04-04 10:40:29 +00002120 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002121 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002123 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002125
Guido van Rossume59214e1994-08-30 08:01:59 +00002126 if (f->f_trace)
2127 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002128 if (tstate->sys_profilefunc)
2129 call_exc_trace(&tstate->sys_profilefunc,
2130 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002131 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002132
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002134
Guido van Rossum374a9221991-04-04 10:40:29 +00002135 if (why == WHY_RERAISE)
2136 why = WHY_EXCEPTION;
2137
2138 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002139
Tim Peters5ca576e2001-06-18 22:08:13 +00002140 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002142
2143 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2144 /* For a continue inside a try block,
2145 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002146 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002147 b->b_handler);
2148 why = WHY_NOT;
2149 JUMPTO(PyInt_AS_LONG(retval));
2150 Py_DECREF(retval);
2151 break;
2152 }
2153
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 while (STACK_LEVEL() > b->b_level) {
2155 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 }
2158 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2159 why = WHY_NOT;
2160 JUMPTO(b->b_handler);
2161 break;
2162 }
2163 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002164 (b->b_type == SETUP_EXCEPT &&
2165 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 PyObject *exc, *val, *tb;
2168 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 val = Py_None;
2171 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 /* Make the raw exception data
2174 available to the handler,
2175 so a program can emulate the
2176 Python main loop. Don't do
2177 this for 'finally'. */
2178 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002179 PyErr_NormalizeException(
2180 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002181 set_exc_info(tstate,
2182 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002184 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 PUSH(val);
2186 PUSH(exc);
2187 }
2188 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002189 if (why == WHY_RETURN ||
2190 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002193 PUSH(v);
2194 }
2195 why = WHY_NOT;
2196 JUMPTO(b->b_handler);
2197 break;
2198 }
2199 } /* unwind stack */
2200
2201 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002202
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 if (why != WHY_NOT)
2204 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002207
Tim Peters5ca576e2001-06-18 22:08:13 +00002208 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002209 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002210
Guido van Rossume59214e1994-08-30 08:01:59 +00002211 if (f->f_trace) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002212 if (why == WHY_RETURN || why == WHY_YIELD) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002213 if (call_trace(&f->f_trace, &f->f_trace, f,
Fred Draked0838392001-06-16 21:02:31 +00002214 str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002216 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002217 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002218 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002219 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002220 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002221
Tim Peters5ca576e2001-06-18 22:08:13 +00002222 if (tstate->sys_profilefunc &&
2223 (why == WHY_RETURN || why == WHY_YIELD)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002224 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Fred Draked0838392001-06-16 21:02:31 +00002225 f, str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002227 retval = NULL;
2228 why = WHY_EXCEPTION;
2229 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002230 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002231
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232 reset_exc_info(tstate);
2233
Tim Peters5ca576e2001-06-18 22:08:13 +00002234 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002235 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002236 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002237
Guido van Rossum96a42c81992-01-12 02:29:51 +00002238 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002239}
2240
Tim Peters5ca576e2001-06-18 22:08:13 +00002241static PyObject *
2242eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2243 PyObject **args, int argcount, PyObject **kws, int kwcount,
2244 PyObject **defs, int defcount, PyObject *closure)
2245{
2246 register PyFrameObject *f;
2247 register PyObject *retval = NULL;
2248 register PyObject **fastlocals, **freevars;
2249 PyThreadState *tstate = PyThreadState_GET();
2250 PyObject *x, *u;
2251
2252 if (globals == NULL) {
2253 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2254 return NULL;
2255 }
2256
2257 f = PyFrame_New(tstate, /*back*/
2258 co, /*code*/
2259 globals, locals);
2260 if (f == NULL)
2261 return NULL;
2262
2263 fastlocals = f->f_localsplus;
2264 freevars = f->f_localsplus + f->f_nlocals;
2265
2266 if (co->co_argcount > 0 ||
2267 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2268 int i;
2269 int n = argcount;
2270 PyObject *kwdict = NULL;
2271 if (co->co_flags & CO_VARKEYWORDS) {
2272 kwdict = PyDict_New();
2273 if (kwdict == NULL)
2274 goto fail;
2275 i = co->co_argcount;
2276 if (co->co_flags & CO_VARARGS)
2277 i++;
2278 SETLOCAL(i, kwdict);
2279 }
2280 if (argcount > co->co_argcount) {
2281 if (!(co->co_flags & CO_VARARGS)) {
2282 PyErr_Format(PyExc_TypeError,
2283 "%.200s() takes %s %d "
2284 "%sargument%s (%d given)",
2285 PyString_AsString(co->co_name),
2286 defcount ? "at most" : "exactly",
2287 co->co_argcount,
2288 kwcount ? "non-keyword " : "",
2289 co->co_argcount == 1 ? "" : "s",
2290 argcount);
2291 goto fail;
2292 }
2293 n = co->co_argcount;
2294 }
2295 for (i = 0; i < n; i++) {
2296 x = args[i];
2297 Py_INCREF(x);
2298 SETLOCAL(i, x);
2299 }
2300 if (co->co_flags & CO_VARARGS) {
2301 u = PyTuple_New(argcount - n);
2302 if (u == NULL)
2303 goto fail;
2304 SETLOCAL(co->co_argcount, u);
2305 for (i = n; i < argcount; i++) {
2306 x = args[i];
2307 Py_INCREF(x);
2308 PyTuple_SET_ITEM(u, i-n, x);
2309 }
2310 }
2311 for (i = 0; i < kwcount; i++) {
2312 PyObject *keyword = kws[2*i];
2313 PyObject *value = kws[2*i + 1];
2314 int j;
2315 if (keyword == NULL || !PyString_Check(keyword)) {
2316 PyErr_Format(PyExc_TypeError,
2317 "%.200s() keywords must be strings",
2318 PyString_AsString(co->co_name));
2319 goto fail;
2320 }
2321 /* XXX slow -- speed up using dictionary? */
2322 for (j = 0; j < co->co_argcount; j++) {
2323 PyObject *nm = PyTuple_GET_ITEM(
2324 co->co_varnames, j);
2325 int cmp = PyObject_RichCompareBool(
2326 keyword, nm, Py_EQ);
2327 if (cmp > 0)
2328 break;
2329 else if (cmp < 0)
2330 goto fail;
2331 }
2332 /* Check errors from Compare */
2333 if (PyErr_Occurred())
2334 goto fail;
2335 if (j >= co->co_argcount) {
2336 if (kwdict == NULL) {
2337 PyErr_Format(PyExc_TypeError,
2338 "%.200s() got an unexpected "
2339 "keyword argument '%.400s'",
2340 PyString_AsString(co->co_name),
2341 PyString_AsString(keyword));
2342 goto fail;
2343 }
2344 PyDict_SetItem(kwdict, keyword, value);
2345 }
2346 else {
2347 if (GETLOCAL(j) != NULL) {
2348 PyErr_Format(PyExc_TypeError,
2349 "%.200s() got multiple "
2350 "values for keyword "
2351 "argument '%.400s'",
2352 PyString_AsString(co->co_name),
2353 PyString_AsString(keyword));
2354 goto fail;
2355 }
2356 Py_INCREF(value);
2357 SETLOCAL(j, value);
2358 }
2359 }
2360 if (argcount < co->co_argcount) {
2361 int m = co->co_argcount - defcount;
2362 for (i = argcount; i < m; i++) {
2363 if (GETLOCAL(i) == NULL) {
2364 PyErr_Format(PyExc_TypeError,
2365 "%.200s() takes %s %d "
2366 "%sargument%s (%d given)",
2367 PyString_AsString(co->co_name),
2368 ((co->co_flags & CO_VARARGS) ||
2369 defcount) ? "at least"
2370 : "exactly",
2371 m, kwcount ? "non-keyword " : "",
2372 m == 1 ? "" : "s", i);
2373 goto fail;
2374 }
2375 }
2376 if (n > m)
2377 i = n - m;
2378 else
2379 i = 0;
2380 for (; i < defcount; i++) {
2381 if (GETLOCAL(m+i) == NULL) {
2382 PyObject *def = defs[i];
2383 Py_INCREF(def);
2384 SETLOCAL(m+i, def);
2385 }
2386 }
2387 }
2388 }
2389 else {
2390 if (argcount > 0 || kwcount > 0) {
2391 PyErr_Format(PyExc_TypeError,
2392 "%.200s() takes no arguments (%d given)",
2393 PyString_AsString(co->co_name),
2394 argcount + kwcount);
2395 goto fail;
2396 }
2397 }
2398 /* Allocate and initialize storage for cell vars, and copy free
2399 vars into frame. This isn't too efficient right now. */
2400 if (f->f_ncells) {
2401 int i = 0, j = 0, nargs, found;
2402 char *cellname, *argname;
2403 PyObject *c;
2404
2405 nargs = co->co_argcount;
2406 if (co->co_flags & CO_VARARGS)
2407 nargs++;
2408 if (co->co_flags & CO_VARKEYWORDS)
2409 nargs++;
2410
2411 /* Check for cells that shadow args */
2412 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2413 cellname = PyString_AS_STRING(
2414 PyTuple_GET_ITEM(co->co_cellvars, i));
2415 found = 0;
2416 while (j < nargs) {
2417 argname = PyString_AS_STRING(
2418 PyTuple_GET_ITEM(co->co_varnames, j));
2419 if (strcmp(cellname, argname) == 0) {
2420 c = PyCell_New(GETLOCAL(j));
2421 if (c == NULL)
2422 goto fail;
2423 GETLOCAL(f->f_nlocals + i) = c;
2424 found = 1;
2425 break;
2426 }
2427 j++;
2428 }
2429 if (found == 0) {
2430 c = PyCell_New(NULL);
2431 if (c == NULL)
2432 goto fail;
2433 SETLOCAL(f->f_nlocals + i, c);
2434 }
2435 }
2436 /* Initialize any that are left */
2437 while (i < f->f_ncells) {
2438 c = PyCell_New(NULL);
2439 if (c == NULL)
2440 goto fail;
2441 SETLOCAL(f->f_nlocals + i, c);
2442 i++;
2443 }
2444 }
2445 if (f->f_nfreevars) {
2446 int i;
2447 for (i = 0; i < f->f_nfreevars; ++i) {
2448 PyObject *o = PyTuple_GET_ITEM(closure, i);
2449 Py_INCREF(o);
2450 freevars[f->f_ncells + i] = o;
2451 }
2452 }
2453
2454 if (tstate->sys_tracefunc != NULL) {
2455 /* tstate->sys_tracefunc, if defined, is a function that
2456 will be called on *every* entry to a code block.
2457 Its return value, if not None, is a function that
2458 will be called at the start of each executed line
2459 of code. (Actually, the function must return
2460 itself in order to continue tracing.)
2461 The trace functions are called with three arguments:
2462 a pointer to the current frame, a string indicating
2463 why the function is called, and an argument which
2464 depends on the situation. The global trace function
2465 (sys.trace) is also called whenever an exception
2466 is detected. */
2467 if (call_trace(&tstate->sys_tracefunc,
2468 &f->f_trace, f, str_call,
2469 Py_None/*XXX how to compute arguments now?*/)) {
2470 /* Trace function raised an error */
2471 goto fail;
2472 }
2473 }
2474
2475 if (tstate->sys_profilefunc != NULL) {
2476 /* Similar for sys_profilefunc, except it needn't return
2477 itself and isn't called for "line" events */
2478 if (call_trace(&tstate->sys_profilefunc,
2479 (PyObject**)0, f, str_call,
2480 Py_None/*XXX*/)) {
2481 goto fail;
2482 }
2483 }
2484
2485 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002486 /* Don't need to keep the reference to f_back, it will be set
2487 * when the generator is resumed. */
2488 Py_DECREF(f->f_back);
2489 f->f_back = NULL;
2490
2491 /* Create a new generator that owns the ready to run frame
2492 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002493 return gen_new(f);
2494 }
2495
2496 retval = eval_frame(f);
2497
2498 fail: /* Jump here from prelude on failure */
2499
2500 Py_DECREF(f);
2501 return retval;
2502}
2503
2504
Guido van Rossuma027efa1997-05-05 20:56:21 +00002505static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002506set_exc_info(PyThreadState *tstate,
2507 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002508{
2509 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002510 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002511
Guido van Rossuma027efa1997-05-05 20:56:21 +00002512 frame = tstate->frame;
2513 if (frame->f_exc_type == NULL) {
2514 /* This frame didn't catch an exception before */
2515 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002516 if (tstate->exc_type == NULL) {
2517 Py_INCREF(Py_None);
2518 tstate->exc_type = Py_None;
2519 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002520 tmp_type = frame->f_exc_type;
2521 tmp_value = frame->f_exc_value;
2522 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002523 Py_XINCREF(tstate->exc_type);
2524 Py_XINCREF(tstate->exc_value);
2525 Py_XINCREF(tstate->exc_traceback);
2526 frame->f_exc_type = tstate->exc_type;
2527 frame->f_exc_value = tstate->exc_value;
2528 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002529 Py_XDECREF(tmp_type);
2530 Py_XDECREF(tmp_value);
2531 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002532 }
2533 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002534 tmp_type = tstate->exc_type;
2535 tmp_value = tstate->exc_value;
2536 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002537 Py_XINCREF(type);
2538 Py_XINCREF(value);
2539 Py_XINCREF(tb);
2540 tstate->exc_type = type;
2541 tstate->exc_value = value;
2542 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002543 Py_XDECREF(tmp_type);
2544 Py_XDECREF(tmp_value);
2545 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002546 /* For b/w compatibility */
2547 PySys_SetObject("exc_type", type);
2548 PySys_SetObject("exc_value", value);
2549 PySys_SetObject("exc_traceback", tb);
2550}
2551
2552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002553reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002554{
2555 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002556 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557 frame = tstate->frame;
2558 if (frame->f_exc_type != NULL) {
2559 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002560 tmp_type = tstate->exc_type;
2561 tmp_value = tstate->exc_value;
2562 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002563 Py_XINCREF(frame->f_exc_type);
2564 Py_XINCREF(frame->f_exc_value);
2565 Py_XINCREF(frame->f_exc_traceback);
2566 tstate->exc_type = frame->f_exc_type;
2567 tstate->exc_value = frame->f_exc_value;
2568 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002569 Py_XDECREF(tmp_type);
2570 Py_XDECREF(tmp_value);
2571 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002572 /* For b/w compatibility */
2573 PySys_SetObject("exc_type", frame->f_exc_type);
2574 PySys_SetObject("exc_value", frame->f_exc_value);
2575 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2576 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002577 tmp_type = frame->f_exc_type;
2578 tmp_value = frame->f_exc_value;
2579 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002580 frame->f_exc_type = NULL;
2581 frame->f_exc_value = NULL;
2582 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002583 Py_XDECREF(tmp_type);
2584 Py_XDECREF(tmp_value);
2585 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586}
2587
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002588/* Logic for the raise statement (too complicated for inlining).
2589 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002590static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002591do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002592{
Guido van Rossumd295f121998-04-09 21:39:57 +00002593 if (type == NULL) {
2594 /* Reraise */
2595 PyThreadState *tstate = PyThreadState_Get();
2596 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2597 value = tstate->exc_value;
2598 tb = tstate->exc_traceback;
2599 Py_XINCREF(type);
2600 Py_XINCREF(value);
2601 Py_XINCREF(tb);
2602 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002603
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002604 /* We support the following forms of raise:
2605 raise <class>, <classinstance>
2606 raise <class>, <argument tuple>
2607 raise <class>, None
2608 raise <class>, <argument>
2609 raise <classinstance>, None
2610 raise <string>, <object>
2611 raise <string>, None
2612
2613 An omitted second argument is the same as None.
2614
2615 In addition, raise <tuple>, <anything> is the same as
2616 raising the tuple's first item (and it better have one!);
2617 this rule is applied recursively.
2618
2619 Finally, an optional third argument can be supplied, which
2620 gives the traceback to be substituted (useful when
2621 re-raising an exception after examining it). */
2622
2623 /* First, check the traceback argument, replacing None with
2624 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002625 if (tb == Py_None) {
2626 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002627 tb = NULL;
2628 }
2629 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002631 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002632 goto raise_error;
2633 }
2634
2635 /* Next, replace a missing value with None */
2636 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002637 value = Py_None;
2638 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002639 }
2640
2641 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002642 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2643 PyObject *tmp = type;
2644 type = PyTuple_GET_ITEM(type, 0);
2645 Py_INCREF(type);
2646 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002647 }
2648
Barry Warsaw4249f541997-08-22 21:26:19 +00002649 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002650 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002651
2652 else if (PyClass_Check(type))
2653 PyErr_NormalizeException(&type, &value, &tb);
2654
Guido van Rossumb209a111997-04-29 18:18:01 +00002655 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002656 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 if (value != Py_None) {
2658 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002659 "instance exception may not have a separate value");
2660 goto raise_error;
2661 }
2662 else {
2663 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002665 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2667 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002668 }
2669 }
2670 else {
2671 /* Not something you can raise. You get an exception
2672 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002673 PyErr_Format(PyExc_TypeError,
2674 "exceptions must be strings, classes, or "
2675 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002676 goto raise_error;
2677 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002679 if (tb == NULL)
2680 return WHY_EXCEPTION;
2681 else
2682 return WHY_RERAISE;
2683 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 Py_XDECREF(value);
2685 Py_XDECREF(type);
2686 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002687 return WHY_EXCEPTION;
2688}
2689
Tim Petersd6d010b2001-06-21 02:49:55 +00002690/* Iterate v argcnt times and store the results on the stack (via decreasing
2691 sp). Return 1 for success, 0 if error. */
2692
Barry Warsawe42b18f1997-08-25 22:13:04 +00002693static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002694unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002695{
Tim Petersd6d010b2001-06-21 02:49:55 +00002696 int i = 0;
2697 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002698 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002699
Tim Petersd6d010b2001-06-21 02:49:55 +00002700 assert(v != NULL);
2701
2702 it = PyObject_GetIter(v);
2703 if (it == NULL)
2704 goto Error;
2705
2706 for (; i < argcnt; i++) {
2707 w = PyIter_Next(it);
2708 if (w == NULL) {
2709 /* Iterator done, via error or exhaustion. */
2710 if (!PyErr_Occurred()) {
2711 PyErr_Format(PyExc_ValueError,
2712 "need more than %d value%s to unpack",
2713 i, i == 1 ? "" : "s");
2714 }
2715 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002716 }
2717 *--sp = w;
2718 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002719
2720 /* We better have exhausted the iterator now. */
2721 w = PyIter_Next(it);
2722 if (w == NULL) {
2723 if (PyErr_Occurred())
2724 goto Error;
2725 Py_DECREF(it);
2726 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002727 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002728 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002729 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002730Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002731 for (; i > 0; i--, sp++)
2732 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002733 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002734 return 0;
2735}
2736
2737
Guido van Rossum96a42c81992-01-12 02:29:51 +00002738#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002739static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002740prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002742 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 if (PyObject_Print(v, stdout, 0) != 0)
2744 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002745 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002746 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002748#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002750static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002751call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002752{
Guido van Rossumb209a111997-04-29 18:18:01 +00002753 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002754 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002756 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 value = Py_None;
2758 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002759 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002761 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002763 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002764 }
Fred Draked0838392001-06-16 21:02:31 +00002765 err = call_trace(p_trace, p_newtrace, f, str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002766 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002767 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002769 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002770 Py_XDECREF(type);
2771 Py_XDECREF(value);
2772 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002773 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002774}
2775
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002776/* PyObject **p_trace: in/out; may not be NULL;
2777 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002778 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002779 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002780 may be same variable as p_newtrace
Fred Draked0838392001-06-16 21:02:31 +00002781 PyObject *msg: in; must not be NULL
Fred Drake904aa7b2001-06-08 04:33:09 +00002782*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002783
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002784static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002785call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Draked0838392001-06-16 21:02:31 +00002786 PyObject *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002787{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002788 PyThreadState *tstate = f->f_tstate;
Fred Draked0838392001-06-16 21:02:31 +00002789 PyObject *args;
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002791
Guido van Rossuma027efa1997-05-05 20:56:21 +00002792 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002793 /* Don't do recursive traces */
2794 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002795 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002796 *p_newtrace = NULL;
2797 }
2798 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002799 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002800
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002802 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002803 goto cleanup;
Fred Draked0838392001-06-16 21:02:31 +00002804 Py_INCREF(msg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002805 Py_INCREF(f);
2806 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
Fred Draked0838392001-06-16 21:02:31 +00002807 PyTuple_SET_ITEM(args, 1, msg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002808 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 arg = Py_None;
2810 Py_INCREF(arg);
2811 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002812 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002813 PyFrame_FastToLocals(f);
2814 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2815 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002816 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002817 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002819 if (res == NULL) {
2820 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 PyTraceBack_Here(f);
2822 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002823 *p_trace = NULL;
2824 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002826 *p_newtrace = NULL;
2827 }
Barry Warsawf6202631999-09-08 16:26:33 +00002828 /* to be extra double plus sure we don't get recursive
2829 * calls inf either tracefunc or profilefunc gets an
2830 * exception, zap the global variables.
2831 */
2832 Py_XDECREF(tstate->sys_tracefunc);
2833 tstate->sys_tracefunc = NULL;
2834 Py_XDECREF(tstate->sys_profilefunc);
2835 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002836 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002837 }
2838 else {
2839 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 Py_XDECREF(*p_newtrace);
2841 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002842 *p_newtrace = NULL;
2843 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002844 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002845 *p_newtrace = res;
2846 }
2847 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002848 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002849 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002850 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002851}
2852
Fred Draked0838392001-06-16 21:02:31 +00002853/* Initialize the strings that get passed to the profile and trace functions;
2854 * this avoids doing this while we're actually profiling/tracing.
2855 */
2856int
2857_PyTrace_Init(void)
2858{
2859 if (str_call == NULL) {
2860 str_call = PyString_InternFromString("call");
2861 if (str_call == NULL)
2862 return -1;
2863 }
2864 if (str_exception == NULL) {
2865 str_exception = PyString_InternFromString("exception");
2866 if (str_exception == NULL)
2867 return -1;
2868 }
2869 if (str_line == NULL) {
2870 str_line = PyString_InternFromString("line");
2871 if (str_line == NULL)
2872 return -1;
2873 }
2874 if (str_return == NULL) {
2875 str_return = PyString_InternFromString("return");
2876 if (str_return == NULL)
2877 return -1;
2878 }
2879 return 0;
2880}
2881
Guido van Rossumb209a111997-04-29 18:18:01 +00002882PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002883PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002884{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002885 PyThreadState *tstate = PyThreadState_Get();
2886 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002887 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002888 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002889 else
2890 return current_frame->f_builtins;
2891}
2892
Guido van Rossumb209a111997-04-29 18:18:01 +00002893PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002894PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002895{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002896 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002897 if (current_frame == NULL)
2898 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002899 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002900 return current_frame->f_locals;
2901}
2902
Guido van Rossumb209a111997-04-29 18:18:01 +00002903PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002904PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002905{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002906 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002907 if (current_frame == NULL)
2908 return NULL;
2909 else
2910 return current_frame->f_globals;
2911}
2912
Guido van Rossumb209a111997-04-29 18:18:01 +00002913PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002914PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002915{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002916 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002917 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002918}
2919
Guido van Rossum6135a871995-01-09 17:53:26 +00002920int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002921PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002922{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002923 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002924 return current_frame == NULL ? 0 : current_frame->f_restricted;
2925}
2926
Guido van Rossumbe270261997-05-22 22:26:18 +00002927int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002928PyEval_GetNestedScopes(void)
2929{
2930 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2931 return current_frame == NULL ? 0 :
2932 current_frame->f_code->co_flags & CO_NESTED;
2933}
2934
2935int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002936Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937{
Guido van Rossumb209a111997-04-29 18:18:01 +00002938 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002939 if (f == NULL)
2940 return 0;
2941 if (!PyFile_SoftSpace(f, 0))
2942 return 0;
2943 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944}
2945
Guido van Rossum3f5da241990-12-20 15:06:42 +00002946
Guido van Rossum681d79a1995-07-18 14:51:37 +00002947/* External interface to call any callable object.
2948 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002949
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002950#undef PyEval_CallObject
2951/* for backward compatibility: export this interface */
2952
Guido van Rossumb209a111997-04-29 18:18:01 +00002953PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002954PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002955{
Guido van Rossumb209a111997-04-29 18:18:01 +00002956 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002957}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002958#define PyEval_CallObject(func,arg) \
2959 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002960
Guido van Rossumb209a111997-04-29 18:18:01 +00002961PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002962PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002963{
Jeremy Hylton52820442001-01-03 23:52:36 +00002964 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002965
2966 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002967 arg = PyTuple_New(0);
2968 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002969 PyErr_SetString(PyExc_TypeError,
2970 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002971 return NULL;
2972 }
2973 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002974 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002975
Guido van Rossumb209a111997-04-29 18:18:01 +00002976 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002977 PyErr_SetString(PyExc_TypeError,
2978 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002979 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002980 return NULL;
2981 }
2982
Jeremy Hylton52820442001-01-03 23:52:36 +00002983 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002984 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002985 return result;
2986}
2987
2988/* How often is each kind of object called? The answer depends on the
2989 program. An instrumented call_object() was used to run the Python
2990 regression test suite. The results were:
2991 4200000 PyCFunctions
2992 390000 fast_function() calls
2993 94000 other functions
2994 480000 all functions (sum of prev two)
2995 150000 methods
2996 100000 classes
2997
2998 Tests on other bodies of code show that PyCFunctions are still
2999 most common, but not by such a large margin.
3000*/
3001
Jeremy Hylton512a2372001-04-11 13:52:29 +00003002static char *
3003get_func_name(PyObject *func)
3004{
3005 if (PyMethod_Check(func))
3006 return get_func_name(PyMethod_GET_FUNCTION(func));
3007 else if (PyFunction_Check(func))
3008 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3009 else if (PyCFunction_Check(func))
3010 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3011 else if (PyClass_Check(func))
3012 return PyString_AsString(((PyClassObject*)func)->cl_name);
3013 else if (PyInstance_Check(func)) {
3014 return PyString_AsString(
3015 ((PyInstanceObject*)func)->in_class->cl_name);
3016 } else {
3017 return func->ob_type->tp_name;
3018 }
3019}
3020
3021static char *
3022get_func_desc(PyObject *func)
3023{
3024 if (PyMethod_Check(func))
3025 return "()";
3026 else if (PyFunction_Check(func))
3027 return "()";
3028 else if (PyCFunction_Check(func))
3029 return "()";
3030 else if (PyClass_Check(func))
3031 return " constructor";
3032 else if (PyInstance_Check(func)) {
3033 return " instance";
3034 } else {
3035 return " object";
3036 }
3037}
3038
Jeremy Hylton52820442001-01-03 23:52:36 +00003039static PyObject *
3040call_object(PyObject *func, PyObject *arg, PyObject *kw)
3041{
3042 ternaryfunc call;
3043 PyObject *result;
3044
3045 if (PyMethod_Check(func))
3046 result = call_method(func, arg, kw);
3047 else if (PyFunction_Check(func))
3048 result = call_eval_code2(func, arg, kw);
3049 else if (PyCFunction_Check(func))
3050 result = call_cfunction(func, arg, kw);
3051 else if (PyClass_Check(func))
3052 result = PyInstance_New(func, arg, kw);
3053 else if (PyInstance_Check(func))
3054 result = call_instance(func, arg, kw);
3055 else if ((call = func->ob_type->tp_call) != NULL)
3056 result = (*call)(func, arg, kw);
3057 else {
Tim Peters239508c2001-06-16 00:09:28 +00003058 PyErr_Format(PyExc_TypeError,
3059 "object of type '%.100s' is not callable",
3060 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003061 return NULL;
3062 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003063 if (result == NULL && !PyErr_Occurred())
3064 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003065 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003066
Guido van Rossume59214e1994-08-30 08:01:59 +00003067 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003068}
3069
Guido van Rossumb209a111997-04-29 18:18:01 +00003070static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003071call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072{
Jeremy Hylton52820442001-01-03 23:52:36 +00003073 PyCFunctionObject* f = (PyCFunctionObject*)func;
3074 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3075 PyObject *self = PyCFunction_GET_SELF(func);
3076 int flags = PyCFunction_GET_FLAGS(func);
3077
Jeremy Hylton52820442001-01-03 23:52:36 +00003078 if (flags & METH_KEYWORDS) {
3079 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003081 if (kw != NULL && PyDict_Size(kw) != 0) {
3082 PyErr_Format(PyExc_TypeError,
3083 "%.200s() takes no keyword arguments",
3084 f->m_ml->ml_name);
3085 return NULL;
3086 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003087 if (flags & METH_VARARGS) {
3088 return (*meth)(self, arg);
3089 }
3090 if (!(flags & METH_VARARGS)) {
3091 /* the really old style */
3092 int size = PyTuple_GET_SIZE(arg);
3093 if (size == 1)
3094 arg = PyTuple_GET_ITEM(arg, 0);
3095 else if (size == 0)
3096 arg = NULL;
3097 return (*meth)(self, arg);
3098 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003099 /* should never get here ??? */
3100 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101 return NULL;
3102}
3103
Guido van Rossumb209a111997-04-29 18:18:01 +00003104static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003105call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106{
Jeremy Hylton52820442001-01-03 23:52:36 +00003107 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3108 if (call == NULL) {
3109 PyInstanceObject *inst = (PyInstanceObject*) func;
3110 PyErr_Clear();
3111 PyErr_Format(PyExc_AttributeError,
3112 "%.200s instance has no __call__ method",
3113 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003114 return NULL;
3115 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003116 res = call_object(call, arg, kw);
3117 Py_DECREF(call);
3118 return res;
3119}
3120
3121static PyObject *
3122call_method(PyObject *func, PyObject *arg, PyObject *kw)
3123{
3124 PyObject *self = PyMethod_GET_SELF(func);
3125 PyObject *class = PyMethod_GET_CLASS(func);
3126 PyObject *result;
3127
3128 func = PyMethod_GET_FUNCTION(func);
3129 if (self == NULL) {
3130 /* Unbound methods must be called with an instance of
3131 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003132 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003133 if (PyTuple_Size(arg) >= 1)
3134 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003135 if (self == NULL)
3136 ok = 0;
3137 else {
3138 ok = PyObject_IsInstance(self, class);
3139 if (ok < 0)
3140 return NULL;
3141 }
3142 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003143 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003144 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003145 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003146 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 return NULL;
3148 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003149 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003150 }
3151 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003152 int argcount = PyTuple_Size(arg);
3153 PyObject *newarg = PyTuple_New(argcount + 1);
3154 int i;
3155 if (newarg == NULL)
3156 return NULL;
3157 Py_INCREF(self);
3158 PyTuple_SET_ITEM(newarg, 0, self);
3159 for (i = 0; i < argcount; i++) {
3160 PyObject *v = PyTuple_GET_ITEM(arg, i);
3161 Py_XINCREF(v);
3162 PyTuple_SET_ITEM(newarg, i+1, v);
3163 }
3164 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003166 result = call_object(func, arg, kw);
3167 Py_DECREF(arg);
3168 return result;
3169}
3170
3171static PyObject *
3172call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3173{
3174 PyObject *result;
3175 PyObject *argdefs;
3176 PyObject **d, **k;
3177 int nk, nd;
3178
3179 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003180 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3181 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3182 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003183 }
3184 else {
3185 d = NULL;
3186 nd = 0;
3187 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003188
Guido van Rossum681d79a1995-07-18 14:51:37 +00003189 if (kw != NULL) {
3190 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003191 nk = PyDict_Size(kw);
3192 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003193 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003194 PyErr_NoMemory();
3195 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003196 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003197 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003198 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003199 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003200 i += 2;
3201 nk = i/2;
3202 /* XXX This is broken if the caller deletes dict items! */
3203 }
3204 else {
3205 k = NULL;
3206 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003207 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003208
Guido van Rossum681d79a1995-07-18 14:51:37 +00003209 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003210 (PyCodeObject *)PyFunction_GET_CODE(func),
3211 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003212 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003213 k, nk, d, nd,
3214 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003215
Guido van Rossumb18618d2000-05-03 23:44:39 +00003216 if (k != NULL)
3217 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003218
Guido van Rossum681d79a1995-07-18 14:51:37 +00003219 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220}
3221
Jeremy Hylton52820442001-01-03 23:52:36 +00003222#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3223
3224/* The two fast_xxx() functions optimize calls for which no argument
3225 tuple is necessary; the objects are passed directly from the stack.
3226 fast_cfunction() is called for METH_OLDARGS functions.
3227 fast_function() is for functions with no special argument handling.
3228*/
3229
3230static PyObject *
3231fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3232{
3233 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3234 PyObject *self = PyCFunction_GET_SELF(func);
3235
3236 if (na == 0)
3237 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003238 else if (na == 1) {
3239 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003240 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003241 Py_DECREF(arg);
3242 return result;
3243 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003244 PyObject *args = load_args(pp_stack, na);
3245 PyObject *result = (*meth)(self, args);
3246 Py_DECREF(args);
3247 return result;
3248 }
3249}
3250
3251static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003252fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003253{
3254 PyObject *co = PyFunction_GET_CODE(func);
3255 PyObject *globals = PyFunction_GET_GLOBALS(func);
3256 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003257 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003258 PyObject **d = NULL;
3259 int nd = 0;
3260
3261 if (argdefs != NULL) {
3262 d = &PyTuple_GET_ITEM(argdefs, 0);
3263 nd = ((PyTupleObject *)argdefs)->ob_size;
3264 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003265 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003266 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003267 (*pp_stack)-2*nk, nk, d, nd,
3268 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003269}
3270
3271static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003272update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3273 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003274{
3275 PyObject *kwdict = NULL;
3276 if (orig_kwdict == NULL)
3277 kwdict = PyDict_New();
3278 else {
3279 kwdict = PyDict_Copy(orig_kwdict);
3280 Py_DECREF(orig_kwdict);
3281 }
3282 if (kwdict == NULL)
3283 return NULL;
3284 while (--nk >= 0) {
3285 int err;
3286 PyObject *value = EXT_POP(*pp_stack);
3287 PyObject *key = EXT_POP(*pp_stack);
3288 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003289 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003290 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003291 "for keyword argument '%.200s'",
3292 get_func_name(func),
3293 get_func_desc(func),
3294 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003295 Py_DECREF(key);
3296 Py_DECREF(value);
3297 Py_DECREF(kwdict);
3298 return NULL;
3299 }
3300 err = PyDict_SetItem(kwdict, key, value);
3301 Py_DECREF(key);
3302 Py_DECREF(value);
3303 if (err) {
3304 Py_DECREF(kwdict);
3305 return NULL;
3306 }
3307 }
3308 return kwdict;
3309}
3310
3311static PyObject *
3312update_star_args(int nstack, int nstar, PyObject *stararg,
3313 PyObject ***pp_stack)
3314{
3315 PyObject *callargs, *w;
3316
3317 callargs = PyTuple_New(nstack + nstar);
3318 if (callargs == NULL) {
3319 return NULL;
3320 }
3321 if (nstar) {
3322 int i;
3323 for (i = 0; i < nstar; i++) {
3324 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3325 Py_INCREF(a);
3326 PyTuple_SET_ITEM(callargs, nstack + i, a);
3327 }
3328 }
3329 while (--nstack >= 0) {
3330 w = EXT_POP(*pp_stack);
3331 PyTuple_SET_ITEM(callargs, nstack, w);
3332 }
3333 return callargs;
3334}
3335
3336static PyObject *
3337load_args(PyObject ***pp_stack, int na)
3338{
3339 PyObject *args = PyTuple_New(na);
3340 PyObject *w;
3341
3342 if (args == NULL)
3343 return NULL;
3344 while (--na >= 0) {
3345 w = EXT_POP(*pp_stack);
3346 PyTuple_SET_ITEM(args, na, w);
3347 }
3348 return args;
3349}
3350
3351static PyObject *
3352do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3353{
3354 PyObject *callargs = NULL;
3355 PyObject *kwdict = NULL;
3356 PyObject *result = NULL;
3357
3358 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003359 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003360 if (kwdict == NULL)
3361 goto call_fail;
3362 }
3363 callargs = load_args(pp_stack, na);
3364 if (callargs == NULL)
3365 goto call_fail;
3366 result = call_object(func, callargs, kwdict);
3367 call_fail:
3368 Py_XDECREF(callargs);
3369 Py_XDECREF(kwdict);
3370 return result;
3371}
3372
3373static PyObject *
3374ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3375{
3376 int nstar = 0;
3377 PyObject *callargs = NULL;
3378 PyObject *stararg = NULL;
3379 PyObject *kwdict = NULL;
3380 PyObject *result = NULL;
3381
3382 if (flags & CALL_FLAG_KW) {
3383 kwdict = EXT_POP(*pp_stack);
3384 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003385 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003386 "%s%s argument after ** "
3387 "must be a dictionary",
3388 get_func_name(func),
3389 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003390 goto ext_call_fail;
3391 }
3392 }
3393 if (flags & CALL_FLAG_VAR) {
3394 stararg = EXT_POP(*pp_stack);
3395 if (!PyTuple_Check(stararg)) {
3396 PyObject *t = NULL;
3397 t = PySequence_Tuple(stararg);
3398 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003399 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3400 PyErr_Format(PyExc_TypeError,
3401 "%s%s argument after * "
3402 "must be a sequence",
3403 get_func_name(func),
3404 get_func_desc(func));
3405 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003406 goto ext_call_fail;
3407 }
3408 Py_DECREF(stararg);
3409 stararg = t;
3410 }
3411 nstar = PyTuple_GET_SIZE(stararg);
3412 }
3413 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003414 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003415 if (kwdict == NULL)
3416 goto ext_call_fail;
3417 }
3418 callargs = update_star_args(na, nstar, stararg, pp_stack);
3419 if (callargs == NULL)
3420 goto ext_call_fail;
3421 result = call_object(func, callargs, kwdict);
3422 ext_call_fail:
3423 Py_XDECREF(callargs);
3424 Py_XDECREF(kwdict);
3425 Py_XDECREF(stararg);
3426 return result;
3427}
3428
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003429#define SLICE_ERROR_MSG \
3430 "standard sequence type does not support step size other than one"
3431
Guido van Rossumb209a111997-04-29 18:18:01 +00003432static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003433loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003434{
Guido van Rossumb209a111997-04-29 18:18:01 +00003435 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003436 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003437 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003438 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 return NULL;
3440 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003441 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003442 v = (*sq->sq_item)(v, i);
3443 if (v)
3444 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003445 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003446 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003447 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448}
3449
Guido van Rossum20c6add2000-05-08 14:06:50 +00003450/* Extract a slice index from a PyInt or PyLong, the index is bound to
3451 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3452 and error. Returns 1 on success.*/
3453
3454int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003455_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456{
3457 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003458 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003459 if (PyInt_Check(v)) {
3460 x = PyInt_AsLong(v);
3461 } else if (PyLong_Check(v)) {
3462 x = PyLong_AsLong(v);
3463 if (x==-1 && PyErr_Occurred()) {
3464 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003465 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003466
Guido van Rossumac7be682001-01-17 15:42:30 +00003467 if (!PyErr_ExceptionMatches(
3468 PyExc_OverflowError)) {
3469 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003470 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003471 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003472 }
3473
Guido van Rossumac7be682001-01-17 15:42:30 +00003474 /* Clear the OverflowError */
3475 PyErr_Clear();
3476
3477 /* It's an overflow error, so we need to
3478 check the sign of the long integer,
3479 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003480 the error. */
3481
3482 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003483 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003484 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003485
3486 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003487 cmp = PyObject_RichCompareBool(v, long_zero,
3488 Py_GT);
3489 Py_DECREF(long_zero);
3490 if (cmp < 0)
3491 return 0;
3492 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003493 x = INT_MAX;
3494 else
3495 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003496 }
3497 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003498 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003499 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003500 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003501 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003502 /* Truncate -- very long indices are truncated anyway */
3503 if (x > INT_MAX)
3504 x = INT_MAX;
3505 else if (x < -INT_MAX)
3506 x = 0;
3507 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003509 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510}
3511
Guido van Rossumb209a111997-04-29 18:18:01 +00003512static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003513apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003515 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003516 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003518 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003519 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003520 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003522
3523static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003524assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3525 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003527 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003528 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003529 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003530 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003531 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003532 if (x == NULL)
3533 return PySequence_DelSlice(u, ilow, ihigh);
3534 else
3535 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003536}
3537
Guido van Rossumb209a111997-04-29 18:18:01 +00003538static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003539cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003540{
Guido van Rossumac7be682001-01-17 15:42:30 +00003541 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003543 case IS:
3544 case IS_NOT:
3545 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003546 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003547 res = !res;
3548 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003549 case IN:
3550 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003551 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003552 if (res < 0)
3553 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003554 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003555 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003556 break;
3557 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003558 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559 break;
3560 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003561 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003562 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003563 v = res ? Py_True : Py_False;
3564 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003565 return v;
3566}
3567
Thomas Wouters52152252000-08-17 22:55:00 +00003568static PyObject *
3569import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003570{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003571 PyObject *x;
3572
3573 x = PyObject_GetAttr(v, name);
3574 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003575 PyErr_Format(PyExc_ImportError,
3576 "cannot import name %.230s",
3577 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003578 }
Thomas Wouters52152252000-08-17 22:55:00 +00003579 return x;
3580}
Guido van Rossumac7be682001-01-17 15:42:30 +00003581
Thomas Wouters52152252000-08-17 22:55:00 +00003582static int
3583import_all_from(PyObject *locals, PyObject *v)
3584{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003585 PyObject *all = PyObject_GetAttrString(v, "__all__");
3586 PyObject *dict, *name, *value;
3587 int skip_leading_underscores = 0;
3588 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003589
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003590 if (all == NULL) {
3591 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3592 return -1; /* Unexpected error */
3593 PyErr_Clear();
3594 dict = PyObject_GetAttrString(v, "__dict__");
3595 if (dict == NULL) {
3596 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3597 return -1;
3598 PyErr_SetString(PyExc_ImportError,
3599 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003600 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003601 }
3602 all = PyMapping_Keys(dict);
3603 Py_DECREF(dict);
3604 if (all == NULL)
3605 return -1;
3606 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003607 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003608
3609 for (pos = 0, err = 0; ; pos++) {
3610 name = PySequence_GetItem(all, pos);
3611 if (name == NULL) {
3612 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3613 err = -1;
3614 else
3615 PyErr_Clear();
3616 break;
3617 }
3618 if (skip_leading_underscores &&
3619 PyString_Check(name) &&
3620 PyString_AS_STRING(name)[0] == '_')
3621 {
3622 Py_DECREF(name);
3623 continue;
3624 }
3625 value = PyObject_GetAttr(v, name);
3626 if (value == NULL)
3627 err = -1;
3628 else
3629 err = PyDict_SetItem(locals, name, value);
3630 Py_DECREF(name);
3631 Py_XDECREF(value);
3632 if (err != 0)
3633 break;
3634 }
3635 Py_DECREF(all);
3636 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003637}
3638
Guido van Rossumb209a111997-04-29 18:18:01 +00003639static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003640build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003641{
Guido van Rossumcd649651997-08-22 16:56:16 +00003642 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003643 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003644 PyErr_SetString(PyExc_SystemError,
3645 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003646 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003647 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003648 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003649 PyErr_SetString(PyExc_SystemError,
3650 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003651 return NULL;
3652 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003653 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003654 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003655 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003656 return NULL;
3657 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003658 n = PyTuple_Size(bases);
3659 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003660 PyObject *base = PyTuple_GET_ITEM(bases, i);
3661 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003662 /* Call the base's *type*, if it is callable.
3663 This code is a hook for Donald Beaudry's
3664 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003665 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003666 since its types are not callable.
3667 Ditto: call the bases's *class*, if it has
3668 one. This makes the same thing possible
3669 without writing C code. A true meta-object
3670 protocol! */
3671 PyObject *basetype = (PyObject *)base->ob_type;
3672 PyObject *callable = NULL;
3673 if (PyCallable_Check(basetype))
3674 callable = basetype;
3675 else
3676 callable = PyObject_GetAttrString(
3677 base, "__class__");
3678 if (callable) {
3679 PyObject *args;
3680 PyObject *newclass = NULL;
3681 args = Py_BuildValue(
3682 "(OOO)", name, bases, methods);
3683 if (args != NULL) {
3684 newclass = PyEval_CallObject(
3685 callable, args);
3686 Py_DECREF(args);
3687 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003688 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003689 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003690 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003691 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003692 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003693 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003694 "base is not a class object");
3695 return NULL;
3696 }
3697 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003698 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003699}
3700
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003701static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003702exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3703 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003704{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003705 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003706 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003707 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003708
Guido van Rossumb209a111997-04-29 18:18:01 +00003709 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3710 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003711 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003712 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003713 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003714 locals = PyTuple_GetItem(prog, 2);
3715 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003716 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003717 if (globals == Py_None) {
3718 globals = PyEval_GetGlobals();
3719 if (locals == Py_None) {
3720 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003721 plain = 1;
3722 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003723 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003724 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003725 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003726 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003727 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003728 !PyCode_Check(prog) &&
3729 !PyFile_Check(prog)) {
3730 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003731 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003732 return -1;
3733 }
Fred Drake661ea262000-10-24 19:57:45 +00003734 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003735 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003736 "exec: arg 2 must be a dictionary or None");
3737 return -1;
3738 }
3739 if (!PyDict_Check(locals)) {
3740 PyErr_SetString(PyExc_TypeError,
3741 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003742 return -1;
3743 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003744 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003745 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003746 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003747 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003748 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003749 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003750 FILE *fp = PyFile_AsFile(prog);
3751 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003752 if (PyEval_GetNestedScopes()) {
3753 PyCompilerFlags cf;
3754 cf.cf_nested_scopes = 1;
3755 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3756 locals, &cf);
3757 } else {
3758 v = PyRun_File(fp, name, Py_file_input, globals,
3759 locals);
3760 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003761 }
3762 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003763 char *str;
3764 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003765 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003766 if (PyEval_GetNestedScopes()) {
3767 PyCompilerFlags cf;
3768 cf.cf_nested_scopes = 1;
3769 v = PyRun_StringFlags(str, Py_file_input, globals,
3770 locals, &cf);
3771 } else
3772 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003773 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003774 if (plain)
3775 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003776 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003777 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003778 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003779 return 0;
3780}
Guido van Rossum24c13741995-02-14 09:42:43 +00003781
Guido van Rossumac7be682001-01-17 15:42:30 +00003782static void
Paul Prescode68140d2000-08-30 20:25:01 +00003783format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3784{
3785 char *obj_str;
3786
3787 if (!obj)
3788 return;
3789
3790 obj_str = PyString_AsString(obj);
3791 if (!obj_str)
3792 return;
3793
3794 PyErr_Format(exc, format_str, obj_str);
3795}
Guido van Rossum950361c1997-01-24 13:49:28 +00003796
3797#ifdef DYNAMIC_EXECUTION_PROFILE
3798
3799PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003800getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003801{
3802 int i;
3803 PyObject *l = PyList_New(256);
3804 if (l == NULL) return NULL;
3805 for (i = 0; i < 256; i++) {
3806 PyObject *x = PyInt_FromLong(a[i]);
3807 if (x == NULL) {
3808 Py_DECREF(l);
3809 return NULL;
3810 }
3811 PyList_SetItem(l, i, x);
3812 }
3813 for (i = 0; i < 256; i++)
3814 a[i] = 0;
3815 return l;
3816}
3817
3818PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003819_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003820{
3821#ifndef DXPAIRS
3822 return getarray(dxp);
3823#else
3824 int i;
3825 PyObject *l = PyList_New(257);
3826 if (l == NULL) return NULL;
3827 for (i = 0; i < 257; i++) {
3828 PyObject *x = getarray(dxpairs[i]);
3829 if (x == NULL) {
3830 Py_DECREF(l);
3831 return NULL;
3832 }
3833 PyList_SetItem(l, i, x);
3834 }
3835 return l;
3836#endif
3837}
3838
3839#endif