blob: 79eb0add7f76ff1d918c5e76fc5eaed35a52209e [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Fred Drake5755ce62001-06-27 19:19:46 +00005 XXX how to pass arguments to profile and trace functions?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000035
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static PyObject *eval_code2(PyCodeObject *,
37 PyObject *, PyObject *,
38 PyObject **, int,
39 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000040 PyObject **, int,
41 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000042
Tim Peters5ca576e2001-06-18 22:08:13 +000043static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton512a2372001-04-11 13:52:29 +000044static char *get_func_name(PyObject *);
45static char *get_func_desc(PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000046static PyObject *call_object(PyObject *, PyObject *, PyObject *);
47static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
48static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
49static PyObject *call_method(PyObject *, PyObject *, PyObject *);
50static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
51static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
52static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
53static PyObject *do_call(PyObject *, PyObject ***, int, int);
54static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000055static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000056static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000057static PyObject *load_args(PyObject ***, int);
58#define CALL_FLAG_VAR 1
59#define CALL_FLAG_KW 2
60
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000063#endif
Fred Drake5755ce62001-06-27 19:19:46 +000064static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
65 int, PyObject *);
66static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000067static PyObject *loop_subscript(PyObject *, PyObject *);
68static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
69static int assign_slice(PyObject *, PyObject *,
70 PyObject *, PyObject *);
71static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000072static PyObject *import_from(PyObject *, PyObject *);
73static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static PyObject *build_class(PyObject *, PyObject *, PyObject *);
75static int exec_statement(PyFrameObject *,
76 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000077static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
78static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000079static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000080
Paul Prescode68140d2000-08-30 20:25:01 +000081#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000082 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083#define GLOBAL_NAME_ERROR_MSG \
84 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000085#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000086 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000087#define UNBOUNDFREE_ERROR_MSG \
88 "free variable '%.200s' referenced before assignment" \
89 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000090
Guido van Rossum950361c1997-01-24 13:49:28 +000091/* Dynamic execution profile */
92#ifdef DYNAMIC_EXECUTION_PROFILE
93#ifdef DXPAIRS
94static long dxpairs[257][256];
95#define dxp dxpairs[256]
96#else
97static long dxp[256];
98#endif
99#endif
100
Fred Drake904aa7b2001-06-08 04:33:09 +0000101
Tim Peters5ca576e2001-06-18 22:08:13 +0000102staticforward PyTypeObject gentype;
103
104typedef struct {
105 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000106 /* The gi_ prefix is intended to remind of generator-iterator. */
107
108 PyFrameObject *gi_frame;
109
Tim Peterse77f2e22001-06-26 22:24:51 +0000110 /* True if generator is being executed. */
111 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +0000112} genobject;
113
114static PyObject *
115gen_new(PyFrameObject *f)
116{
117 genobject *gen = PyObject_New(genobject, &gentype);
118 if (gen == NULL) {
119 Py_DECREF(f);
120 return NULL;
121 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000122 gen->gi_frame = f;
123 gen->gi_running = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +0000124 return (PyObject *)gen;
125}
126
127static void
128gen_dealloc(genobject *gen)
129{
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000130 Py_DECREF(gen->gi_frame);
Tim Peters5ca576e2001-06-18 22:08:13 +0000131 PyObject_DEL(gen);
132}
133
134static PyObject *
135gen_iternext(genobject *gen)
136{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000137 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000138 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000139 PyObject *result;
140
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000141 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000142 PyErr_SetString(PyExc_ValueError,
143 "generator already executing");
144 return NULL;
145 }
Tim Peters8c963692001-06-23 05:26:56 +0000146 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000147 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000148
149 /* Generators always return to their most recent caller, not
150 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000151 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000152 assert(f->f_back == NULL);
153 f->f_back = tstate->frame;
154
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000155 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000156 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000157 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000158
159 /* Don't keep the reference to f_back any longer than necessary. It
160 * may keep a chain of frames alive or it could create a reference
161 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000162 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000163 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000164
Tim Petersad1a18b2001-06-23 06:19:16 +0000165 /* If the generator just returned (as opposed to yielding), signal
166 * that the generator is exhausted. */
167 if (result == Py_None && f->f_stacktop == NULL) {
168 Py_DECREF(result);
169 result = NULL;
170 }
171
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000172 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000173}
174
175static PyObject *
176gen_next(genobject *gen, PyObject *args)
177{
178 PyObject *result;
179
180 if (!PyArg_ParseTuple(args, ":next"))
181 return NULL;
182
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000183 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000184
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000185 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000186 PyErr_SetObject(PyExc_StopIteration, Py_None);
187 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000188 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000189
190 return result;
191}
192
193static PyObject *
194gen_getiter(PyObject *gen)
195{
196 Py_INCREF(gen);
197 return gen;
198}
199
200static struct PyMethodDef gen_methods[] = {
201 {"next", (PyCFunction)gen_next, METH_VARARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000202 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000203 {NULL, NULL} /* Sentinel */
204};
205
206static PyObject *
207gen_getattr(genobject *gen, char *name)
208{
Tim Peterse77f2e22001-06-26 22:24:51 +0000209 PyObject *result;
210
211 if (strcmp(name, "gi_frame") == 0) {
212 result = (PyObject *)gen->gi_frame;
213 assert(result != NULL);
214 Py_INCREF(result);
215 }
216 else if (strcmp(name, "gi_running") == 0)
217 result = (PyObject *)PyInt_FromLong((long)gen->gi_running);
218 else if (strcmp(name, "__members__") == 0)
219 result = Py_BuildValue("[ss]", "gi_frame", "gi_running");
220 else
221 result = Py_FindMethod(gen_methods, (PyObject *)gen, name);
222 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000223}
224
225statichere PyTypeObject gentype = {
226 PyObject_HEAD_INIT(&PyType_Type)
227 0, /* ob_size */
228 "generator", /* tp_name */
229 sizeof(genobject), /* tp_basicsize */
230 0, /* tp_itemsize */
231 /* methods */
232 (destructor)gen_dealloc, /* tp_dealloc */
233 0, /* tp_print */
234 (getattrfunc)gen_getattr, /* tp_getattr */
235 0, /* tp_setattr */
236 0, /* tp_compare */
237 0, /* tp_repr */
238 0, /* tp_as_number */
239 0, /* tp_as_sequence */
240 0, /* tp_as_mapping */
241 0, /* tp_hash */
242 0, /* tp_call */
243 0, /* tp_str */
244 0, /* tp_getattro */
245 0, /* tp_setattro */
246 0, /* tp_as_buffer */
247 Py_TPFLAGS_DEFAULT, /* tp_flags */
248 0, /* tp_doc */
249 0, /* tp_traverse */
250 0, /* tp_clear */
251 0, /* tp_richcompare */
252 0, /* tp_weaklistoffset */
253 (getiterfunc)gen_getiter, /* tp_iter */
254 (iternextfunc)gen_iternext, /* tp_iternext */
255};
256
257
Guido van Rossume59214e1994-08-30 08:01:59 +0000258#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000259
Guido van Rossum2571cc81999-04-07 16:07:23 +0000260#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000262#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000263#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000264
Guido van Rossuma027efa1997-05-05 20:56:21 +0000265extern int _PyThread_Started; /* Flag for Py_Exit */
266
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000268static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000269
270void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000272{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000273 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000274 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000275 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000276 interpreter_lock = PyThread_allocate_lock();
277 PyThread_acquire_lock(interpreter_lock, 1);
278 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000279}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000280
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000281void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000282PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000283{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000284 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000285}
286
287void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000288PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000289{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000290 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000291}
292
293void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000294PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000295{
296 if (tstate == NULL)
297 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000298 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000299 if (PyThreadState_Swap(tstate) != NULL)
300 Py_FatalError(
301 "PyEval_AcquireThread: non-NULL old thread state");
302}
303
304void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000305PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000306{
307 if (tstate == NULL)
308 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
309 if (PyThreadState_Swap(NULL) != tstate)
310 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000311 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000312}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000313
314/* This function is called from PyOS_AfterFork to ensure that newly
315 created child processes don't hold locks referring to threads which
316 are not running in the child process. (This could also be done using
317 pthread_atfork mechanism, at least for the pthreads implementation.) */
318
319void
320PyEval_ReInitThreads(void)
321{
322 if (!interpreter_lock)
323 return;
324 /*XXX Can't use PyThread_free_lock here because it does too
325 much error-checking. Doing this cleanly would require
326 adding a new function to each thread_*.h. Instead, just
327 create a new lock and waste a little bit of memory */
328 interpreter_lock = PyThread_allocate_lock();
329 PyThread_acquire_lock(interpreter_lock, 1);
330 main_thread = PyThread_get_thread_ident();
331}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332#endif
333
Guido van Rossumff4949e1992-08-05 19:58:53 +0000334/* Functions save_thread and restore_thread are always defined so
335 dynamically loaded modules needn't be compiled separately for use
336 with and without threads: */
337
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000338PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000339PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000341 PyThreadState *tstate = PyThreadState_Swap(NULL);
342 if (tstate == NULL)
343 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000344#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000345 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000346 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000348 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000349}
350
351void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000352PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000353{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000354 if (tstate == NULL)
355 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000356#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000357 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000358 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000359 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000360 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000361 }
362#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000363 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000364}
365
366
Guido van Rossuma9672091994-09-14 13:31:22 +0000367/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
368 signal handlers or Mac I/O completion routines) can schedule calls
369 to a function to be called synchronously.
370 The synchronous function is called with one void* argument.
371 It should return 0 for success or -1 for failure -- failure should
372 be accompanied by an exception.
373
374 If registry succeeds, the registry function returns 0; if it fails
375 (e.g. due to too many pending calls) it returns -1 (without setting
376 an exception condition).
377
378 Note that because registry may occur from within signal handlers,
379 or other asynchronous events, calling malloc() is unsafe!
380
381#ifdef WITH_THREAD
382 Any thread can schedule pending calls, but only the main thread
383 will execute them.
384#endif
385
386 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
387 There are two possible race conditions:
388 (1) nested asynchronous registry calls;
389 (2) registry calls made while pending calls are being processed.
390 While (1) is very unlikely, (2) is a real possibility.
391 The current code is safe against (2), but not against (1).
392 The safety against (2) is derived from the fact that only one
393 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000394
Guido van Rossuma027efa1997-05-05 20:56:21 +0000395 XXX Darn! With the advent of thread state, we should have an array
396 of pending calls per thread in the thread state! Later...
397*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000398
Guido van Rossuma9672091994-09-14 13:31:22 +0000399#define NPENDINGCALLS 32
400static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000401 int (*func)(void *);
402 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000403} pendingcalls[NPENDINGCALLS];
404static volatile int pendingfirst = 0;
405static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000406static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000407
408int
Thomas Wouters334fb892000-07-25 12:56:38 +0000409Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000410{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000411 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000412 int i, j;
413 /* XXX Begin critical section */
414 /* XXX If you want this to be safe against nested
415 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000416 if (busy)
417 return -1;
418 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419 i = pendinglast;
420 j = (i + 1) % NPENDINGCALLS;
421 if (j == pendingfirst)
422 return -1; /* Queue full */
423 pendingcalls[i].func = func;
424 pendingcalls[i].arg = arg;
425 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000427 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000428 /* XXX End critical section */
429 return 0;
430}
431
Guido van Rossum180d7b41994-09-29 09:45:57 +0000432int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000434{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000435 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000436#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000437 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000438 return 0;
439#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000440 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000441 return 0;
442 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000443 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 for (;;) {
445 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000446 int (*func)(void *);
447 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000448 i = pendingfirst;
449 if (i == pendinglast)
450 break; /* Queue empty */
451 func = pendingcalls[i].func;
452 arg = pendingcalls[i].arg;
453 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000454 if (func(arg) < 0) {
455 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000456 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000457 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000458 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000459 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000460 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000461 return 0;
462}
463
464
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000465/* The interpreter's recursion limit */
466
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000467static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000468
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000469int
470Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000471{
472 return recursion_limit;
473}
474
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000475void
476Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000477{
478 recursion_limit = new_limit;
479}
480
Guido van Rossum374a9221991-04-04 10:40:29 +0000481/* Status code for main loop (reason for stack unwind) */
482
483enum why_code {
484 WHY_NOT, /* No error */
485 WHY_EXCEPTION, /* Exception occurred */
486 WHY_RERAISE, /* Exception re-raised by 'finally' */
487 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000488 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000489 WHY_CONTINUE, /* 'continue' statement */
490 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000491};
492
Tim Petersdbd9ba62000-07-09 03:09:57 +0000493static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000494static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000495
Guido van Rossum374a9221991-04-04 10:40:29 +0000496
Guido van Rossumb209a111997-04-29 18:18:01 +0000497PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000498PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499{
500 return eval_code2(co,
501 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000502 (PyObject **)NULL, 0,
503 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000504 (PyObject **)NULL, 0,
505 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506}
507
508
509/* Interpreter main loop */
510
Tim Peters5ca576e2001-06-18 22:08:13 +0000511PyObject *
512eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000513{
Guido van Rossum950361c1997-01-24 13:49:28 +0000514#ifdef DXPAIRS
515 int lastopcode = 0;
516#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000517 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000518 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000519 register int opcode=0; /* Current opcode */
520 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000521 register enum why_code why; /* Reason for block stack unwind */
522 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000523 register PyObject *x; /* Result object -- NULL if error */
524 register PyObject *v; /* Temporary objects popped off stack */
525 register PyObject *w;
526 register PyObject *u;
527 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000528 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000529 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000530 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000531 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000532 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000533 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000534#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000535 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000536#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000537#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000538 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000539 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000540#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000541
542/* Code access macros */
543
544#define GETCONST(i) Getconst(f, i)
545#define GETNAME(i) Getname(f, i)
546#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000547#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000548#define NEXTOP() (*next_instr++)
549#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000550#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000551#define JUMPBY(x) (next_instr += (x))
552
553/* Stack manipulation macros */
554
555#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
556#define EMPTY() (STACK_LEVEL() == 0)
557#define TOP() (stack_pointer[-1])
558#define BASIC_PUSH(v) (*stack_pointer++ = (v))
559#define BASIC_POP() (*--stack_pointer)
560
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561#ifdef LLTRACE
562#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
563#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000564#else
565#define PUSH(v) BASIC_PUSH(v)
566#define POP() BASIC_POP()
567#endif
568
Guido van Rossum681d79a1995-07-18 14:51:37 +0000569/* Local variable macros */
570
571#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000572#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000573 GETLOCAL(i) = value; } while (0)
574
Guido van Rossuma027efa1997-05-05 20:56:21 +0000575/* Start of code */
576
Tim Peters5ca576e2001-06-18 22:08:13 +0000577 if (f == NULL)
578 return NULL;
579
Guido van Rossum8861b741996-07-30 16:49:37 +0000580#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000581 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000582 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000583 return NULL;
584 }
585#endif
586
Tim Peters5ca576e2001-06-18 22:08:13 +0000587 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000588 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000589 --tstate->recursion_depth;
590 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000591 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000593 return NULL;
594 }
595
Tim Peters5ca576e2001-06-18 22:08:13 +0000596 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000597 co = f->f_code;
598 fastlocals = f->f_localsplus;
599 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000600 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000601 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000602 stack_pointer = f->f_stacktop;
603 assert(stack_pointer != NULL);
604 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000605
606#ifdef LLTRACE
607 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
608#endif
609#if defined(Py_DEBUG) || defined(LLTRACE)
610 filename = PyString_AsString(co->co_filename);
611#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000612
Guido van Rossum374a9221991-04-04 10:40:29 +0000613 why = WHY_NOT;
614 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000615 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000616 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000617
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000619 /* Do periodic things. Doing this every time through
620 the loop would add too much overhead, so we do it
621 only every Nth instruction. We also do it if
622 ``things_to_do'' is set, i.e. when an asynchronous
623 event needs attention (e.g. a signal handler or
624 async I/O handler); see Py_AddPendingCall() and
625 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000626
Guido van Rossuma027efa1997-05-05 20:56:21 +0000627 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000628 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000629 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000630 if (Py_MakePendingCalls() < 0) {
631 why = WHY_EXCEPTION;
632 goto on_error;
633 }
634 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000635#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000636 /* If we have true signals, the signal handler
637 will call Py_AddPendingCall() so we don't
638 have to call sigcheck(). On the Mac and
639 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000640 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000641 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000642 goto on_error;
643 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000644#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000645
Guido van Rossume59214e1994-08-30 08:01:59 +0000646#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000647 if (interpreter_lock) {
648 /* Give another thread a chance */
649
Guido van Rossum25ce5661997-08-02 03:10:38 +0000650 if (PyThreadState_Swap(NULL) != tstate)
651 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000652 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000653
654 /* Other threads may run now */
655
Guido van Rossum65d5b571998-12-21 19:32:43 +0000656 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000657 if (PyThreadState_Swap(tstate) != NULL)
658 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000659 }
660#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662
Guido van Rossum374a9221991-04-04 10:40:29 +0000663 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000664
Guido van Rossum408027e1996-12-30 16:17:54 +0000665#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000666 f->f_lasti = INSTR_OFFSET();
667#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000668
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 opcode = NEXTOP();
670 if (HAS_ARG(opcode))
671 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000672 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000673#ifdef DYNAMIC_EXECUTION_PROFILE
674#ifdef DXPAIRS
675 dxpairs[lastopcode][opcode]++;
676 lastopcode = opcode;
677#endif
678 dxp[opcode]++;
679#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000680
Guido van Rossum96a42c81992-01-12 02:29:51 +0000681#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000683
Guido van Rossum96a42c81992-01-12 02:29:51 +0000684 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 if (HAS_ARG(opcode)) {
686 printf("%d: %d, %d\n",
687 (int) (INSTR_OFFSET() - 3),
688 opcode, oparg);
689 }
690 else {
691 printf("%d: %d\n",
692 (int) (INSTR_OFFSET() - 1), opcode);
693 }
694 }
695#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000696 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000697
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000699
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 /* BEWARE!
701 It is essential that any operation that fails sets either
702 x to NULL, err to nonzero, or why to anything but WHY_NOT,
703 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000704
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000706
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 case POP_TOP:
708 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000709 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000710 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000711
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 case ROT_TWO:
713 v = POP();
714 w = POP();
715 PUSH(v);
716 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000717 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 case ROT_THREE:
720 v = POP();
721 w = POP();
722 x = POP();
723 PUSH(v);
724 PUSH(x);
725 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000726 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000727
Thomas Wouters434d0822000-08-24 20:11:32 +0000728 case ROT_FOUR:
729 u = POP();
730 v = POP();
731 w = POP();
732 x = POP();
733 PUSH(u);
734 PUSH(x);
735 PUSH(w);
736 PUSH(v);
737 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000738
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 case DUP_TOP:
740 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000741 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000743 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000744
Thomas Wouters434d0822000-08-24 20:11:32 +0000745 case DUP_TOPX:
746 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000747 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000748 x = TOP();
749 Py_INCREF(x);
750 PUSH(x);
751 continue;
752 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000753 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000754 Py_INCREF(x);
755 w = TOP();
756 Py_INCREF(w);
757 PUSH(x);
758 PUSH(w);
759 PUSH(x);
760 continue;
761 case 3:
762 x = POP();
763 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000764 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000765 Py_INCREF(w);
766 v = TOP();
767 Py_INCREF(v);
768 PUSH(w);
769 PUSH(x);
770 PUSH(v);
771 PUSH(w);
772 PUSH(x);
773 continue;
774 case 4:
775 x = POP();
776 Py_INCREF(x);
777 w = POP();
778 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000779 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000780 Py_INCREF(v);
781 u = TOP();
782 Py_INCREF(u);
783 PUSH(v);
784 PUSH(w);
785 PUSH(x);
786 PUSH(u);
787 PUSH(v);
788 PUSH(w);
789 PUSH(x);
790 continue;
791 case 5:
792 x = POP();
793 Py_INCREF(x);
794 w = POP();
795 Py_INCREF(w);
796 v = POP();
797 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000798 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000799 Py_INCREF(u);
800 t = TOP();
801 Py_INCREF(t);
802 PUSH(u);
803 PUSH(v);
804 PUSH(w);
805 PUSH(x);
806 PUSH(t);
807 PUSH(u);
808 PUSH(v);
809 PUSH(w);
810 PUSH(x);
811 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000812 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000813 Py_FatalError("invalid argument to DUP_TOPX"
814 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000815 }
Tim Peters35ba6892000-10-11 07:04:49 +0000816 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000817
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 case UNARY_POSITIVE:
819 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000820 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000821 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000822 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000823 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000824 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000825
Guido van Rossum374a9221991-04-04 10:40:29 +0000826 case UNARY_NEGATIVE:
827 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000828 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000829 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000830 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000831 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000833
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 case UNARY_NOT:
835 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000836 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000838 if (err == 0) {
839 Py_INCREF(Py_True);
840 PUSH(Py_True);
841 continue;
842 }
843 else if (err > 0) {
844 Py_INCREF(Py_False);
845 PUSH(Py_False);
846 err = 0;
847 continue;
848 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000850
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 case UNARY_CONVERT:
852 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 x = PyObject_Repr(v);
854 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000855 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000856 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000858
Guido van Rossum7928cd71991-10-24 14:59:31 +0000859 case UNARY_INVERT:
860 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000861 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000862 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000863 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000864 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000866
Guido van Rossum50564e81996-01-12 01:13:16 +0000867 case BINARY_POWER:
868 w = POP();
869 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000870 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000871 Py_DECREF(v);
872 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000873 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000874 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000875 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000876
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 case BINARY_MULTIPLY:
878 w = POP();
879 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000880 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000881 Py_DECREF(v);
882 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000884 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000885 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000886
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 case BINARY_DIVIDE:
888 w = POP();
889 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000890 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
892 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000896
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 case BINARY_MODULO:
898 w = POP();
899 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
902 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000904 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000906
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 case BINARY_ADD:
908 w = POP();
909 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000910 if (PyInt_Check(v) && PyInt_Check(w)) {
911 /* INLINE: int + int */
912 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000913 a = PyInt_AS_LONG(v);
914 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000915 i = a + b;
916 if ((i^a) < 0 && (i^b) < 0) {
917 PyErr_SetString(PyExc_OverflowError,
918 "integer addition");
919 x = NULL;
920 }
921 else
922 x = PyInt_FromLong(i);
923 }
924 else
925 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000926 Py_DECREF(v);
927 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000929 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000931
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 case BINARY_SUBTRACT:
933 w = POP();
934 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000935 if (PyInt_Check(v) && PyInt_Check(w)) {
936 /* INLINE: int - int */
937 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000938 a = PyInt_AS_LONG(v);
939 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000940 i = a - b;
941 if ((i^a) < 0 && (i^~b) < 0) {
942 PyErr_SetString(PyExc_OverflowError,
943 "integer subtraction");
944 x = NULL;
945 }
946 else
947 x = PyInt_FromLong(i);
948 }
949 else
950 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000951 Py_DECREF(v);
952 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000954 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000956
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 case BINARY_SUBSCR:
958 w = POP();
959 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000960 if (PyList_Check(v) && PyInt_Check(w)) {
961 /* INLINE: list[int] */
962 long i = PyInt_AsLong(w);
963 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000964 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000965 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000966 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000967 PyErr_SetString(PyExc_IndexError,
968 "list index out of range");
969 x = NULL;
970 }
971 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000972 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000973 Py_INCREF(x);
974 }
975 }
976 else
977 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000978 Py_DECREF(v);
979 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000981 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000983
Guido van Rossum7928cd71991-10-24 14:59:31 +0000984 case BINARY_LSHIFT:
985 w = POP();
986 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000987 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(v);
989 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000990 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000991 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000992 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000993
Guido van Rossum7928cd71991-10-24 14:59:31 +0000994 case BINARY_RSHIFT:
995 w = POP();
996 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000997 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000998 Py_DECREF(v);
999 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001001 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001002 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001003
Guido van Rossum7928cd71991-10-24 14:59:31 +00001004 case BINARY_AND:
1005 w = POP();
1006 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001007 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001008 Py_DECREF(v);
1009 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001010 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001011 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001012 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001013
Guido van Rossum7928cd71991-10-24 14:59:31 +00001014 case BINARY_XOR:
1015 w = POP();
1016 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001017 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001018 Py_DECREF(v);
1019 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001020 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001021 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001022 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001023
Guido van Rossum7928cd71991-10-24 14:59:31 +00001024 case BINARY_OR:
1025 w = POP();
1026 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001027 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001028 Py_DECREF(v);
1029 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001030 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001031 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001032 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001033
1034 case INPLACE_POWER:
1035 w = POP();
1036 v = POP();
1037 x = PyNumber_InPlacePower(v, w, Py_None);
1038 Py_DECREF(v);
1039 Py_DECREF(w);
1040 PUSH(x);
1041 if (x != NULL) continue;
1042 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001043
Thomas Wouters434d0822000-08-24 20:11:32 +00001044 case INPLACE_MULTIPLY:
1045 w = POP();
1046 v = POP();
1047 x = PyNumber_InPlaceMultiply(v, w);
1048 Py_DECREF(v);
1049 Py_DECREF(w);
1050 PUSH(x);
1051 if (x != NULL) continue;
1052 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001053
Thomas Wouters434d0822000-08-24 20:11:32 +00001054 case INPLACE_DIVIDE:
1055 w = POP();
1056 v = POP();
1057 x = PyNumber_InPlaceDivide(v, w);
1058 Py_DECREF(v);
1059 Py_DECREF(w);
1060 PUSH(x);
1061 if (x != NULL) continue;
1062 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001063
Thomas Wouters434d0822000-08-24 20:11:32 +00001064 case INPLACE_MODULO:
1065 w = POP();
1066 v = POP();
1067 x = PyNumber_InPlaceRemainder(v, w);
1068 Py_DECREF(v);
1069 Py_DECREF(w);
1070 PUSH(x);
1071 if (x != NULL) continue;
1072 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001073
Thomas Wouters434d0822000-08-24 20:11:32 +00001074 case INPLACE_ADD:
1075 w = POP();
1076 v = POP();
1077 if (PyInt_Check(v) && PyInt_Check(w)) {
1078 /* INLINE: int + int */
1079 register long a, b, i;
1080 a = PyInt_AS_LONG(v);
1081 b = PyInt_AS_LONG(w);
1082 i = a + b;
1083 if ((i^a) < 0 && (i^b) < 0) {
1084 PyErr_SetString(PyExc_OverflowError,
1085 "integer addition");
1086 x = NULL;
1087 }
1088 else
1089 x = PyInt_FromLong(i);
1090 }
1091 else
1092 x = PyNumber_InPlaceAdd(v, w);
1093 Py_DECREF(v);
1094 Py_DECREF(w);
1095 PUSH(x);
1096 if (x != NULL) continue;
1097 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001098
Thomas Wouters434d0822000-08-24 20:11:32 +00001099 case INPLACE_SUBTRACT:
1100 w = POP();
1101 v = POP();
1102 if (PyInt_Check(v) && PyInt_Check(w)) {
1103 /* INLINE: int - int */
1104 register long a, b, i;
1105 a = PyInt_AS_LONG(v);
1106 b = PyInt_AS_LONG(w);
1107 i = a - b;
1108 if ((i^a) < 0 && (i^~b) < 0) {
1109 PyErr_SetString(PyExc_OverflowError,
1110 "integer subtraction");
1111 x = NULL;
1112 }
1113 else
1114 x = PyInt_FromLong(i);
1115 }
1116 else
1117 x = PyNumber_InPlaceSubtract(v, w);
1118 Py_DECREF(v);
1119 Py_DECREF(w);
1120 PUSH(x);
1121 if (x != NULL) continue;
1122 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001123
Thomas Wouters434d0822000-08-24 20:11:32 +00001124 case INPLACE_LSHIFT:
1125 w = POP();
1126 v = POP();
1127 x = PyNumber_InPlaceLshift(v, w);
1128 Py_DECREF(v);
1129 Py_DECREF(w);
1130 PUSH(x);
1131 if (x != NULL) continue;
1132 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001133
Thomas Wouters434d0822000-08-24 20:11:32 +00001134 case INPLACE_RSHIFT:
1135 w = POP();
1136 v = POP();
1137 x = PyNumber_InPlaceRshift(v, w);
1138 Py_DECREF(v);
1139 Py_DECREF(w);
1140 PUSH(x);
1141 if (x != NULL) continue;
1142 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001143
Thomas Wouters434d0822000-08-24 20:11:32 +00001144 case INPLACE_AND:
1145 w = POP();
1146 v = POP();
1147 x = PyNumber_InPlaceAnd(v, w);
1148 Py_DECREF(v);
1149 Py_DECREF(w);
1150 PUSH(x);
1151 if (x != NULL) continue;
1152 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001153
Thomas Wouters434d0822000-08-24 20:11:32 +00001154 case INPLACE_XOR:
1155 w = POP();
1156 v = POP();
1157 x = PyNumber_InPlaceXor(v, w);
1158 Py_DECREF(v);
1159 Py_DECREF(w);
1160 PUSH(x);
1161 if (x != NULL) continue;
1162 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001163
Thomas Wouters434d0822000-08-24 20:11:32 +00001164 case INPLACE_OR:
1165 w = POP();
1166 v = POP();
1167 x = PyNumber_InPlaceOr(v, w);
1168 Py_DECREF(v);
1169 Py_DECREF(w);
1170 PUSH(x);
1171 if (x != NULL) continue;
1172 break;
1173
Guido van Rossum374a9221991-04-04 10:40:29 +00001174 case SLICE+0:
1175 case SLICE+1:
1176 case SLICE+2:
1177 case SLICE+3:
1178 if ((opcode-SLICE) & 2)
1179 w = POP();
1180 else
1181 w = NULL;
1182 if ((opcode-SLICE) & 1)
1183 v = POP();
1184 else
1185 v = NULL;
1186 u = POP();
1187 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001188 Py_DECREF(u);
1189 Py_XDECREF(v);
1190 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001192 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001194
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 case STORE_SLICE+0:
1196 case STORE_SLICE+1:
1197 case STORE_SLICE+2:
1198 case STORE_SLICE+3:
1199 if ((opcode-STORE_SLICE) & 2)
1200 w = POP();
1201 else
1202 w = NULL;
1203 if ((opcode-STORE_SLICE) & 1)
1204 v = POP();
1205 else
1206 v = NULL;
1207 u = POP();
1208 t = POP();
1209 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001210 Py_DECREF(t);
1211 Py_DECREF(u);
1212 Py_XDECREF(v);
1213 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001214 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001216
Guido van Rossum374a9221991-04-04 10:40:29 +00001217 case DELETE_SLICE+0:
1218 case DELETE_SLICE+1:
1219 case DELETE_SLICE+2:
1220 case DELETE_SLICE+3:
1221 if ((opcode-DELETE_SLICE) & 2)
1222 w = POP();
1223 else
1224 w = NULL;
1225 if ((opcode-DELETE_SLICE) & 1)
1226 v = POP();
1227 else
1228 v = NULL;
1229 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001230 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001232 Py_DECREF(u);
1233 Py_XDECREF(v);
1234 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001235 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001237
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 case STORE_SUBSCR:
1239 w = POP();
1240 v = POP();
1241 u = POP();
1242 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001243 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001244 Py_DECREF(u);
1245 Py_DECREF(v);
1246 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001247 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001249
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 case DELETE_SUBSCR:
1251 w = POP();
1252 v = POP();
1253 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001254 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001255 Py_DECREF(v);
1256 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001257 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001259
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 case PRINT_EXPR:
1261 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001262 w = PySys_GetObject("displayhook");
1263 if (w == NULL) {
1264 PyErr_SetString(PyExc_RuntimeError,
1265 "lost sys.displayhook");
1266 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001267 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001268 }
1269 if (err == 0) {
1270 x = Py_BuildValue("(O)", v);
1271 if (x == NULL)
1272 err = -1;
1273 }
1274 if (err == 0) {
1275 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001276 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001277 if (w == NULL)
1278 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001281 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001283
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001284 case PRINT_ITEM_TO:
1285 w = stream = POP();
1286 /* fall through to PRINT_ITEM */
1287
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 case PRINT_ITEM:
1289 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001290 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001291 w = PySys_GetObject("stdout");
1292 if (w == NULL) {
1293 PyErr_SetString(PyExc_RuntimeError,
1294 "lost sys.stdout");
1295 err = -1;
1296 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001297 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001298 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001299 err = PyFile_WriteString(" ", w);
1300 if (err == 0)
1301 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001302 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001303 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 char *s = PyString_AsString(v);
1305 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001306 if (len > 0 &&
1307 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001308 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001311 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001312 Py_XDECREF(stream);
1313 stream = NULL;
1314 if (err == 0)
1315 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001317
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001318 case PRINT_NEWLINE_TO:
1319 w = stream = POP();
1320 /* fall through to PRINT_NEWLINE */
1321
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001323 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001324 w = PySys_GetObject("stdout");
1325 if (w == NULL)
1326 PyErr_SetString(PyExc_RuntimeError,
1327 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001328 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001329 if (w != NULL) {
1330 err = PyFile_WriteString("\n", w);
1331 if (err == 0)
1332 PyFile_SoftSpace(w, 0);
1333 }
1334 Py_XDECREF(stream);
1335 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001337
Thomas Wouters434d0822000-08-24 20:11:32 +00001338
1339#ifdef CASE_TOO_BIG
1340 default: switch (opcode) {
1341#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 case BREAK_LOOP:
1343 why = WHY_BREAK;
1344 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001345
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001346 case CONTINUE_LOOP:
1347 retval = PyInt_FromLong(oparg);
1348 why = WHY_CONTINUE;
1349 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001350
Guido van Rossumf10570b1995-07-07 22:53:21 +00001351 case RAISE_VARARGS:
1352 u = v = w = NULL;
1353 switch (oparg) {
1354 case 3:
1355 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001356 /* Fallthrough */
1357 case 2:
1358 v = POP(); /* value */
1359 /* Fallthrough */
1360 case 1:
1361 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001362 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001363 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001364 break;
1365 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001366 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001367 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001368 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001369 break;
1370 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001372
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001374 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001375 PyErr_SetString(PyExc_SystemError,
1376 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001377 break;
1378 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001379 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001380 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001382
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 case RETURN_VALUE:
1384 retval = POP();
1385 why = WHY_RETURN;
1386 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001387
Tim Peters5ca576e2001-06-18 22:08:13 +00001388 case YIELD_VALUE:
1389 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001390 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001391 f->f_lasti = INSTR_OFFSET();
1392 why = WHY_YIELD;
1393 break;
1394
1395
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001396 case EXEC_STMT:
1397 w = POP();
1398 v = POP();
1399 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001400 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001401 Py_DECREF(u);
1402 Py_DECREF(v);
1403 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001404 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001405
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 case POP_BLOCK:
1407 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001408 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001409 while (STACK_LEVEL() > b->b_level) {
1410 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001411 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 }
1413 }
1414 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001415
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 case END_FINALLY:
1417 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 if (PyInt_Check(v)) {
1419 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001420 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001421 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001422 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 retval = POP();
1424 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001425 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001427 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001430 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 else if (v != Py_None) {
1433 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 "'finally' pops bad exception");
1435 why = WHY_EXCEPTION;
1436 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001437 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001439
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001441 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001443 w = POP();
1444 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001446 Py_DECREF(u);
1447 Py_DECREF(v);
1448 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001450
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 case STORE_NAME:
1452 w = GETNAMEV(oparg);
1453 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001454 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001455 PyErr_Format(PyExc_SystemError,
1456 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001457 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001458 break;
1459 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 err = PyDict_SetItem(x, w, v);
1461 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001463
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001465 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001466 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001467 PyErr_Format(PyExc_SystemError,
1468 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001469 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001470 break;
1471 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001472 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001473 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001474 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001476
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001477 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001479 if (PyTuple_Check(v)) {
1480 if (PyTuple_Size(v) != oparg) {
1481 PyErr_SetString(PyExc_ValueError,
1482 "unpack tuple of wrong size");
1483 why = WHY_EXCEPTION;
1484 }
1485 else {
1486 for (; --oparg >= 0; ) {
1487 w = PyTuple_GET_ITEM(v, oparg);
1488 Py_INCREF(w);
1489 PUSH(w);
1490 }
1491 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001493 else if (PyList_Check(v)) {
1494 if (PyList_Size(v) != oparg) {
1495 PyErr_SetString(PyExc_ValueError,
1496 "unpack list of wrong size");
1497 why = WHY_EXCEPTION;
1498 }
1499 else {
1500 for (; --oparg >= 0; ) {
1501 w = PyList_GET_ITEM(v, oparg);
1502 Py_INCREF(w);
1503 PUSH(w);
1504 }
1505 }
1506 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001507 else if (unpack_iterable(v, oparg,
1508 stack_pointer + oparg))
1509 stack_pointer += oparg;
1510 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001511 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001512 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001514
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001516 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 v = POP();
1518 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001519 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1520 Py_DECREF(v);
1521 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001523
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001525 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001527 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1528 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001531
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001532 case STORE_GLOBAL:
1533 w = GETNAMEV(oparg);
1534 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001535 err = PyDict_SetItem(f->f_globals, w, v);
1536 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001537 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001538
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001539 case DELETE_GLOBAL:
1540 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001542 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001543 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001544 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001545
Guido van Rossum374a9221991-04-04 10:40:29 +00001546 case LOAD_CONST:
1547 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001548 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 PUSH(x);
1550 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001551
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001553 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001554 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001555 PyErr_Format(PyExc_SystemError,
1556 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001557 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001558 break;
1559 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001566 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001567 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001568 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 break;
1570 }
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 Rossumac7be682001-01-17 15:42:30 +00001576
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001578 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001583 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001584 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001585 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 break;
1587 }
1588 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 PUSH(x);
1591 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001592
Guido van Rossum9bfef441993-03-29 10:43:31 +00001593 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001594 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001595 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001596 format_exc_check_arg(
1597 PyExc_UnboundLocalError,
1598 UNBOUNDLOCAL_ERROR_MSG,
1599 PyTuple_GetItem(co->co_varnames, oparg)
1600 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001601 break;
1602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001604 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001605 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001606 break;
1607
1608 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001609 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001610 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001611 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001612
1613 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001614 x = GETLOCAL(oparg);
1615 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001616 format_exc_check_arg(
1617 PyExc_UnboundLocalError,
1618 UNBOUNDLOCAL_ERROR_MSG,
1619 PyTuple_GetItem(co->co_varnames, oparg)
1620 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001621 break;
1622 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001623 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001624 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001625
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001626 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001627 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001628 Py_INCREF(x);
1629 PUSH(x);
1630 break;
1631
1632 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001633 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001634 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001635 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001636 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001637 v = PyTuple_GetItem(co->co_cellvars,
1638 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001639 format_exc_check_arg(
1640 PyExc_UnboundLocalError,
1641 UNBOUNDLOCAL_ERROR_MSG,
1642 v);
1643 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001644 v = PyTuple_GetItem(
1645 co->co_freevars,
1646 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001647 format_exc_check_arg(
1648 PyExc_NameError,
1649 UNBOUNDFREE_ERROR_MSG,
1650 v);
1651 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001652 err = -1;
1653 break;
1654 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001655 PUSH(w);
1656 break;
1657
1658 case STORE_DEREF:
1659 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001660 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001661 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001662 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001663 continue;
1664
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001666 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 if (x != NULL) {
1668 for (; --oparg >= 0;) {
1669 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001670 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001671 }
1672 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001673 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 }
1675 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001676
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 if (x != NULL) {
1680 for (; --oparg >= 0;) {
1681 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001682 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 }
1684 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001685 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 }
1687 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001688
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001690 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001692 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001696 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 x = PyObject_GetAttr(v, w);
1699 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001700 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001701 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001703
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 case COMPARE_OP:
1705 w = POP();
1706 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001707 if (PyInt_Check(v) && PyInt_Check(w)) {
1708 /* INLINE: cmp(int, int) */
1709 register long a, b;
1710 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001711 a = PyInt_AS_LONG(v);
1712 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001713 switch (oparg) {
1714 case LT: res = a < b; break;
1715 case LE: res = a <= b; break;
1716 case EQ: res = a == b; break;
1717 case NE: res = a != b; break;
1718 case GT: res = a > b; break;
1719 case GE: res = a >= b; break;
1720 case IS: res = v == w; break;
1721 case IS_NOT: res = v != w; break;
1722 default: goto slow_compare;
1723 }
1724 x = res ? Py_True : Py_False;
1725 Py_INCREF(x);
1726 }
1727 else {
1728 slow_compare:
1729 x = cmp_outcome(oparg, v, w);
1730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 Py_DECREF(v);
1732 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001734 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001736
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001738 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001740 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001742 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001743 break;
1744 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001745 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001747 w,
1748 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001749 f->f_locals == NULL ?
1750 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001751 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753 if (w == NULL) {
1754 x = NULL;
1755 break;
1756 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001757 x = PyEval_CallObject(x, w);
1758 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001759 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001760 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001762
Thomas Wouters52152252000-08-17 22:55:00 +00001763 case IMPORT_STAR:
1764 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001766 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001767 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001768 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001769 break;
1770 }
Thomas Wouters52152252000-08-17 22:55:00 +00001771 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001773 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001774 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001776
Thomas Wouters52152252000-08-17 22:55:00 +00001777 case IMPORT_FROM:
1778 w = GETNAMEV(oparg);
1779 v = TOP();
1780 x = import_from(v, w);
1781 PUSH(x);
1782 if (x != NULL) continue;
1783 break;
1784
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 case JUMP_FORWARD:
1786 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001787 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001788
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001791 if (err > 0)
1792 err = 0;
1793 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001795 else
1796 break;
1797 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001798
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001801 if (err > 0) {
1802 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001804 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001805 else if (err == 0)
1806 ;
1807 else
1808 break;
1809 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001810
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 case JUMP_ABSOLUTE:
1812 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001813 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001814
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001815 case GET_ITER:
1816 /* before: [obj]; after [getiter(obj)] */
1817 v = POP();
1818 x = PyObject_GetIter(v);
1819 Py_DECREF(v);
1820 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001821 PUSH(x);
1822 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001823 }
1824 break;
1825
1826 case FOR_ITER:
1827 /* before: [iter]; after: [iter, iter()] *or* [] */
1828 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001829 x = PyIter_Next(v);
1830 if (x != NULL) {
1831 PUSH(x);
1832 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001833 }
Tim Petersf4848da2001-05-05 00:14:56 +00001834 if (!PyErr_Occurred()) {
1835 /* iterator ended normally */
1836 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001837 Py_DECREF(v);
1838 JUMPBY(oparg);
1839 continue;
1840 }
1841 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001842
Guido van Rossum374a9221991-04-04 10:40:29 +00001843 case FOR_LOOP:
1844 /* for v in s: ...
1845 On entry: stack contains s, i.
1846 On exit: stack contains s, i+1, s[i];
1847 but if loop exhausted:
1848 s, i are popped, and we jump */
1849 w = POP(); /* Loop index */
1850 v = POP(); /* Sequence object */
1851 u = loop_subscript(v, w);
1852 if (u != NULL) {
1853 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001854 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001858 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 }
1860 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 Py_DECREF(v);
1862 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 /* A NULL can mean "s exhausted"
1864 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001865 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001866 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001867 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 continue;
1870 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 }
1872 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001873
Guido van Rossum374a9221991-04-04 10:40:29 +00001874 case SETUP_LOOP:
1875 case SETUP_EXCEPT:
1876 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001877 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001878 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001879 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001880
Guido van Rossum374a9221991-04-04 10:40:29 +00001881 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001882#ifdef LLTRACE
1883 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001885#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001886 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001887 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001888 continue;
1889 /* Trace each line of code reached */
1890 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001891 /* Inline call_trace() for performance: */
1892 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001893 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001894 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1895 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001896 tstate->use_tracing = (tstate->c_tracefunc
1897 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001898 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001899 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001900
1901 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001902 {
1903 int na = oparg & 0xff;
1904 int nk = (oparg>>8) & 0xff;
1905 int n = na + 2 * nk;
1906 PyObject **pfunc = stack_pointer - n - 1;
1907 PyObject *func = *pfunc;
1908 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1909
1910 /* Always dispatch PyCFunction first, because
1911 these are presumed to be the most frequent
1912 callable object.
1913 */
1914 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001915 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001916 if (flags > 1 || nk != 0)
1917 x = do_call(func, &stack_pointer,
1918 na, nk);
1919 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001920 PyObject *callargs;
1921 callargs = load_args(&stack_pointer, na);
1922 x = call_cfunction(func, callargs, NULL);
1923 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001924 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001925 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001926 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001927 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001928 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001929 && PyMethod_GET_SELF(func) != NULL) {
1930 /* optimize access to bound methods */
1931 PyObject *self = PyMethod_GET_SELF(func);
1932 Py_INCREF(self);
1933 func = PyMethod_GET_FUNCTION(func);
1934 Py_INCREF(func);
1935 Py_DECREF(*pfunc);
1936 *pfunc = self;
1937 na++;
1938 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001939 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001940 Py_INCREF(func);
1941 if (PyFunction_Check(func)) {
1942 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001943 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001944 } else {
1945 x = do_call(func, &stack_pointer,
1946 na, nk);
1947 }
1948 Py_DECREF(func);
1949 }
1950
1951 while (stack_pointer > pfunc) {
1952 w = POP();
1953 Py_DECREF(w);
1954 }
1955 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001956 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001957 continue;
1958 break;
1959 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001960
Jeremy Hylton76901512000-03-28 23:49:17 +00001961 case CALL_FUNCTION_VAR:
1962 case CALL_FUNCTION_KW:
1963 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001964 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001965 int na = oparg & 0xff;
1966 int nk = (oparg>>8) & 0xff;
1967 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001968 int n = na + 2 * nk;
1969 PyObject **pfunc, *func;
1970 if (flags & CALL_FLAG_VAR)
1971 n++;
1972 if (flags & CALL_FLAG_KW)
1973 n++;
1974 pfunc = stack_pointer - n - 1;
1975 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001976 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001977
Guido van Rossumac7be682001-01-17 15:42:30 +00001978 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 && PyMethod_GET_SELF(func) != NULL) {
1980 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001981 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001982 func = PyMethod_GET_FUNCTION(func);
1983 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001984 Py_DECREF(*pfunc);
1985 *pfunc = self;
1986 na++;
1987 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001988 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001989 Py_INCREF(func);
1990 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001991 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001992
Jeremy Hylton76901512000-03-28 23:49:17 +00001993 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001994 w = POP();
1995 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001996 }
1997 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001998 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001999 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002000 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002001 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002002
Guido van Rossum681d79a1995-07-18 14:51:37 +00002003 case MAKE_FUNCTION:
2004 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002005 x = PyFunction_New(v, f->f_globals);
2006 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002007 /* XXX Maybe this should be a separate opcode? */
2008 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002010 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002011 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002012 x = NULL;
2013 break;
2014 }
2015 while (--oparg >= 0) {
2016 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002018 }
2019 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002020 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002021 }
2022 PUSH(x);
2023 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002024
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002025 case MAKE_CLOSURE:
2026 {
2027 int nfree;
2028 v = POP(); /* code object */
2029 x = PyFunction_New(v, f->f_globals);
2030 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2031 Py_DECREF(v);
2032 /* XXX Maybe this should be a separate opcode? */
2033 if (x != NULL && nfree > 0) {
2034 v = PyTuple_New(nfree);
2035 if (v == NULL) {
2036 Py_DECREF(x);
2037 x = NULL;
2038 break;
2039 }
2040 while (--nfree >= 0) {
2041 w = POP();
2042 PyTuple_SET_ITEM(v, nfree, w);
2043 }
2044 err = PyFunction_SetClosure(x, v);
2045 Py_DECREF(v);
2046 }
2047 if (x != NULL && oparg > 0) {
2048 v = PyTuple_New(oparg);
2049 if (v == NULL) {
2050 Py_DECREF(x);
2051 x = NULL;
2052 break;
2053 }
2054 while (--oparg >= 0) {
2055 w = POP();
2056 PyTuple_SET_ITEM(v, oparg, w);
2057 }
2058 err = PyFunction_SetDefaults(x, v);
2059 Py_DECREF(v);
2060 }
2061 PUSH(x);
2062 break;
2063 }
2064
Guido van Rossum8861b741996-07-30 16:49:37 +00002065 case BUILD_SLICE:
2066 if (oparg == 3)
2067 w = POP();
2068 else
2069 w = NULL;
2070 v = POP();
2071 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002072 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 Py_DECREF(u);
2074 Py_DECREF(v);
2075 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002076 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002077 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002078 break;
2079
Fred Drakeef8ace32000-08-24 00:32:09 +00002080 case EXTENDED_ARG:
2081 opcode = NEXTOP();
2082 oparg = oparg<<16 | NEXTARG();
2083 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002084
Guido van Rossum374a9221991-04-04 10:40:29 +00002085 default:
2086 fprintf(stderr,
2087 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002088 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002089 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002090 why = WHY_EXCEPTION;
2091 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002092
2093#ifdef CASE_TOO_BIG
2094 }
2095#endif
2096
Guido van Rossum374a9221991-04-04 10:40:29 +00002097 } /* switch */
2098
2099 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002100
Guido van Rossum374a9221991-04-04 10:40:29 +00002101 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002102
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002104 if (err == 0 && x != NULL) {
2105#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002106 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002108 fprintf(stderr,
2109 "XXX undetected error\n");
2110 else
2111#endif
2112 continue; /* Normal, fast path */
2113 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 err = 0;
2117 }
2118
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002120
Guido van Rossum374a9221991-04-04 10:40:29 +00002121 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002122 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002123 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002124 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002125 why = WHY_EXCEPTION;
2126 }
2127 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002128#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002130 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002132 fprintf(stderr,
2133 "XXX undetected error (why=%d)\n",
2134 why);
2135 why = WHY_EXCEPTION;
2136 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002137 }
2138#endif
2139
2140 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002141
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002143 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002145 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002147
Fred Drake9e3ad782001-07-03 23:39:52 +00002148 if (tstate->use_tracing) {
2149 if (tstate->c_tracefunc)
2150 call_exc_trace(tstate->c_tracefunc,
2151 tstate->c_traceobj, f);
2152 if (tstate->c_profilefunc)
2153 call_exc_trace(tstate->c_profilefunc,
2154 tstate->c_profileobj,f);
2155 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002156 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002157
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002159
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 if (why == WHY_RERAISE)
2161 why = WHY_EXCEPTION;
2162
2163 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002164
Tim Peters5ca576e2001-06-18 22:08:13 +00002165 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002167
2168 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2169 /* For a continue inside a try block,
2170 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002171 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002172 b->b_handler);
2173 why = WHY_NOT;
2174 JUMPTO(PyInt_AS_LONG(retval));
2175 Py_DECREF(retval);
2176 break;
2177 }
2178
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 while (STACK_LEVEL() > b->b_level) {
2180 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 }
2183 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2184 why = WHY_NOT;
2185 JUMPTO(b->b_handler);
2186 break;
2187 }
2188 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002189 (b->b_type == SETUP_EXCEPT &&
2190 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 PyObject *exc, *val, *tb;
2193 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 val = Py_None;
2196 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002198 /* Make the raw exception data
2199 available to the handler,
2200 so a program can emulate the
2201 Python main loop. Don't do
2202 this for 'finally'. */
2203 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002204 PyErr_NormalizeException(
2205 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002206 set_exc_info(tstate,
2207 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002209 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 PUSH(val);
2211 PUSH(exc);
2212 }
2213 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002214 if (why == WHY_RETURN ||
2215 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002216 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002217 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002218 PUSH(v);
2219 }
2220 why = WHY_NOT;
2221 JUMPTO(b->b_handler);
2222 break;
2223 }
2224 } /* unwind stack */
2225
2226 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002227
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 if (why != WHY_NOT)
2229 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002230
Guido van Rossum374a9221991-04-04 10:40:29 +00002231 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002232
Tim Peters5ca576e2001-06-18 22:08:13 +00002233 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002234 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002235
Fred Drake9e3ad782001-07-03 23:39:52 +00002236 if (tstate->use_tracing) {
2237 if (tstate->c_tracefunc
2238 && (why == WHY_RETURN || why == WHY_YIELD)) {
2239 if (call_trace(tstate->c_tracefunc,
2240 tstate->c_traceobj, f,
2241 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002242 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002243 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002244 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002245 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002246 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002247 if (tstate->c_profilefunc
2248 && (why == WHY_RETURN || why == WHY_YIELD)) {
2249 if (call_trace(tstate->c_profilefunc,
2250 tstate->c_profileobj, f,
2251 PyTrace_RETURN, retval)) {
2252 Py_XDECREF(retval);
2253 retval = NULL;
2254 why = WHY_EXCEPTION;
2255 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002256 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002257 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002258
Guido van Rossuma027efa1997-05-05 20:56:21 +00002259 reset_exc_info(tstate);
2260
Tim Peters5ca576e2001-06-18 22:08:13 +00002261 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002262 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002263 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002264
Guido van Rossum96a42c81992-01-12 02:29:51 +00002265 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002266}
2267
Tim Peters5ca576e2001-06-18 22:08:13 +00002268static PyObject *
2269eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2270 PyObject **args, int argcount, PyObject **kws, int kwcount,
2271 PyObject **defs, int defcount, PyObject *closure)
2272{
2273 register PyFrameObject *f;
2274 register PyObject *retval = NULL;
2275 register PyObject **fastlocals, **freevars;
2276 PyThreadState *tstate = PyThreadState_GET();
2277 PyObject *x, *u;
2278
2279 if (globals == NULL) {
2280 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2281 return NULL;
2282 }
2283
2284 f = PyFrame_New(tstate, /*back*/
2285 co, /*code*/
2286 globals, locals);
2287 if (f == NULL)
2288 return NULL;
2289
2290 fastlocals = f->f_localsplus;
2291 freevars = f->f_localsplus + f->f_nlocals;
2292
2293 if (co->co_argcount > 0 ||
2294 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2295 int i;
2296 int n = argcount;
2297 PyObject *kwdict = NULL;
2298 if (co->co_flags & CO_VARKEYWORDS) {
2299 kwdict = PyDict_New();
2300 if (kwdict == NULL)
2301 goto fail;
2302 i = co->co_argcount;
2303 if (co->co_flags & CO_VARARGS)
2304 i++;
2305 SETLOCAL(i, kwdict);
2306 }
2307 if (argcount > co->co_argcount) {
2308 if (!(co->co_flags & CO_VARARGS)) {
2309 PyErr_Format(PyExc_TypeError,
2310 "%.200s() takes %s %d "
2311 "%sargument%s (%d given)",
2312 PyString_AsString(co->co_name),
2313 defcount ? "at most" : "exactly",
2314 co->co_argcount,
2315 kwcount ? "non-keyword " : "",
2316 co->co_argcount == 1 ? "" : "s",
2317 argcount);
2318 goto fail;
2319 }
2320 n = co->co_argcount;
2321 }
2322 for (i = 0; i < n; i++) {
2323 x = args[i];
2324 Py_INCREF(x);
2325 SETLOCAL(i, x);
2326 }
2327 if (co->co_flags & CO_VARARGS) {
2328 u = PyTuple_New(argcount - n);
2329 if (u == NULL)
2330 goto fail;
2331 SETLOCAL(co->co_argcount, u);
2332 for (i = n; i < argcount; i++) {
2333 x = args[i];
2334 Py_INCREF(x);
2335 PyTuple_SET_ITEM(u, i-n, x);
2336 }
2337 }
2338 for (i = 0; i < kwcount; i++) {
2339 PyObject *keyword = kws[2*i];
2340 PyObject *value = kws[2*i + 1];
2341 int j;
2342 if (keyword == NULL || !PyString_Check(keyword)) {
2343 PyErr_Format(PyExc_TypeError,
2344 "%.200s() keywords must be strings",
2345 PyString_AsString(co->co_name));
2346 goto fail;
2347 }
2348 /* XXX slow -- speed up using dictionary? */
2349 for (j = 0; j < co->co_argcount; j++) {
2350 PyObject *nm = PyTuple_GET_ITEM(
2351 co->co_varnames, j);
2352 int cmp = PyObject_RichCompareBool(
2353 keyword, nm, Py_EQ);
2354 if (cmp > 0)
2355 break;
2356 else if (cmp < 0)
2357 goto fail;
2358 }
2359 /* Check errors from Compare */
2360 if (PyErr_Occurred())
2361 goto fail;
2362 if (j >= co->co_argcount) {
2363 if (kwdict == NULL) {
2364 PyErr_Format(PyExc_TypeError,
2365 "%.200s() got an unexpected "
2366 "keyword argument '%.400s'",
2367 PyString_AsString(co->co_name),
2368 PyString_AsString(keyword));
2369 goto fail;
2370 }
2371 PyDict_SetItem(kwdict, keyword, value);
2372 }
2373 else {
2374 if (GETLOCAL(j) != NULL) {
2375 PyErr_Format(PyExc_TypeError,
2376 "%.200s() got multiple "
2377 "values for keyword "
2378 "argument '%.400s'",
2379 PyString_AsString(co->co_name),
2380 PyString_AsString(keyword));
2381 goto fail;
2382 }
2383 Py_INCREF(value);
2384 SETLOCAL(j, value);
2385 }
2386 }
2387 if (argcount < co->co_argcount) {
2388 int m = co->co_argcount - defcount;
2389 for (i = argcount; i < m; i++) {
2390 if (GETLOCAL(i) == NULL) {
2391 PyErr_Format(PyExc_TypeError,
2392 "%.200s() takes %s %d "
2393 "%sargument%s (%d given)",
2394 PyString_AsString(co->co_name),
2395 ((co->co_flags & CO_VARARGS) ||
2396 defcount) ? "at least"
2397 : "exactly",
2398 m, kwcount ? "non-keyword " : "",
2399 m == 1 ? "" : "s", i);
2400 goto fail;
2401 }
2402 }
2403 if (n > m)
2404 i = n - m;
2405 else
2406 i = 0;
2407 for (; i < defcount; i++) {
2408 if (GETLOCAL(m+i) == NULL) {
2409 PyObject *def = defs[i];
2410 Py_INCREF(def);
2411 SETLOCAL(m+i, def);
2412 }
2413 }
2414 }
2415 }
2416 else {
2417 if (argcount > 0 || kwcount > 0) {
2418 PyErr_Format(PyExc_TypeError,
2419 "%.200s() takes no arguments (%d given)",
2420 PyString_AsString(co->co_name),
2421 argcount + kwcount);
2422 goto fail;
2423 }
2424 }
2425 /* Allocate and initialize storage for cell vars, and copy free
2426 vars into frame. This isn't too efficient right now. */
2427 if (f->f_ncells) {
2428 int i = 0, j = 0, nargs, found;
2429 char *cellname, *argname;
2430 PyObject *c;
2431
2432 nargs = co->co_argcount;
2433 if (co->co_flags & CO_VARARGS)
2434 nargs++;
2435 if (co->co_flags & CO_VARKEYWORDS)
2436 nargs++;
2437
2438 /* Check for cells that shadow args */
2439 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2440 cellname = PyString_AS_STRING(
2441 PyTuple_GET_ITEM(co->co_cellvars, i));
2442 found = 0;
2443 while (j < nargs) {
2444 argname = PyString_AS_STRING(
2445 PyTuple_GET_ITEM(co->co_varnames, j));
2446 if (strcmp(cellname, argname) == 0) {
2447 c = PyCell_New(GETLOCAL(j));
2448 if (c == NULL)
2449 goto fail;
2450 GETLOCAL(f->f_nlocals + i) = c;
2451 found = 1;
2452 break;
2453 }
2454 j++;
2455 }
2456 if (found == 0) {
2457 c = PyCell_New(NULL);
2458 if (c == NULL)
2459 goto fail;
2460 SETLOCAL(f->f_nlocals + i, c);
2461 }
2462 }
2463 /* Initialize any that are left */
2464 while (i < f->f_ncells) {
2465 c = PyCell_New(NULL);
2466 if (c == NULL)
2467 goto fail;
2468 SETLOCAL(f->f_nlocals + i, c);
2469 i++;
2470 }
2471 }
2472 if (f->f_nfreevars) {
2473 int i;
2474 for (i = 0; i < f->f_nfreevars; ++i) {
2475 PyObject *o = PyTuple_GET_ITEM(closure, i);
2476 Py_INCREF(o);
2477 freevars[f->f_ncells + i] = o;
2478 }
2479 }
2480
Fred Drake9e3ad782001-07-03 23:39:52 +00002481 if (tstate->use_tracing) {
2482 if (tstate->c_tracefunc != NULL) {
2483 /* tstate->c_tracefunc, if defined, is a
2484 function that will be called on *every* entry
2485 to a code block. Its return value, if not
2486 None, is a function that will be called at
2487 the start of each executed line of code.
2488 (Actually, the function must return itself
2489 in order to continue tracing.) The trace
2490 functions are called with three arguments:
2491 a pointer to the current frame, a string
2492 indicating why the function is called, and
2493 an argument which depends on the situation.
2494 The global trace function is also called
2495 whenever an exception is detected. */
2496 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2497 f, PyTrace_CALL, Py_None)) {
2498 /* XXX Need way to compute arguments?? */
2499 /* Trace function raised an error */
2500 goto fail;
2501 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002502 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002503 if (tstate->c_profilefunc != NULL) {
2504 /* Similar for c_profilefunc, except it needn't
2505 return itself and isn't called for "line" events */
2506 if (call_trace(tstate->c_profilefunc,
2507 tstate->c_profileobj,
2508 f, PyTrace_CALL, Py_None)) {
2509 /* XXX Need way to compute arguments?? */
2510 /* Profile function raised an error */
2511 goto fail;
2512 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002513 }
2514 }
2515
2516 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002517 /* Don't need to keep the reference to f_back, it will be set
2518 * when the generator is resumed. */
2519 Py_DECREF(f->f_back);
2520 f->f_back = NULL;
2521
2522 /* Create a new generator that owns the ready to run frame
2523 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002524 return gen_new(f);
2525 }
2526
2527 retval = eval_frame(f);
2528
2529 fail: /* Jump here from prelude on failure */
2530
2531 Py_DECREF(f);
2532 return retval;
2533}
2534
2535
Guido van Rossuma027efa1997-05-05 20:56:21 +00002536static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002537set_exc_info(PyThreadState *tstate,
2538 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002539{
2540 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002541 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002542
Guido van Rossuma027efa1997-05-05 20:56:21 +00002543 frame = tstate->frame;
2544 if (frame->f_exc_type == NULL) {
2545 /* This frame didn't catch an exception before */
2546 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002547 if (tstate->exc_type == NULL) {
2548 Py_INCREF(Py_None);
2549 tstate->exc_type = Py_None;
2550 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002551 tmp_type = frame->f_exc_type;
2552 tmp_value = frame->f_exc_value;
2553 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002554 Py_XINCREF(tstate->exc_type);
2555 Py_XINCREF(tstate->exc_value);
2556 Py_XINCREF(tstate->exc_traceback);
2557 frame->f_exc_type = tstate->exc_type;
2558 frame->f_exc_value = tstate->exc_value;
2559 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002560 Py_XDECREF(tmp_type);
2561 Py_XDECREF(tmp_value);
2562 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002563 }
2564 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002565 tmp_type = tstate->exc_type;
2566 tmp_value = tstate->exc_value;
2567 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002568 Py_XINCREF(type);
2569 Py_XINCREF(value);
2570 Py_XINCREF(tb);
2571 tstate->exc_type = type;
2572 tstate->exc_value = value;
2573 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002574 Py_XDECREF(tmp_type);
2575 Py_XDECREF(tmp_value);
2576 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 /* For b/w compatibility */
2578 PySys_SetObject("exc_type", type);
2579 PySys_SetObject("exc_value", value);
2580 PySys_SetObject("exc_traceback", tb);
2581}
2582
2583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002584reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002585{
2586 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002587 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002588 frame = tstate->frame;
2589 if (frame->f_exc_type != NULL) {
2590 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002591 tmp_type = tstate->exc_type;
2592 tmp_value = tstate->exc_value;
2593 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594 Py_XINCREF(frame->f_exc_type);
2595 Py_XINCREF(frame->f_exc_value);
2596 Py_XINCREF(frame->f_exc_traceback);
2597 tstate->exc_type = frame->f_exc_type;
2598 tstate->exc_value = frame->f_exc_value;
2599 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002600 Py_XDECREF(tmp_type);
2601 Py_XDECREF(tmp_value);
2602 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002603 /* For b/w compatibility */
2604 PySys_SetObject("exc_type", frame->f_exc_type);
2605 PySys_SetObject("exc_value", frame->f_exc_value);
2606 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2607 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002608 tmp_type = frame->f_exc_type;
2609 tmp_value = frame->f_exc_value;
2610 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 frame->f_exc_type = NULL;
2612 frame->f_exc_value = NULL;
2613 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002614 Py_XDECREF(tmp_type);
2615 Py_XDECREF(tmp_value);
2616 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617}
2618
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002619/* Logic for the raise statement (too complicated for inlining).
2620 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002621static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002622do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002623{
Guido van Rossumd295f121998-04-09 21:39:57 +00002624 if (type == NULL) {
2625 /* Reraise */
2626 PyThreadState *tstate = PyThreadState_Get();
2627 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2628 value = tstate->exc_value;
2629 tb = tstate->exc_traceback;
2630 Py_XINCREF(type);
2631 Py_XINCREF(value);
2632 Py_XINCREF(tb);
2633 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002634
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002635 /* We support the following forms of raise:
2636 raise <class>, <classinstance>
2637 raise <class>, <argument tuple>
2638 raise <class>, None
2639 raise <class>, <argument>
2640 raise <classinstance>, None
2641 raise <string>, <object>
2642 raise <string>, None
2643
2644 An omitted second argument is the same as None.
2645
2646 In addition, raise <tuple>, <anything> is the same as
2647 raising the tuple's first item (and it better have one!);
2648 this rule is applied recursively.
2649
2650 Finally, an optional third argument can be supplied, which
2651 gives the traceback to be substituted (useful when
2652 re-raising an exception after examining it). */
2653
2654 /* First, check the traceback argument, replacing None with
2655 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002656 if (tb == Py_None) {
2657 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002658 tb = NULL;
2659 }
2660 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002662 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002663 goto raise_error;
2664 }
2665
2666 /* Next, replace a missing value with None */
2667 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002668 value = Py_None;
2669 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002670 }
2671
2672 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2674 PyObject *tmp = type;
2675 type = PyTuple_GET_ITEM(type, 0);
2676 Py_INCREF(type);
2677 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002678 }
2679
Barry Warsaw4249f541997-08-22 21:26:19 +00002680 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002682
2683 else if (PyClass_Check(type))
2684 PyErr_NormalizeException(&type, &value, &tb);
2685
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002687 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002688 if (value != Py_None) {
2689 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002690 "instance exception may not have a separate value");
2691 goto raise_error;
2692 }
2693 else {
2694 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002696 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002697 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2698 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002699 }
2700 }
2701 else {
2702 /* Not something you can raise. You get an exception
2703 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002704 PyErr_Format(PyExc_TypeError,
2705 "exceptions must be strings, classes, or "
2706 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002707 goto raise_error;
2708 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002710 if (tb == NULL)
2711 return WHY_EXCEPTION;
2712 else
2713 return WHY_RERAISE;
2714 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 Py_XDECREF(value);
2716 Py_XDECREF(type);
2717 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002718 return WHY_EXCEPTION;
2719}
2720
Tim Petersd6d010b2001-06-21 02:49:55 +00002721/* Iterate v argcnt times and store the results on the stack (via decreasing
2722 sp). Return 1 for success, 0 if error. */
2723
Barry Warsawe42b18f1997-08-25 22:13:04 +00002724static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002725unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002726{
Tim Petersd6d010b2001-06-21 02:49:55 +00002727 int i = 0;
2728 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002729 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002730
Tim Petersd6d010b2001-06-21 02:49:55 +00002731 assert(v != NULL);
2732
2733 it = PyObject_GetIter(v);
2734 if (it == NULL)
2735 goto Error;
2736
2737 for (; i < argcnt; i++) {
2738 w = PyIter_Next(it);
2739 if (w == NULL) {
2740 /* Iterator done, via error or exhaustion. */
2741 if (!PyErr_Occurred()) {
2742 PyErr_Format(PyExc_ValueError,
2743 "need more than %d value%s to unpack",
2744 i, i == 1 ? "" : "s");
2745 }
2746 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002747 }
2748 *--sp = w;
2749 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002750
2751 /* We better have exhausted the iterator now. */
2752 w = PyIter_Next(it);
2753 if (w == NULL) {
2754 if (PyErr_Occurred())
2755 goto Error;
2756 Py_DECREF(it);
2757 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002758 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002759 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002760 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002761Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002762 for (; i > 0; i--, sp++)
2763 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002764 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002765 return 0;
2766}
2767
2768
Guido van Rossum96a42c81992-01-12 02:29:51 +00002769#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002770static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002771prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002773 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 if (PyObject_Print(v, stdout, 0) != 0)
2775 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002776 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002777 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002779#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002781static void
Fred Drake5755ce62001-06-27 19:19:46 +00002782call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002783{
Guido van Rossumb209a111997-04-29 18:18:01 +00002784 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002785 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002786 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002787 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002788 value = Py_None;
2789 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002790 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002792 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002793 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002794 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002795 }
Fred Drake5755ce62001-06-27 19:19:46 +00002796 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002798 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002800 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 Py_XDECREF(type);
2802 Py_XDECREF(value);
2803 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002804 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002805}
2806
2807static int
Fred Drake5755ce62001-06-27 19:19:46 +00002808call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2809 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002810{
Fred Drake5755ce62001-06-27 19:19:46 +00002811 register PyThreadState *tstate = frame->f_tstate;
2812 int result;
2813 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002814 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002815 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002816 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002817 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002818 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2819 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002820 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002821 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002822}
2823
Fred Drake5755ce62001-06-27 19:19:46 +00002824void
2825PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002826{
Fred Drake5755ce62001-06-27 19:19:46 +00002827 PyThreadState *tstate = PyThreadState_Get();
2828 PyObject *temp = tstate->c_profileobj;
2829 Py_XINCREF(arg);
2830 tstate->c_profilefunc = NULL;
2831 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002832 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002833 Py_XDECREF(temp);
2834 tstate->c_profilefunc = func;
2835 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002836 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002837}
2838
2839void
2840PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2841{
2842 PyThreadState *tstate = PyThreadState_Get();
2843 PyObject *temp = tstate->c_traceobj;
2844 Py_XINCREF(arg);
2845 tstate->c_tracefunc = NULL;
2846 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002847 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002848 Py_XDECREF(temp);
2849 tstate->c_tracefunc = func;
2850 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002851 tstate->use_tracing = ((func != NULL)
2852 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002853}
2854
Guido van Rossumb209a111997-04-29 18:18:01 +00002855PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002856PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002857{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002858 PyThreadState *tstate = PyThreadState_Get();
2859 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002860 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002861 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002862 else
2863 return current_frame->f_builtins;
2864}
2865
Guido van Rossumb209a111997-04-29 18:18:01 +00002866PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002867PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002868{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002869 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002870 if (current_frame == NULL)
2871 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002872 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002873 return current_frame->f_locals;
2874}
2875
Guido van Rossumb209a111997-04-29 18:18:01 +00002876PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002877PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002878{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002879 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 if (current_frame == NULL)
2881 return NULL;
2882 else
2883 return current_frame->f_globals;
2884}
2885
Guido van Rossumb209a111997-04-29 18:18:01 +00002886PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002887PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002888{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002889 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002890 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002891}
2892
Guido van Rossum6135a871995-01-09 17:53:26 +00002893int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002894PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002895{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002896 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002897 return current_frame == NULL ? 0 : current_frame->f_restricted;
2898}
2899
Guido van Rossumbe270261997-05-22 22:26:18 +00002900int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002901PyEval_GetNestedScopes(void)
2902{
2903 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2904 return current_frame == NULL ? 0 :
2905 current_frame->f_code->co_flags & CO_NESTED;
2906}
2907
2908int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002909Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910{
Guido van Rossumb209a111997-04-29 18:18:01 +00002911 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002912 if (f == NULL)
2913 return 0;
2914 if (!PyFile_SoftSpace(f, 0))
2915 return 0;
2916 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917}
2918
Guido van Rossum3f5da241990-12-20 15:06:42 +00002919
Guido van Rossum681d79a1995-07-18 14:51:37 +00002920/* External interface to call any callable object.
2921 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002922
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002923#undef PyEval_CallObject
2924/* for backward compatibility: export this interface */
2925
Guido van Rossumb209a111997-04-29 18:18:01 +00002926PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002928{
Guido van Rossumb209a111997-04-29 18:18:01 +00002929 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002930}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002931#define PyEval_CallObject(func,arg) \
2932 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002933
Guido van Rossumb209a111997-04-29 18:18:01 +00002934PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002936{
Jeremy Hylton52820442001-01-03 23:52:36 +00002937 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002938
2939 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002940 arg = PyTuple_New(0);
2941 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002942 PyErr_SetString(PyExc_TypeError,
2943 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002944 return NULL;
2945 }
2946 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002947 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002948
Guido van Rossumb209a111997-04-29 18:18:01 +00002949 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002950 PyErr_SetString(PyExc_TypeError,
2951 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002952 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002953 return NULL;
2954 }
2955
Jeremy Hylton52820442001-01-03 23:52:36 +00002956 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002957 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002958 return result;
2959}
2960
2961/* How often is each kind of object called? The answer depends on the
2962 program. An instrumented call_object() was used to run the Python
2963 regression test suite. The results were:
2964 4200000 PyCFunctions
2965 390000 fast_function() calls
2966 94000 other functions
2967 480000 all functions (sum of prev two)
2968 150000 methods
2969 100000 classes
2970
2971 Tests on other bodies of code show that PyCFunctions are still
2972 most common, but not by such a large margin.
2973*/
2974
Jeremy Hylton512a2372001-04-11 13:52:29 +00002975static char *
2976get_func_name(PyObject *func)
2977{
2978 if (PyMethod_Check(func))
2979 return get_func_name(PyMethod_GET_FUNCTION(func));
2980 else if (PyFunction_Check(func))
2981 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2982 else if (PyCFunction_Check(func))
2983 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2984 else if (PyClass_Check(func))
2985 return PyString_AsString(((PyClassObject*)func)->cl_name);
2986 else if (PyInstance_Check(func)) {
2987 return PyString_AsString(
2988 ((PyInstanceObject*)func)->in_class->cl_name);
2989 } else {
2990 return func->ob_type->tp_name;
2991 }
2992}
2993
2994static char *
2995get_func_desc(PyObject *func)
2996{
2997 if (PyMethod_Check(func))
2998 return "()";
2999 else if (PyFunction_Check(func))
3000 return "()";
3001 else if (PyCFunction_Check(func))
3002 return "()";
3003 else if (PyClass_Check(func))
3004 return " constructor";
3005 else if (PyInstance_Check(func)) {
3006 return " instance";
3007 } else {
3008 return " object";
3009 }
3010}
3011
Jeremy Hylton52820442001-01-03 23:52:36 +00003012static PyObject *
3013call_object(PyObject *func, PyObject *arg, PyObject *kw)
3014{
3015 ternaryfunc call;
3016 PyObject *result;
3017
3018 if (PyMethod_Check(func))
3019 result = call_method(func, arg, kw);
3020 else if (PyFunction_Check(func))
3021 result = call_eval_code2(func, arg, kw);
3022 else if (PyCFunction_Check(func))
3023 result = call_cfunction(func, arg, kw);
3024 else if (PyClass_Check(func))
3025 result = PyInstance_New(func, arg, kw);
3026 else if (PyInstance_Check(func))
3027 result = call_instance(func, arg, kw);
3028 else if ((call = func->ob_type->tp_call) != NULL)
3029 result = (*call)(func, arg, kw);
3030 else {
Tim Peters239508c2001-06-16 00:09:28 +00003031 PyErr_Format(PyExc_TypeError,
3032 "object of type '%.100s' is not callable",
3033 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003034 return NULL;
3035 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003036 if (result == NULL && !PyErr_Occurred())
3037 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003038 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003039
Guido van Rossume59214e1994-08-30 08:01:59 +00003040 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003041}
3042
Guido van Rossumb209a111997-04-29 18:18:01 +00003043static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003044call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003045{
Jeremy Hylton52820442001-01-03 23:52:36 +00003046 PyCFunctionObject* f = (PyCFunctionObject*)func;
3047 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3048 PyObject *self = PyCFunction_GET_SELF(func);
3049 int flags = PyCFunction_GET_FLAGS(func);
3050
Jeremy Hylton52820442001-01-03 23:52:36 +00003051 if (flags & METH_KEYWORDS) {
3052 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003054 if (kw != NULL && PyDict_Size(kw) != 0) {
3055 PyErr_Format(PyExc_TypeError,
3056 "%.200s() takes no keyword arguments",
3057 f->m_ml->ml_name);
3058 return NULL;
3059 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003060 if (flags & METH_VARARGS) {
3061 return (*meth)(self, arg);
3062 }
3063 if (!(flags & METH_VARARGS)) {
3064 /* the really old style */
3065 int size = PyTuple_GET_SIZE(arg);
3066 if (size == 1)
3067 arg = PyTuple_GET_ITEM(arg, 0);
3068 else if (size == 0)
3069 arg = NULL;
3070 return (*meth)(self, arg);
3071 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003072 /* should never get here ??? */
3073 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 return NULL;
3075}
3076
Guido van Rossumb209a111997-04-29 18:18:01 +00003077static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003078call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079{
Jeremy Hylton52820442001-01-03 23:52:36 +00003080 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3081 if (call == NULL) {
3082 PyInstanceObject *inst = (PyInstanceObject*) func;
3083 PyErr_Clear();
3084 PyErr_Format(PyExc_AttributeError,
3085 "%.200s instance has no __call__ method",
3086 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003087 return NULL;
3088 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003089 res = call_object(call, arg, kw);
3090 Py_DECREF(call);
3091 return res;
3092}
3093
3094static PyObject *
3095call_method(PyObject *func, PyObject *arg, PyObject *kw)
3096{
3097 PyObject *self = PyMethod_GET_SELF(func);
3098 PyObject *class = PyMethod_GET_CLASS(func);
3099 PyObject *result;
3100
3101 func = PyMethod_GET_FUNCTION(func);
3102 if (self == NULL) {
3103 /* Unbound methods must be called with an instance of
3104 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003105 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003106 if (PyTuple_Size(arg) >= 1)
3107 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003108 if (self == NULL)
3109 ok = 0;
3110 else {
3111 ok = PyObject_IsInstance(self, class);
3112 if (ok < 0)
3113 return NULL;
3114 }
3115 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003116 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003117 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003118 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003119 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003120 return NULL;
3121 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003122 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003123 }
3124 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003125 int argcount = PyTuple_Size(arg);
3126 PyObject *newarg = PyTuple_New(argcount + 1);
3127 int i;
3128 if (newarg == NULL)
3129 return NULL;
3130 Py_INCREF(self);
3131 PyTuple_SET_ITEM(newarg, 0, self);
3132 for (i = 0; i < argcount; i++) {
3133 PyObject *v = PyTuple_GET_ITEM(arg, i);
3134 Py_XINCREF(v);
3135 PyTuple_SET_ITEM(newarg, i+1, v);
3136 }
3137 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003139 result = call_object(func, arg, kw);
3140 Py_DECREF(arg);
3141 return result;
3142}
3143
3144static PyObject *
3145call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3146{
3147 PyObject *result;
3148 PyObject *argdefs;
3149 PyObject **d, **k;
3150 int nk, nd;
3151
3152 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003153 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3154 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3155 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003156 }
3157 else {
3158 d = NULL;
3159 nd = 0;
3160 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003161
Guido van Rossum681d79a1995-07-18 14:51:37 +00003162 if (kw != NULL) {
3163 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003164 nk = PyDict_Size(kw);
3165 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003166 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003167 PyErr_NoMemory();
3168 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003169 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003170 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003171 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003172 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003173 i += 2;
3174 nk = i/2;
3175 /* XXX This is broken if the caller deletes dict items! */
3176 }
3177 else {
3178 k = NULL;
3179 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003180 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003181
Guido van Rossum681d79a1995-07-18 14:51:37 +00003182 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003183 (PyCodeObject *)PyFunction_GET_CODE(func),
3184 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003185 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003186 k, nk, d, nd,
3187 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003188
Guido van Rossumb18618d2000-05-03 23:44:39 +00003189 if (k != NULL)
3190 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003191
Guido van Rossum681d79a1995-07-18 14:51:37 +00003192 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193}
3194
Jeremy Hylton52820442001-01-03 23:52:36 +00003195#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3196
3197/* The two fast_xxx() functions optimize calls for which no argument
3198 tuple is necessary; the objects are passed directly from the stack.
3199 fast_cfunction() is called for METH_OLDARGS functions.
3200 fast_function() is for functions with no special argument handling.
3201*/
3202
3203static PyObject *
3204fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3205{
3206 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3207 PyObject *self = PyCFunction_GET_SELF(func);
3208
3209 if (na == 0)
3210 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003211 else if (na == 1) {
3212 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003213 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003214 Py_DECREF(arg);
3215 return result;
3216 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003217 PyObject *args = load_args(pp_stack, na);
3218 PyObject *result = (*meth)(self, args);
3219 Py_DECREF(args);
3220 return result;
3221 }
3222}
3223
3224static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003225fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003226{
3227 PyObject *co = PyFunction_GET_CODE(func);
3228 PyObject *globals = PyFunction_GET_GLOBALS(func);
3229 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003230 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003231 PyObject **d = NULL;
3232 int nd = 0;
3233
3234 if (argdefs != NULL) {
3235 d = &PyTuple_GET_ITEM(argdefs, 0);
3236 nd = ((PyTupleObject *)argdefs)->ob_size;
3237 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003238 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003239 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003240 (*pp_stack)-2*nk, nk, d, nd,
3241 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003242}
3243
3244static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003245update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3246 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003247{
3248 PyObject *kwdict = NULL;
3249 if (orig_kwdict == NULL)
3250 kwdict = PyDict_New();
3251 else {
3252 kwdict = PyDict_Copy(orig_kwdict);
3253 Py_DECREF(orig_kwdict);
3254 }
3255 if (kwdict == NULL)
3256 return NULL;
3257 while (--nk >= 0) {
3258 int err;
3259 PyObject *value = EXT_POP(*pp_stack);
3260 PyObject *key = EXT_POP(*pp_stack);
3261 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003262 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003263 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003264 "for keyword argument '%.200s'",
3265 get_func_name(func),
3266 get_func_desc(func),
3267 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003268 Py_DECREF(key);
3269 Py_DECREF(value);
3270 Py_DECREF(kwdict);
3271 return NULL;
3272 }
3273 err = PyDict_SetItem(kwdict, key, value);
3274 Py_DECREF(key);
3275 Py_DECREF(value);
3276 if (err) {
3277 Py_DECREF(kwdict);
3278 return NULL;
3279 }
3280 }
3281 return kwdict;
3282}
3283
3284static PyObject *
3285update_star_args(int nstack, int nstar, PyObject *stararg,
3286 PyObject ***pp_stack)
3287{
3288 PyObject *callargs, *w;
3289
3290 callargs = PyTuple_New(nstack + nstar);
3291 if (callargs == NULL) {
3292 return NULL;
3293 }
3294 if (nstar) {
3295 int i;
3296 for (i = 0; i < nstar; i++) {
3297 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3298 Py_INCREF(a);
3299 PyTuple_SET_ITEM(callargs, nstack + i, a);
3300 }
3301 }
3302 while (--nstack >= 0) {
3303 w = EXT_POP(*pp_stack);
3304 PyTuple_SET_ITEM(callargs, nstack, w);
3305 }
3306 return callargs;
3307}
3308
3309static PyObject *
3310load_args(PyObject ***pp_stack, int na)
3311{
3312 PyObject *args = PyTuple_New(na);
3313 PyObject *w;
3314
3315 if (args == NULL)
3316 return NULL;
3317 while (--na >= 0) {
3318 w = EXT_POP(*pp_stack);
3319 PyTuple_SET_ITEM(args, na, w);
3320 }
3321 return args;
3322}
3323
3324static PyObject *
3325do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3326{
3327 PyObject *callargs = NULL;
3328 PyObject *kwdict = NULL;
3329 PyObject *result = NULL;
3330
3331 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003332 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003333 if (kwdict == NULL)
3334 goto call_fail;
3335 }
3336 callargs = load_args(pp_stack, na);
3337 if (callargs == NULL)
3338 goto call_fail;
3339 result = call_object(func, callargs, kwdict);
3340 call_fail:
3341 Py_XDECREF(callargs);
3342 Py_XDECREF(kwdict);
3343 return result;
3344}
3345
3346static PyObject *
3347ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3348{
3349 int nstar = 0;
3350 PyObject *callargs = NULL;
3351 PyObject *stararg = NULL;
3352 PyObject *kwdict = NULL;
3353 PyObject *result = NULL;
3354
3355 if (flags & CALL_FLAG_KW) {
3356 kwdict = EXT_POP(*pp_stack);
3357 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003358 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003359 "%s%s argument after ** "
3360 "must be a dictionary",
3361 get_func_name(func),
3362 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003363 goto ext_call_fail;
3364 }
3365 }
3366 if (flags & CALL_FLAG_VAR) {
3367 stararg = EXT_POP(*pp_stack);
3368 if (!PyTuple_Check(stararg)) {
3369 PyObject *t = NULL;
3370 t = PySequence_Tuple(stararg);
3371 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003372 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3373 PyErr_Format(PyExc_TypeError,
3374 "%s%s argument after * "
3375 "must be a sequence",
3376 get_func_name(func),
3377 get_func_desc(func));
3378 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003379 goto ext_call_fail;
3380 }
3381 Py_DECREF(stararg);
3382 stararg = t;
3383 }
3384 nstar = PyTuple_GET_SIZE(stararg);
3385 }
3386 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003387 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003388 if (kwdict == NULL)
3389 goto ext_call_fail;
3390 }
3391 callargs = update_star_args(na, nstar, stararg, pp_stack);
3392 if (callargs == NULL)
3393 goto ext_call_fail;
3394 result = call_object(func, callargs, kwdict);
3395 ext_call_fail:
3396 Py_XDECREF(callargs);
3397 Py_XDECREF(kwdict);
3398 Py_XDECREF(stararg);
3399 return result;
3400}
3401
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003402#define SLICE_ERROR_MSG \
3403 "standard sequence type does not support step size other than one"
3404
Guido van Rossumb209a111997-04-29 18:18:01 +00003405static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003406loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407{
Guido van Rossumb209a111997-04-29 18:18:01 +00003408 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003409 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003410 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003411 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 return NULL;
3413 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003414 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003415 v = (*sq->sq_item)(v, i);
3416 if (v)
3417 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003418 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003419 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003420 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421}
3422
Guido van Rossum20c6add2000-05-08 14:06:50 +00003423/* Extract a slice index from a PyInt or PyLong, the index is bound to
3424 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3425 and error. Returns 1 on success.*/
3426
3427int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003428_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429{
3430 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003431 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003432 if (PyInt_Check(v)) {
3433 x = PyInt_AsLong(v);
3434 } else if (PyLong_Check(v)) {
3435 x = PyLong_AsLong(v);
3436 if (x==-1 && PyErr_Occurred()) {
3437 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003438 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003439
Guido van Rossumac7be682001-01-17 15:42:30 +00003440 if (!PyErr_ExceptionMatches(
3441 PyExc_OverflowError)) {
3442 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003443 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003444 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003445 }
3446
Guido van Rossumac7be682001-01-17 15:42:30 +00003447 /* Clear the OverflowError */
3448 PyErr_Clear();
3449
3450 /* It's an overflow error, so we need to
3451 check the sign of the long integer,
3452 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003453 the error. */
3454
3455 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003456 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003457 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003458
3459 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003460 cmp = PyObject_RichCompareBool(v, long_zero,
3461 Py_GT);
3462 Py_DECREF(long_zero);
3463 if (cmp < 0)
3464 return 0;
3465 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003466 x = INT_MAX;
3467 else
3468 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003469 }
3470 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003471 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003472 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003473 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003475 /* Truncate -- very long indices are truncated anyway */
3476 if (x > INT_MAX)
3477 x = INT_MAX;
3478 else if (x < -INT_MAX)
3479 x = 0;
3480 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003482 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003483}
3484
Guido van Rossumb209a111997-04-29 18:18:01 +00003485static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003486apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003487{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003488 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003489 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003491 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003492 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003493 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003495
3496static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003497assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3498 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003500 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003501 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003502 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003503 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003504 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003505 if (x == NULL)
3506 return PySequence_DelSlice(u, ilow, ihigh);
3507 else
3508 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509}
3510
Guido van Rossumb209a111997-04-29 18:18:01 +00003511static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003512cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003513{
Guido van Rossumac7be682001-01-17 15:42:30 +00003514 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003516 case IS:
3517 case IS_NOT:
3518 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003519 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003520 res = !res;
3521 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522 case IN:
3523 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003524 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003525 if (res < 0)
3526 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003527 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003528 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529 break;
3530 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003531 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 break;
3533 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003534 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003535 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003536 v = res ? Py_True : Py_False;
3537 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538 return v;
3539}
3540
Thomas Wouters52152252000-08-17 22:55:00 +00003541static PyObject *
3542import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003543{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003544 PyObject *x;
3545
3546 x = PyObject_GetAttr(v, name);
3547 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003548 PyErr_Format(PyExc_ImportError,
3549 "cannot import name %.230s",
3550 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003551 }
Thomas Wouters52152252000-08-17 22:55:00 +00003552 return x;
3553}
Guido van Rossumac7be682001-01-17 15:42:30 +00003554
Thomas Wouters52152252000-08-17 22:55:00 +00003555static int
3556import_all_from(PyObject *locals, PyObject *v)
3557{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003558 PyObject *all = PyObject_GetAttrString(v, "__all__");
3559 PyObject *dict, *name, *value;
3560 int skip_leading_underscores = 0;
3561 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003562
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003563 if (all == NULL) {
3564 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3565 return -1; /* Unexpected error */
3566 PyErr_Clear();
3567 dict = PyObject_GetAttrString(v, "__dict__");
3568 if (dict == NULL) {
3569 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3570 return -1;
3571 PyErr_SetString(PyExc_ImportError,
3572 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003573 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003574 }
3575 all = PyMapping_Keys(dict);
3576 Py_DECREF(dict);
3577 if (all == NULL)
3578 return -1;
3579 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003580 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003581
3582 for (pos = 0, err = 0; ; pos++) {
3583 name = PySequence_GetItem(all, pos);
3584 if (name == NULL) {
3585 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3586 err = -1;
3587 else
3588 PyErr_Clear();
3589 break;
3590 }
3591 if (skip_leading_underscores &&
3592 PyString_Check(name) &&
3593 PyString_AS_STRING(name)[0] == '_')
3594 {
3595 Py_DECREF(name);
3596 continue;
3597 }
3598 value = PyObject_GetAttr(v, name);
3599 if (value == NULL)
3600 err = -1;
3601 else
3602 err = PyDict_SetItem(locals, name, value);
3603 Py_DECREF(name);
3604 Py_XDECREF(value);
3605 if (err != 0)
3606 break;
3607 }
3608 Py_DECREF(all);
3609 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003610}
3611
Guido van Rossumb209a111997-04-29 18:18:01 +00003612static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003613build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003614{
Guido van Rossumcd649651997-08-22 16:56:16 +00003615 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003616 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003617 PyErr_SetString(PyExc_SystemError,
3618 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003619 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003620 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003621 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003622 PyErr_SetString(PyExc_SystemError,
3623 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003624 return NULL;
3625 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003626 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003627 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003628 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003629 return NULL;
3630 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003631 n = PyTuple_Size(bases);
3632 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003633 PyObject *base = PyTuple_GET_ITEM(bases, i);
3634 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003635 /* Call the base's *type*, if it is callable.
3636 This code is a hook for Donald Beaudry's
3637 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003638 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003639 since its types are not callable.
3640 Ditto: call the bases's *class*, if it has
3641 one. This makes the same thing possible
3642 without writing C code. A true meta-object
3643 protocol! */
3644 PyObject *basetype = (PyObject *)base->ob_type;
3645 PyObject *callable = NULL;
3646 if (PyCallable_Check(basetype))
3647 callable = basetype;
3648 else
3649 callable = PyObject_GetAttrString(
3650 base, "__class__");
3651 if (callable) {
3652 PyObject *args;
3653 PyObject *newclass = NULL;
3654 args = Py_BuildValue(
3655 "(OOO)", name, bases, methods);
3656 if (args != NULL) {
3657 newclass = PyEval_CallObject(
3658 callable, args);
3659 Py_DECREF(args);
3660 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003661 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003662 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003663 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003664 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003665 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003666 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003667 "base is not a class object");
3668 return NULL;
3669 }
3670 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003671 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003672}
3673
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003674static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003675exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3676 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003677{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003678 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003679 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003680 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003681
Guido van Rossumb209a111997-04-29 18:18:01 +00003682 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3683 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003684 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003685 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003686 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003687 locals = PyTuple_GetItem(prog, 2);
3688 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003689 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003690 if (globals == Py_None) {
3691 globals = PyEval_GetGlobals();
3692 if (locals == Py_None) {
3693 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003694 plain = 1;
3695 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003696 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003697 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003698 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003699 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003700 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003701 !PyCode_Check(prog) &&
3702 !PyFile_Check(prog)) {
3703 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003704 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003705 return -1;
3706 }
Fred Drake661ea262000-10-24 19:57:45 +00003707 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003708 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003709 "exec: arg 2 must be a dictionary or None");
3710 return -1;
3711 }
3712 if (!PyDict_Check(locals)) {
3713 PyErr_SetString(PyExc_TypeError,
3714 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003715 return -1;
3716 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003717 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003718 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003719 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003720 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003721 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003722 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003723 FILE *fp = PyFile_AsFile(prog);
3724 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003725 if (PyEval_GetNestedScopes()) {
3726 PyCompilerFlags cf;
3727 cf.cf_nested_scopes = 1;
3728 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3729 locals, &cf);
3730 } else {
3731 v = PyRun_File(fp, name, Py_file_input, globals,
3732 locals);
3733 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003734 }
3735 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003736 char *str;
3737 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003738 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003739 if (PyEval_GetNestedScopes()) {
3740 PyCompilerFlags cf;
3741 cf.cf_nested_scopes = 1;
3742 v = PyRun_StringFlags(str, Py_file_input, globals,
3743 locals, &cf);
3744 } else
3745 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003746 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003747 if (plain)
3748 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003749 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003750 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003751 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003752 return 0;
3753}
Guido van Rossum24c13741995-02-14 09:42:43 +00003754
Guido van Rossumac7be682001-01-17 15:42:30 +00003755static void
Paul Prescode68140d2000-08-30 20:25:01 +00003756format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3757{
3758 char *obj_str;
3759
3760 if (!obj)
3761 return;
3762
3763 obj_str = PyString_AsString(obj);
3764 if (!obj_str)
3765 return;
3766
3767 PyErr_Format(exc, format_str, obj_str);
3768}
Guido van Rossum950361c1997-01-24 13:49:28 +00003769
3770#ifdef DYNAMIC_EXECUTION_PROFILE
3771
3772PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003773getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003774{
3775 int i;
3776 PyObject *l = PyList_New(256);
3777 if (l == NULL) return NULL;
3778 for (i = 0; i < 256; i++) {
3779 PyObject *x = PyInt_FromLong(a[i]);
3780 if (x == NULL) {
3781 Py_DECREF(l);
3782 return NULL;
3783 }
3784 PyList_SetItem(l, i, x);
3785 }
3786 for (i = 0; i < 256; i++)
3787 a[i] = 0;
3788 return l;
3789}
3790
3791PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003792_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003793{
3794#ifndef DXPAIRS
3795 return getarray(dxp);
3796#else
3797 int i;
3798 PyObject *l = PyList_New(257);
3799 if (l == NULL) return NULL;
3800 for (i = 0; i < 257; i++) {
3801 PyObject *x = getarray(dxpairs[i]);
3802 if (x == NULL) {
3803 Py_DECREF(l);
3804 return NULL;
3805 }
3806 PyList_SetItem(l, i, x);
3807 }
3808 return l;
3809#endif
3810}
3811
3812#endif